Optimizar un algoritmo cuadrático por diseño en WhatChord

Fuentes: Optimizing an Algorithm That’s Quadratic by Design

WhatChord es una aplicación que escucha las notas tocadas en un teclado MIDI y nombra el acorde en tiempo real. Bajo el capó, el motor no consulta un diccionario: genera todas las interpretaciones plausibles de la digitación (lo que en música se llama voicing), asigna una puntuación a cada candidata y las ordena como haría un músico. El artículo se centra en la última etapa, la clasificación, que según un banco de pruebas reproducible absorbe cerca del 99 % del tiempo en un fallo de caché.

El reto es que el comparador del motor no es transitivo. Además de la puntuación, dos tipos de reglas musicales pueden alterar el orden: las reglas duras, que imponen un nombre concreto aunque su puntuación sea menor (por ejemplo, preferir un dominante alterado antes que una reescritura con barra de disminución), y los desempates, que solo actúan cuando dos candidatas están separadas por una ventana de 0,20 puntos. Esa combinación genera ciclos y obliga a sustituir el ordenamiento clásico por una linearización que construye una matriz completa de comparaciones por parejas, con un coste cuadrático O(n²).

El número de candidatas crece con rapidez: una tríada de Do mayor produce 25; un acorde de cuatro notas, entre 43 y 48; uno denso de siete notas, 131. El corpus de pruebas adversariales alcanza una mediana de 75 candidatas y picos de 143, lo que dispara las llamadas al comparador. La optimización explicada consiste en calcular previamente, para cada candidata, una máscara de bits que indica a cuáles de las 21 reglas duras puede acogerse; al comparar dos candidatas se cruzan ambas máscaras con un AND y solo se evalúan las reglas compartidas. El resultado es idéntico al anterior porque una regla descartada por la puerta habría devuelto null de todos modos.