問題:
私は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
しかし、最初の結果は悪いようです。文字列をハッシュして、より類似したものを近づけることも別のオプションかもしれませんが、これがどの程度優れたソリューションを提供するか、またはこのサイズのデータにどれだけうまくスケーリングするかについてはほとんど知りません.