次の演習は、私が監督する学生に配布されています。
平面内のポイントが与えられた場合、すべてのポイントのペアの中で距離が最小になるポイントのペアを見つけるアルゴリズムを考案します。アルゴリズムは時間o (n 2)で実行する必要があります。
時間タスクを解決する(比較的)単純な分割統治アルゴリズムがあります。
質問1:最悪の場合に特定の問題を正確に解決するアルゴリズムはありますか?
これが可能なのではないかと私に思わせたのは、私がいくつかの講演で見たことを覚えている結果です(参考文献を歓迎します)。これはないより一定数よりその線に沿って何かを述べ点のいくつかの点の周囲面に配置することができるP半径の円の内側R ∈ Rと、R関与点のうちのいずれか2つの間の最小距離を。私はc = 7、中央にpを持つ正六角形を形成する点(極端な場合)と思います。
その場合、次のアルゴリズムはそれらの問題をステップで解決するはずです。
fun mindist [] | p::[] = INFINITY
| mindist p1::p1::[] = dist(P[0], P[1])
| mindist p::r = let m = mindist(r) in
min(m, nextNeighbour(p, r, m))
end
(上記のステートメントを想定して)から一定の数のポイントだけがr
遠くm
から離れることができないため、これは線形時間であると主張されていることに注意してくださいp
。新しい最小値を見つけるには、これらのポイントのみを調査する必要があります。もちろん、キャッチがあります。どのように実装しますかnextNeighbour
(線形時間で前処理を行う場合があります)?
質問2:ポイントのセットましょうと点P ∉ R。してみましょうメートル∈ Rと
そして
。
は有限であると仮定します。検索することが可能であるP ' ∈ RのP 、Mからの最小距離を有するP(償却)の時間O(1 )?(調査ポイントpを 1つずつ追加することにより、Rが構築されると想定できます。)