En informática , el algoritmo Hunt–Szymanski , [1] [2] también conocido como algoritmo Hunt–McIlroy , es una solución al problema de la subsecuencia común más larga . Fue uno de los primeros algoritmos no heurísticos utilizados en diff , que compara un par de archivos, cada uno representado como una secuencia de líneas. Hasta el día de hoy, se encuentran variaciones de este algoritmo en sistemas de control de versiones incrementales , motores wiki y software de investigación de filogenética molecular .
La complejidad del peor caso para este algoritmo es O ( n 2 log n ) , pero en la práctica se espera que O ( n log n ) sea igual a O ( n log n ) . [3] [4]
El algoritmo fue propuesto por Harold S. Stone como una generalización de un caso especial resuelto por Thomas G. Szymanski. [5] [6] [7] James W. Hunt refinó la idea, implementó la primera versión del algoritmo de listado de candidatos utilizado por diff y lo incorporó a un marco más antiguo de Douglas McIlroy . [5]
La descripción del algoritmo apareció como un informe técnico de Hunt y McIlroy en 1976. [5] Al año siguiente, una variante del algoritmo fue finalmente publicada en un artículo conjunto de Hunt y Szymanski. [5] [8]
El algoritmo Hunt–Szymanski es una modificación de una solución básica para el problema de la subsecuencia común más larga que tiene una complejidad O ( n 2 ) . La solución se modifica de modo que los requisitos de tiempo y espacio para el algoritmo sean menores cuando funciona con entradas típicas.
Sea A i el i- ésimo elemento de la primera secuencia.
Sea B j el j- ésimo elemento de la segunda secuencia.
Sea P ij la longitud de la subsecuencia común más larga para los primeros i elementos de A y los primeros j elementos de B.
Consideremos las secuencias A y B.
A contiene tres elementos:
B contiene tres elementos:
En el diagrama se muestran los pasos que realizaría el algoritmo anterior para determinar la longitud de la subsecuencia común más larga de ambas secuencias. El algoritmo informa correctamente que la subsecuencia común más larga de las dos secuencias tiene una longitud de dos elementos.
El algoritmo anterior tiene complejidades temporales y espaciales de peor caso de O ( mn ) ( ver notación O grande ), donde m es el número de elementos en la secuencia A y n es el número de elementos en la secuencia B. El algoritmo Hunt–Szymanski modifica este algoritmo para tener una complejidad temporal de peor caso de O ( mn log m ) y una complejidad espacial de O ( mn ) , aunque regularmente supera al peor caso con entradas típicas.
El algoritmo Hunt–Szymanski sólo considera lo que los autores llaman coincidencias esenciales, o k -candidatos. Los k -candidatos son pares de índices ( i , j ) tales que:
El segundo punto implica dos propiedades de los k -candidatos:
Para crear la subsecuencia común más larga a partir de una colección de k candidatos, se crea una cuadrícula con el contenido de cada secuencia en cada eje. Los k candidatos se marcan en la cuadrícula. Se puede crear una subsecuencia común uniendo las coordenadas marcadas de la cuadrícula de modo que cualquier aumento en i esté acompañado por un aumento en j .
Esto se ilustra en el diagrama adyacente.
Los puntos negros representan candidatos que deberían ser considerados por el algoritmo simple y las líneas negras son conexiones que crean subsecuencias comunes de longitud 3.
Los puntos rojos representan k candidatos que son considerados por el algoritmo de Hunt–Szymanski y la línea roja es la conexión que crea una subsecuencia común de longitud 3.