n ノードのグラフで各ノード間のハミング距離を計算しようとしています。このグラフの各ノードには同じ長さ (k) のラベルがあり、ラベルに使用されるアルファベットは {0, 1, *} です。「*」はドントケア記号として機能します。たとえば、ラベル 101*01 と 1001*1 の間のハミング距離は 1 です (これらは 3 番目のインデックスでのみ異なると言います)。
私がしなければならないことは、各ノードのハミング距離が 1 のすべての隣接ノードを見つけて、これら 2 つのラベルがどのインデックスで異なるかを正確に報告することです。
次のように、各ノードのラベルを他のすべてのラベルと文字ごとに比較しています。
// Given two strings s1, s2
// returns the index of the change if hd(s1,s2)=1, -1 otherwise.
int count = 0;
char c1, c2;
int index = -1;
for (int i = 0; i < k; i++)
{
// do not compute anything for *
c1 = s1.charAt(i);
if (c1 == '*')
continue;
c2 = s2.charAt(i);
if (c2 == '*')
continue;
if (c1 != c2)
{
index = i;
count++;
// if hamming distance is greater than 1, immediately stop
if (count > 1)
{
index = -1;
break;
}
}
}
return index;
数百万のノードがあるかもしれません。k は通常 50 前後です。私は Java を使用しています。この比較には n*n*k 時間がかかり、動作も遅くなります。試行と VP ツリーを使用することを検討しましたが、この場合にどのデータ構造が機能するかわかりませんでした。Simmetrics ライブラリも調べましたが、何も頭に浮かびませんでした。提案があれば本当に感謝します。