最も近いペアのアルゴリズムを理解しようとしています。セットを半分に分割することについて理解しています。しかし、最も近いペアを再帰的に計算する方法を理解するのに苦労しています。再帰は理解できますが、再帰によって最も近いペアを計算する方法がわかりません。(1,2)(1,11)(7,8)がある場合、再帰はこれらに対してどのように機能しますか?
4 に答える
アルゴリズムの基本的な考え方はこれです。
一連の点 P があり、それらの間の距離が最も短い P 内の 2 つの点を見つけたいとします。
単純な力ずくのアプローチでは、P のすべてのペアを調べて距離を計算し、距離が最も短いペアを 1 つ取得します。これは O(n²) アルゴリズムです。
ただし、あなたが話しているアルゴリズムによって改善することは可能です。アイデアは、最初に座標の 1 つ (x 座標など) に従ってすべてのポイントを並べ替えることです。これで、セット P は実際には、x 座標で並べ替えられた点の並べ替えられたリストになります。アルゴリズムは、ポイントのセットではなく、ソートされたポイントのリストを入力として受け取ります。アルゴリズムを ClosestPair(L) と呼びましょう。ここで、L は引数として与えられたポイントのリストです。
ClosestPair(L) は、次のように再帰的に実装されるようになりました。
- リスト L を中央で分割し、 L leftと L rightを取得します。
- ClosestPair(L left ) と ClosestPair(L right ) を再帰的に解きます。対応する最短距離を δ leftおよび δ rightによって取得します。
- これで、元のセット (L で表される) の最短距離は、2 つの δ のいずれか、または L left内の点と L right内の点の間の距離であることがわかります。
- 左と右のサブディビジョンからの 2 点間の距離が短いかどうかを確認する必要があります。トリックは、距離が δ leftおよび δ rightよりも小さくなければならないことがわかっているため、分割線 (x 座標元のリストを分割していました L)。この最適化により、実際には O(n log n) のブルート フォース アプローチよりも手順が高速になります。
このアルゴリズムを意味する場合は、次のようにします。
- ソートポイント: (1,2) (1,11) (7,8)
- (1,2) (1,11) と (7,8) の 2 つのサブセットを作成します。
- (1,2) (1,11) と (7,8) で別々にアルゴリズムを実行します <= ここで再帰が行われます。結果は dLmin = 9 および dRmin = 無限大 (右側に 2 番目の点はありません)
- dLRmin = sqrt(45)
- 結果 = 分 (dLmin、dRmin、dLRmin) = sqrt(45)
再帰は、上記と同じ手順で構成されます。たとえば、(1,2) と (1,11) の呼び出しは次のようになります。
- ソートポイント: (1,2) (1,11)
- (1,2) と (1,11) の 2 つのサブセットを作成します。
- (1,2) と (1,11) で別々にアルゴリズムを実行します <= 再帰呼び出し。結果は、dLmin = 無限大および dRmin = 無限大です。
- dLRmin = 9
- 結果 = 分 (dLmin、dRmin、dLRmin) = 9
私はあなたが話しているアルゴリズムを知っていると思います。ここで自分で詳しく説明することもできますが、アルゴリズムの紹介に記載されている説明は、私が作成できるものよりもはるかに優れています. そして、その章はグーグルブックスでも利用できます:楽しむ。(他の誰もがそこに問題の説明を見つけることができます)
おそらく、線形時間のランダム化された最近接ペアアルゴリズムが役立つでしょう。そこで、予想時間 O(n) でペアを見つけることができます。