は平面上の点の集合です。ランダム点 X ∉ Sは、同一平面上に与えられます。タスクは、すべてのソートすることである Y ∈ Sとの間のユークリッド距離で X及び Y。
無脳のアプローチは、間の距離を計算することでとYのすべてのためのy ∈ S、その後ソートそれらがどの高速アルゴリズムを使用します。
を保存または前処理して、ソート処理を高速化する方法はありますか?
は平面上の点の集合です。ランダム点 X ∉ Sは、同一平面上に与えられます。タスクは、すべてのソートすることである Y ∈ Sとの間のユークリッド距離で X及び Y。
無脳のアプローチは、間の距離を計算することでとYのすべてのためのy ∈ S、その後ソートそれらがどの高速アルゴリズムを使用します。
を保存または前処理して、ソート処理を高速化する方法はありますか?
回答:
解決策1:点のペア間の垂直二等分線を見つけ、これらの線の配置を作成します。配列にはΘ (n 4)セルがあり、そのセル内ではソートされた順序は一定です。そのため、配置のポイント位置データ構造を構築し、各セルを、そのセル内のポイントに対して返されるソート順で装飾します。隣接するセル間の並べ替え順序は単一の転置でのみ異なるため、永続的なデータ構造を使用して、これらの並べ替え順序の表現でスペースを共有できます。合計スペースはO (n 4)で、クエリ時間はOです。
解決策2:これらの同じ垂直二等分線ののランダムサンプルを選択し、配置を構築し、2つのサンプリングされた線の各交差を通る垂直線セグメントで各配置セルを分割します。結果のパーティションにはΘ (n 2)セルがあり、各セルにはO (n )非サンプリング二等分線が交差する可能性が高くなります。セル内の一部のxから見たポイントの有効な並べ替え順序でパーティションの各セルを装飾します。合計スペースはO (n 3)です。
ここで、クエリを実行するには、パーティション内のクエリポイントを見つけ、パーティションセルに格納されている順序を検索し、この格納された順序で始まるLevcopoulos&Petersson(1989)のデカルトツリー比較ソートアルゴリズムを使用します。このステップの時間は、に比例します。ここで、k iは、点y iとの順序が乱れている点の数です。しかし、∑ ∑ i O (1 + log k i)は O (n )(各サンプリングされていない二等分線は、最大で1つの順序の異なる点のペアを引き起こす)であるため、クエリ時間もです。
おそらく、時間をスライスする方法から逃れることはできないでしょう。すべての可能な並べ替え順序に対応する事前計算領域でさえ、O (n !)領域をもたらす可能性があります(したがって、意味のある検索手法で「your」領域を見つけるには、O (log (n !))= O (n log (n ))時間。(編集:これは絶対に間違っています。詳細については、David Eppsteinの優れた回答を参照してください!)一方、複雑さを軽減する1つの便利な方法-特に、一度にフルソートを行う必要はないが、kをランダムに取り出す必要がある場合番目の最近傍その場で-高次ボロノイ図によるかもしれません:標準ボロノイセルの拡張そのk近傍検索、上収容最近傍が、第二最寄りなどのフランク・デヌの紙だけでなく、のhttp://people.scs .carleton.ca /〜dehne / publications / 2-02.pdfは標準的な参照のようです。http://www.dehne.carleton.ca/publicationsにある彼のホームページには、Voronoiダイアグラムに関する他の多くの論文があります。