クローゼット ペア アルゴリズムの n log^2 n 時間から n log n 時間に移行する方法を理解しようとしています。以下の部分を取得します(http://www.cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.htmlから)
- セットを行 l で 2 つの等しいサイズの部分に分割し、各部分の最小距離を再帰的に計算します。
- d を 2 つの最小距離の最小値とします。
- l から d より遠くにある点を削除する
- 残りのポイントを y 座標に従って並べ替えます
- 残りの点を y 順にスキャンし、各点から 5 つの近傍点までの距離を計算します。
- これらの距離のいずれかが d 未満の場合、d を更新します。
ステップ 4 は、O(n log n) 時間かかるソートであり、他のすべてのステップを支配します。これは、アルゴリズム全体が O(n log n) 時間を達成するために O(n) に減らす必要があるものです。 . そして、これは私が理解するのに苦労している部分です。著者が提案する
ステップ 1: セットを ... に分割し、各部分の距離を再帰的に計算し、各セットのポイントを y 座標でソートされた順序で返します。ステップ 4: 2 つのソート済みリストを O(n) 時間で 1 つのソート済みリストにマージします。
O(n log n) 時間かかる再帰ステップで、y 座標でポイントを並べ替える必要があります。どうすればこれを回避できますか? マージは O(n) ですが、まだどこかでソートする必要があります。