最小サークルカバレッジ
与えられた\(N- \)あなたはすべてのポイントをカバーできる最小の円の面積を求めて2次元平面上の点、。
一般的なものは、増分法の時間の複雑さと空間の複雑さがどちらも\(O(n)\)であるというアルゴリズムです。
\(C_i \)を使用して、最初の\(i \)点によって形成される最小の円を表します。
- すべてのポイントをランダムに並べ替えます。
- ポイントを順番に追加し、\(i_ {th} \)ポイントを追加するたびに操作3に進みます。
- 現在の点\(i \)が既に円\(C_ {i-1} \)の内側にある場合、\(C_i = C_ {i-1} \)、操作2を入力します。それ以外の場合は操作4を入力します。
- \(i \)を円の中心として固定し、\(j(1 \ leq j <i)\)が\(C_i \)の外にあるかどうかを毎回調べます。外にある場合は、\(i、j \)を直径として使用します円を作ります。操作5に進みます。
- 列挙点\(k \)が\(C_i \)の外の\(k \)を満たすかどうか、満たす場合、\(i、j、k \)を円の境界として円を作成します
上記のアルゴリズムは最初のステップに基づいており、順序はランダムである必要があります。そうでない場合、複雑度は\(O(n ^ 3)\)ほど高くなります。
上記の方法は、実際には木の直径を計算するアルゴリズムに非常に似ていると思います。
木の直径:木の最も遠い2点間の距離。
- ルートノードをランダムに見つけて、ルートとして設定します。
- rootから最も離れた点\(i \)を検索します。つまり、\(i = arg \ max _j dis(j、root)\)です。
- \(i \)から、最も遠い点\(k \)を検索します。つまり、\(k = arg \ max_j dis(j、i)\)です。
- 直径は\(dis(i、k)\)です。