ハミング距離の下で近い値のすべてのペアを見つける


11

数百万の32ビット値があります。各値について、ハミング距離5内の他のすべての値を検索します。単純なアプローチでは、これにはO(N2)比較が必要です。

これらの32ビット値を整数として処理し、リストを1回並べ替えると、最下位ビットのみが異なる値が非常に近くなることに気付きました。これにより、正確なハミング距離の実際のペアごとの比較を実行できる、より短い「ウィンドウ」または数値の範囲を持つことができます。ただし、2つの値が上位ビットでのみ異なる場合、それらはこの「ウィンドウ」の外側になり、ソートされたリストの両端に表示されます。例えば

11010010101001110001111001010110

01010010101001110001111001010110

ハミング距離は1ですが、両方が回転しても2つの値の間のハミング距離は保持されるため、左に32回回転してからリストを毎回並べ替えると、2つの値になる可能性がありますそのうちの少なくとも1つで並べ替えられたリストで十分に近くなります。

  1. このアプローチは良い結果をもたらしていますが、このアプローチの正確性を正式に確立するのに苦労しています。

  2. ハミング距離がk以下の一致する値を探しているので、32ビットの回転をすべて行う必要が本当にあるのでしょうか?たとえば、k=1でウィンドウサイズが1000の場合、下位8ビットのいずれかに浮遊ビットが現れても、結果の数値は1000を超えて変わらないため、最大24ビット回転する必要があります。


20秒の思考からのアイデア:Grey-Codeによるソートはどうですか?32ビットのビットマップのリストを8ビットのビットマップの4つのリストに分割してから、テクニックを使用するのはどうですか?
カールダムガードアスムッセン

1
非常に多数のビットマップについてより正確に説明していただけますか?これは、近くにある2 30または何?220230
ミナール

@minar:このような32ビットビットマップは300万から400万個あります。
カルテルク

あなたが何を求めているのか分かりません。32文字のブール文字列の配列(大きいが4 × 10 9のすべての可能な文字列を含まない)があり、何らかの方法でハミング距離が最大5であるペアをマークしたいということですか?おそらく、各文字列iの近傍のインデックスのリンクリストを作成することによって?A[i]4×109A[i].closei
アンドラスサラモン

適用可能なハイパーキューブを除いて、「quadtrees」の同様の概念があると思います。アルゴリズムは、ハイパーキューブ内のベクトルを検索および再帰的に検索します。その後、「近くの」ビットベクトルを検索する場合は、「近くの」ハイパーキューブのみを検索します。それはどこかで研究されている可能性があり、どこかの論文で....正しい用語がわからない....
vzn

回答:


9

前述のように、2つのビットマップに等間隔の差がある場合、どの回転でも、いくつかの高位ビットに違いがあるため、アプローチには問題があります。

51/5064NN222

45529N4960N


追加情報:

  1. 51632
    (165)(325)0.0217
  2. 元のリストの各要素について、リストの構築は、拡張リストに入れられます。要素自体、すべての要素が1つの位置で異なり、すべての要素が2つの位置で異なります(元の要素に関する情報を保持します)。各要素のコピー数はこのリスト内の衝突(ソート後に検出)は、最大距離にある2つの元の要素に対応します。各ペアは数回検出される可能性があるため、重複を削除する必要があることに注意してください(ただし、これはすでに初期アルゴリズムの場合です)。41+32+(322)=529.4
  3. 最終パスでは、要素の拡張リストを整理して、元の要素から正確な距離ある要素のみを保持することが望ましいです。次に、元の要素ごとに、距離で要素を作成し、拡張リスト内でそれらを検索します。繰り返しますが、各ペアは回検出されるため、重複を削除する必要があります。[細心の注意を払って、おそらくほとんどの重複を予測/回避できますが、努力する価値があるかどうかはわかりません。] 3223 5(323)=49603(53)=10

最初のアプローチでは、ビットローテーションだけでなく、ビットマップを事前に決められた順序で並べ替えると言っていますか?1/50の確率をどのようにして得たのか説明してください。また、2番目のアプローチでは、最初にリストのインデックスを作成し、次にすべての要素に対してインデックスを作成する必要があります-(32C1 + 32C2)の組み合わせを生成し、このインデックスに対してチェックして、距離が異なるすべてのビットマップを識別しますか?これをさらに説明できれば素晴らしいと思います。ありがとう。
カルテルク

5

ミナールの答えは優れており、おそらくこの特定の問題に対する正しいアプローチです。ただし、もう1つの可能なアプローチについて説明します。

局所性依存ハッシュ関数(LSH)を使用できます。局所性に敏感なハッシュ関数は、がハミング距離に近い場合、ように設計されています。このようなハッシュがある場合は、すべての値をハッシュテーブルに保存し(ハッシュ関数とオープンハッシュを使用)、ハミング距離に近い値のすべてのペアを非常にすばやく見つけることができます。LSHを構築するためのさまざまな手法があります。このトピックのリファレンスを参照して、いくつかの候補を見つけてください。x y H x = H y H HHx,yH(x)=H(y)HH

とはいえ、あなたの特定の問題(あなたが言及した特定のパラメーター)について、minarの2つのアルゴリズムは、実際にはどのLSHベースのスキームよりも優れていることが証明されると思います。これは、他の読者が同様の問題でこの質問にここに来た場合にのみ言及しますが、LSHがより理にかなっている可能性のある異なるパラメータがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.