準線形クエリ時間を使用して、合計が


9

これが最近傍問題です。

実数(非常に大きいn!)にターゲットの実数pを加え、SUMがpに最も近いa iとa jを見つけます。当社は、合理的な前処理/インデックス許可1、... 、nは(最大Oを(N ログN ))が、(特定のクエリ時にP例えば、()、結果は非常に速く返されるべきO (ログn個)時間)。a1,…,annpaiajpa1,…,anO(nlog⁡n)pO(log⁡n)

(より単純な例:pに最も近いSINGLE だけが必要な場合は、1、… 、a nオフライン、O (n log n )をソートしてから、クエリ時にバイナリ検索を実行しますO (log n ))。aipa1,…,anO(nlog⁡n)O(log⁡n)

機能しないソリューション:

1)1、… 、a nをオフラインでソート、次にクエリ時に両端から開始して2つのポインターを内側に移動します(http://bit.ly/1eKHHDy)。O (n )クエリ時間のため、良くありません。a1,…,anO(n)

2)1、… 、a nをオフラインでソートしクエリ時に、各a iを取得して、 pに近いものに合計するのに役立つ「バディ」をバイナリ検索します。O (n log n )クエリ時間のため、良くありません。a1,…,anaipO(nlog⁡n)

3)すべてのペアオフラインで並べ替え、バイナリ検索を実行します。O (n 2)前処理のため、良くない。(a1,…,an)O(n2)

ありがとう!

ps。練習に必要なさらなる一般化:(1)およびpは50次元ベクトル、(2)「近い」はベクトル余弦距離、(3)k-最も近いペア-その合計、1だけではありません。a1,…,anpk


前処理時間や前処理後に使用できるスペースに制限はありますか?空間に制限されている場合、たとえばO (lg n )時間で解決できると信じる理由はありますか?それは私にはひどくありそうにないようです。O(n)O(lg⁡n)
— DW

前処理はO( log n)に制限されています。問題の説明を更新しました。nn
— ケビン

クエリが高速であると信じる理由は何もありませんが、最近傍(kdツリー、局所性に敏感なハッシュなど)の多くの有用な結果は、直感に反しているように思えます。局所性に敏感なハッシュを使用した近似解は、実用的には問題ありません。
— ケビン

回答:


17

これはほぼ確実に不可能です。

P(n)Q(n)nP(n)+n⋅Q(n)akai+aj−ak−ak

O(n2)Ω(n2)Ω(n2/polylogn)

したがって、予想が正しいと仮定すると、問題は(ほぼ)2次の前処理時間または(ほぼ)線形のクエリ時間を必要とします。


2

前処理中に無制限のスペースと無制限の時間を使用できる場合、次のソリューションが要件を満たします。

  • {ai+aj:1≤i≤j≤n}O(n2)O(n2)

  • ai,ajai+ajpO(lg⁡n)

このソリューションが受け入れられない場合は、要件をより注意深く検討し、それに応じて質問を編集する必要があります。


こんにちは、ありがとうございます!しかし、あなたの解決策は私の解決策#3と同じです。これはO(n ^ 2)の前処理時間のために問題があります。私の場合、nは非常に大きく(たとえば、1m)、O(n ^ 2)演算は避けなければなりません。
— ケビン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.