ここに2つのアイデアがあります:O(n)近似アルゴリズムとO(n ^ 2 log n)正確な(非近似)アルゴリズム:
高速近似
局所性鋭敏型ハッシュを使用します。基本的に、各ポイントを、近くのすべてのポイントを含むハッシュバケットにハッシュします。バケットは、衝突が近くのポイント間でのみ発生するように設定されています。同様の名前のハッシュテーブルとは異なり、ここでは衝突が役立ちます。バケット内の衝突の数の実行カウントを保持し、次にそのバケットの中心を円の中心として使用します。
これは、最初に聞いたときにあまり明白ではない概念の簡単な説明であることを認めます。例えは、多くの人々に彼らの郵便番号が何であるかを尋ね、最も一般的な郵便番号を使用して最も人口の多い円を決定することです。完璧ではありませんが、高速なヒューリスティックです。
これは基本的にポイント数の点で線形時間であり、データセットをその場で更新して、ポイントごとに一定の時間で新しい回答を段階的に取得できます(n =ポイント数に関して一定)。
一般的な局所性鋭敏型ハッシュについて、またはこの場合に機能する私の個人的なお気に入りのバージョンについての詳細。
ブルートフォースよりも優れた決定論的アプローチ
アイデアは次のとおりです。各ポイントについて、そのポイントに円のエッジを配置し、円をスイープして、どの方向に最も多くのポイントが含まれているかを確認します。すべてのポイントに対してこれを行うと、グローバル最大値が見つかります。
点pの周りのスイープは、次の方法でn log n時間で実行できます。(a)円を角度シータに配置したときにqが含まれるように、他の点qごとの角度間隔を見つける。(b)線形時間でpの周りを行進/スイープできるように、間隔を並べ替えます。
したがって、固定点pに接触する最適な円を見つけるにはO(n log n)の時間がかかり、次にそれをO(n)で乗算して、すべての点のチェックを実行します。合計時間はO(n ^ 2 log n)です。