Проблема:
У меня есть N (~ 100k-1m) строк, каждая длиной в D (например, 2000) и с низким алфавитом (например, 3 возможных символа). Я хотел бы отсортировать эти строки так, чтобы между смежными строками было как можно меньше изменений (например, расстояние Хэмминга мало). Решение не должно быть наилучшим, но чем ближе, тем лучше.
Пример
* * 1010
Мысли о проблеме
У меня плохое предчувствие, что это нетривиальная проблема. Если мы рассматриваем каждую строку как узел, а расстояния до других строк как ребро, то мы смотрим на проблему коммивояжера. Большое количество строк означает, что предварительный расчет всех парных расстояний потенциально невозможен, я думаю, что превращение проблемы в нечто большее, например Canadian Traveller Problem .
В настоящее время мое решение заключается в использовании дерева VP , чтобы найти жадное решение типа ближайшего соседа для задачи
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
но первоначальные результаты кажутся плохими. Хэширование строк так, чтобы более похожие были ближе, может быть другим вариантом, но я мало знаю о том, насколько хорошим будет это решение или насколько хорошо оно будет масштабироваться до данных такого размера.