对字符串进行排序,使相邻字符串之间的汉明距离较小

时间:2011-12-28 13:22:33

标签: algorithm sorting hamming-distance

问题:

我有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)

关于这个问题的想法

我有一种不好的感觉,这是一个非常重要的问题。如果我们将每个字符串视为一个节点并将其他字符串的距离视为边缘,那么我们就会看到一个旅行商问题。大量的字符串意味着预先计算所有成对距离可能是不可行的,我认为将问题转化为更像Canadian Traveller Problem的问题。

目前我的解决方案是使用VP tree找到问题的贪婪最近邻类型解决方案

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

但初步结果似乎很差。散列字符串使更多类似的字符串更接近可能是另一种选择,但我对这将提供的解决方案有多好或者它将如何扩展到这种大小的数据知之甚少。

2 个答案:

答案 0 :(得分:2)

即使你认为这个问题类似于旅行商问题(TSP),我相信汉明距离将遵循三角不等式(汉明(A,B)+汉明(B,C)≤汉明(A,C) )),所以你只是真正处理ΔTSP(公制旅行商问题),其中有许多算法可以给出理想结果的良好近似值。特别是,Christofides algorithm将始终为您提供最小可能长度的1.5倍的路径。

答案 1 :(得分:1)

是的,这是Traveling salesman problem, 但我不知道十几个节目中是否有任何一个 TSP source code library 可以通过插件指标直接获得1M点。

可能的两阶段方法:

1)将1M点分成50个簇 用一个 Nearest neighbor search。 在50个集群中心进行TSP。

2)将所有1M - 50点放在最近的2个中心之间; 在每个1M / 50的字符串上执行TSP。 这里“50”可以是100或1000。 如果1000太大,则递归:将1000分成30个簇,每个约30个。

K-means可以聚集1M点, 但我再也不知道插件指标的快速实现。 但是请看 scikit-learn clustering

要找到N个点的质心, 一个最小化中心 - 所有其他|, 你可以afaik击败O(N ^ 2)只 充分利用sqrt(N)的随机样本 - 应该足够好。 (或谷歌/询问关于快速近似质心的单独问题)。

首先打包数据以保存整个流程中的内存访问。 在这种情况下,将b c编码为00 01 10 (每对之间的汉明距离= 1): 2000 x 2位= 500字节。 Fwiw,发现min Hammingdist(4k位,10k x 4k)在我的mac ppc上需要大约40毫秒。