複数のアレイにわたる2つの数値間の最大平均距離


8

あなたが持っていると言うkサイズの配列Nから一意の値それぞれ含有1するがN

平均してお互いに最も離れている2つの数値をどのように見つけますか?

たとえば、次の配列があるとします。

[1,4,2,3]
[4,2,3,1]
[2,3,4,1]

最初の2つの配列では距離が2離れており、最後の配列では3つの数値が離れているため、答えはitem 12になります。

私はO(kN ^ 2)解を知っています(各k配列の数値の各ペア間の距離を測定することによって)が、より良い解決策はありますか?

このようなアルゴリズムをC ++で実装したいのですが、ソリューションの説明があれば役に立ちます。

回答:


3

数値にインデックスを付ける線形時間変換の後、この問題は、L1距離に関する一連のポイントの直径を計算することに要約されます。残念ながら、この問題は次元の呪いの影響を受けます。

与えられた

    1 2 3 4
1: [1,4,2,3]
2: [4,2,3,1]
3: [2,3,4,1]

私たちは計算します

    1 2 3
1: [1,4,4]
2: [3,2,1]
3: [4,3,2]
4: [2,1,3]

そして、その後の間のL1距離12である|1-3| + |4-2| + |4-1| = 8(問題点で)それらの平均距離倍です、k = 3

つまり、上記の入力をデータベースとして使用し、データベース内の各ポイントの画像をN+1-vクエリとして使用して、近似最近傍アルゴリズムを適用できます。


このリファレンスは、OPにとって興味深いと思われる線形ランタイムが予測されるランダム化アルゴリズムを示唆しています。
hilberts_drinking_problem

@hilberts_drinking_problem役立つかもしれませんが、低次元のみ。
David Eisenstat

これを別の回答で説明されているヒューリスティックなアプローチと組み合わせることが可能だと思いますか?
Magnus EF

@ MagnusE-Fそこには、おおよその最近傍アルゴリズムがたくさんあります。この問題をANNに軽減する方法に関する私の回答を修正しました。
David Eisenstat

1

最良のケースを提案ます。ヒューリスティックなアプローチに従うことができます。

たとえばN=4N-1=3は、が最大距離1になり、が最小になることを知っています。平均距離は10/6=1,66667 (配列内のペア間の距離の合計/配列内のペアの数)です。

次に、2つの数値がk/2配列の端にある場合(ほとんどの2場合)、1他のk/2配列の距離がちょうど離れていても、既に平均の上部(> = 距離)にあることがわかります。O(2k)=の最良の場合の解決策になる可能性がありますO(k)


それは良いアプローチのようです。私の場合、Nはkよりもはるかに大きく、ヒューリスティックアルゴリズムはうまく機能すると思います
Magnus EF

このアルゴリズムの最悪の場合はどうですか?まだO(k N ^ 2)ですか?
ジェロームリチャード

@JérômeRichardアルゴリズムを変更せずに、適切なシナリオにのみ適用されるヒューリスティックを追加しました。最悪の場合、メインのアルゴリズムがそれを解決します。
samthegolden
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.