问题:
我有 N (~100k-1m) 个字符串,每个 D(例如 2000)个字符长并且字母低(例如 3 个可能的字符)。我想对这些字符串进行排序,以使相邻字符串之间的变化尽可能少(例如汉明距离低)。解决方案不一定是最好的,但越接近越好。
例子
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)
关于问题的想法
我有一种不好的感觉,这是一个不小的问题。如果我们将每个字符串视为一个节点,将与其他字符串的距离视为一条边,那么我们正在研究一个旅行商问题。大量字符串意味着事先计算所有成对距离可能是不可行的,我认为将问题变成更像加拿大旅行者问题的问题。
目前我的解决方案是使用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
但初步结果似乎很差。散列字符串以使更多相似的字符串更接近可能是另一种选择,但我对这将提供一个多么好的解决方案或它将如何扩展到这种大小的数据知之甚少。