私は、接頭辞ツリーを使用して O(1) で単一の最近傍を見つけることができたと彼らが言及している論文を読んでいます。一般的な問題を説明し、次に古典的な解決策を説明し、最後に提案された解決策を論文で説明します。
問題: ビット ベクトル L (すべてのベクトルは同じ長さ) とクエリ ビット ベクトル q のリストが与えられた場合、q の最近傍を見つけたいとします。距離メトリックは、ハミング距離 (異なるビット数) です。単純なアプローチは、リストを調べて、リスト内の各ベクトルと q の間のハミング距離を計算することです。これには O(N) が必要です。ただし、非常に高価な数百万のビット ベクトルがあることを考えると、それを削減したいと考えています。
古典的な解決策: この問題に対する古典的な解決策は、近似を使用して最近傍を見つけ、O(logN) を達成することです。これを行う方法は、最初に L を辞書順に並べ替えて、同様のビット ベクトルが互いに近くなるようにすることです。次に、q が与えられると、ソートされたリストにバイナリ検索を適用して、ソートされたリスト内で q が存在する可能性のある位置を取得し、リスト内でその上と下にあるベクトルを取得して (それらはソートの点で類似しているため)、それらの間の距離を調べ、ハミング距離が最も小さいものを選択します。ただし、単純に 1 つの並べ替えを行うだけでは、多くの同様のベクトルを見逃す可能性があるため、できるだけ多くの同様のベクトルをカバーするために、P 個のリストと P 個のジャンブリング関数を使用します。各ジャンブリング関数は、各リストに対応しています。次に、対応するジャンブリング関数でビットをジャンブリングした後、各ビット ベクトルを P の各リストに挿入します。したがって、それぞれがビット ベクトルを持ちますが、ビットの順序が異なる P 個のリストになります。P の各リストを辞書順に並べ替えます。q が与えられると、P の各リストに同じ二分探索を適用しますが、ここでは、アクセスしているリストに応じて q にジャンブリング関数を適用する前に適用します。このステップでは、q に最も類似した P 個のベクトルを取得するため、最終的に q に最も類似したベクトルを取得します。このようにして、できるだけ類似したベクトルをカバーします。ソートに必要な時間を無視すると、最近傍を見つけるのに必要な時間は O(log n) になります。これは、各リストでの二分探索の時間です。P の各リストを辞書順に並べ替えます。q が与えられると、P の各リストに同じ二分探索を適用しますが、ここでは、アクセスしているリストに応じて q にジャンブリング関数を適用する前に適用します。このステップでは、q に最も類似した P 個のベクトルを取得するため、最終的に q に最も類似したベクトルを取得します。このようにして、できるだけ類似したベクトルをカバーします。ソートに必要な時間を無視すると、最近傍を見つけるのに必要な時間は O(log n) になります。これは、各リストでの二分探索の時間です。P の各リストを辞書順に並べ替えます。q が与えられた場合、P の各リストに同じ二分探索を適用しますが、ここでは、アクセスしているリストに応じて q にジャンブリング関数を適用する前に適用します。このステップでは、q に最も類似した P 個のベクトルを取得するため、最終的に q に最も類似したベクトルを取得します。このようにして、できるだけ類似したベクトルをカバーします。ソートに必要な時間を無視すると、最近傍を見つけるのに必要な時間は O(log n) になります。これは、各リストでの二分探索の時間です。このようにして、できるだけ類似したベクトルをカバーします。ソートに必要な時間を無視すると、最近傍を見つけるのに必要な時間は O(log n) になります。これは、各リストでの二分探索の時間です。このようにして、できるだけ類似したベクトルをカバーします。ソートに必要な時間を無視すると、最近傍を見つけるのに必要な時間は O(log n) になります。これは、各リストでの二分探索の時間です。
提案された解決策: 論文で提案されているこのソリューション (ただし、説明はありません) は、プレフィックス ツリーを使用して O(1) 時間で最近傍を取得できることを示しています。論文では、P 個のプレフィックス ツリーと P 個のジャンブリング関数を使用すると述べています。ここで、各ジャンブリング関数は各ツリーに対応しています。次に、対応するジャンブリング関数で各ベクトルのビットをジャンブリングした後、ビット ベクトルを各ツリーに挿入します。q が与えられると、各ツリーに対応する q にジャンピング関数を適用し、各ツリーから q に最も類似したベクトルを取得します。これで、ツリーから取得された P ビットのベクトルが得られます。論文では、プレフィックスツリーから q に最も類似したベクトルを取得するだけで O(1) であると述べています。プレフィックスツリーの検索はO(M)であることがわかっているので、これはまったくわかりません.Mはビットベクトルの長さです。
これは私が参照している論文です (セクション 3.3.2): リアルタイム Web でのコンテンツベースの群集検索
http://students.cse.tamu.edu/kykamath/papers/cikm2012/fp105-kamath.pdf
また、これに関連する私の他の質問に答えていただければ幸いです: NN検索のプレフィックスツリーで最も類似したビットベクトルを検索する方法は?