Problema:cadenas de clasificación de manera que la distancia de Hamming es baja entre las cuerdas adyacentes
tengo N (~ 100k-1m) cuerdas cada D (por ejemplo, 2000) caracteres de longitud y con un alfabeto baja (por ejemplo 3 caracteres posibles) Me gustaría ordenar estas cadenas de manera que haya tan pocos cambios posibles entre cadenas adyacentes (por ejemplo, la distancia cortada es baja). La solución no tiene que ser lo mejor posible, pero cuanto más cerca, mejor.
Ejemplo
N=4
D=5
//initial strings
1. aaacb
2. bacba
3. acacb
4. cbcba
//sorted so that hamming distance between adjacent strings is low
1. aaacb
3. acacb (Hamming distance 1->3 = 1)
4. cbcba (Hamming distance 3->4 = 4)
2. bacba (Hamming distance 4->2 = 2)
Pensamientos sobre el problema
que tienen una mala sensación de que esto es un problema no trivial. Si pensamos en cada cadena como un nodo y las distancias a otras cadenas como una ventaja, entonces estamos viendo un problema de vendedor ambulante. La gran cantidad de cadenas significa que el cálculo de todas las distancias por pares de antemano es potencialmente inviable, creo que convertir el problema en algo más como el Canadian Traveller Problem.
Por el momento mi solución ha sido utilizar un VP tree para encontrar una solución tipo codicioso vecino más cercano al problema
curr_string = a randomly chosen string from full set
while(tree not empty)
found_string = find nearest string in tree
tree.remove(found_string)
sorted_list.add(curr_string)
curr_string = found_string
pero los resultados iniciales parecen ser pobre. Las cadenas hash para que otras más similares estén más cerca pueden ser otra opción, pero sé muy poco acerca de qué tan buena será la solución que esto proporcionará o qué tan bien se escalará a datos de este tamaño.