これは、先ほど就職面接で尋ねられた質問です。そして、私はまだ賢明な答えを理解することができません。
質問:
ポイントのセット(x、y)が与えられます。最も遠い2つのポイントを見つけます。互いに遠い。
たとえば、ポイントの場合:(0,0)、(1,1)、(-8、5)-最も離れているのは、(1,1)と(-8,5)です。 (0,0)-(1,1)と(0,0)-(-8,5)の両方。
明らかなアプローチは、すべてのポイント間のすべての距離を計算し、最大値を見つけることです。問題は、それがO(n ^ 2)であるため、大規模なデータセットでは非常に高価になることです。
最初に境界上にある追跡ポイントを使用して、「内部」よりも境界上のポイントが少ないことを前提に距離を計算するアプローチがありますが、依然として高価であり、最悪のシナリオでは失敗します。
ウェブを検索しようとしましたが、賢明な答えは見つかりませんでした-これは単に検索スキルの不足かもしれません。
編集:1つの方法は、凸包を見つけることです http://en.wikipedia.org/wiki/Convex_hull ポイントのセットの2つの遠いポイントは、この頂点です。
おそらくここで答えました: 互いに最も離れた2つのポイントを見つけるアルゴリズム
また:
境界点アルゴリズムは豊富です(凸包アルゴリズムを探してください)。そこから、最も遠い反対側のポイントを見つけるのにO(N)時間かかります。
著者のコメントから:最初に船体上の反対のポイントのペアを見つけてから、半ロックステップの方法でその周りを歩きます。エッジ間の角度に応じて、どちらかの歩行者を前進させる必要がありますが、船体を周回するには常にO(N)が必要です。
すべてのポイントの平均を見つけ、すべてのポイントと平均の差を測定し、平均から最大距離のポイントを取り、それから最も遠いポイントを見つけます。これらのポイントは、凸包の絶対コーナーと2つの最も遠いポイントになります。最近、ランダムに方向付けられた無限平面に限定された凸包を必要とするプロジェクトでこれを行いました。うまくいきました。
この質問は、「アルゴリズムの概要」で紹介されています。 1)凸包O(NlgN)を計算します。 2)Convex HullにM vectexがある場合。次に、最も遠いペアを見つけるためにO(M)が必要です。
この役立つリンクを見つけました。アルゴリズムの詳細とプログラムの分析が含まれます。 http://www.seas.gwu.edu/~simhaweb/alg/lectures/module1/module1.html
これが役に立てば幸いです。
ポイントのセットの直径を計算するアルゴリズムを探していますDiam(S)。これは、Sの凸包の直径と同じであることを示すことができますDiam(S)= Diam(CH(S))。したがって、最初にセットの凸包を計算します。
次に、凸包上のすべての対anti点を見つけて、最大距離のペアを選択する必要があります。凸多角形にはO(n)対pod点があります。したがって、これは、最も遠い点を見つけるためのO(n lg n)アルゴリズムを提供します。
この技法は、Rotating Calipersとして知られています。これは、マルセロカントスが答えで説明していることです。
アルゴリズムを慎重に記述すると、角度を計算せずに実行できます。詳細については、これを確認してください [〜#〜] url [〜#〜] 。
最も遠いペアを見つける確率的アルゴリズムは
「数回」を事前に決定する限り、O(n)にありますが、実際に最も遠いペアを見つけることは保証されません。しかし、ポイントのセットによっては、結果はかなり良い=)
出発点は、調査された最近点問題を調べることです。ウィキペディアにはいくつかのオプションがリストされています。
ポイントがデカルト座標で与えられている場合、これは簡単に思えます。とても簡単なので、私は何かを見落としていると確信しています。私が見逃しているものを指摘してください!
ほんのいくつかの考え:
ポイントのセットの凸包を定義するポイントのみを見て、数を減らしますが、それでも少し「最適ではない」ように見えます。
それ以外の場合は、ポイントセット間の距離を迅速に制限し、データの大部分を排除するための再帰的なクワッド/オクトツリーアプローチがあります。