Hier ist ein Algorithmus, der einen Radius gegeben r > 0
und eine Annäherung konstant c > 0
, entweder gibt einen Kreis mit dem Radius (1+c) r
mindestens k
Punkte oder erklärt umschließt, dass es keinen Kreis mit dem Radius ist r
streng mindestens k
Punkte umschließt. Die Laufzeit ist O(n (1 + k^-1 c^-2 log c^-1))
, die, wenn sie in Verbindung mit der binären Suche verwendet wird, um eine ausreichend grobe Schätzung zu erhalten, schneller als tmyklebus Algorithmus sein sollte. (Um die Suche zu initialisieren, ist es möglich, in der Zeit O(n^2)
eine 2
-Anpassung für r
zu erhalten, indem über die Punkte Looping und lief Quick den k
th engsten anderen Punkt zu finden.)
Partition die Punkte für Punkt platzieren (x, y)
in einem quadratischer Behälter mit der Bezeichnung (floor(x/(2r)), floor(y/(2r)))
. Jeder Kreis des Radius r
hat einen Innenraum, der höchstens vier Behälter überlappt. Wenn es einen Kreis mit dem Radius r
gibt, der mindestens k
Punkte enthält, dann gibt es i, j
, so dass die Fächer (i, j), (i, j+1), (i+1, j), (i+1, j+1)
zusammen mindestens k
Punkte halten.
Für jedes dieser Teilprobleme platzieren Sie jeden beteiligten Punkt (x, y)
in einem kleineren quadratischen Fach, (floor(x/w), floor(y/w))
, wobei w = cr/(3sqrt(1/2))
eine ausreichend kleine Breite ist. Bereiten Sie jetzt eine O(c^-1)
by O(c^-1)
Matrix vor, in der jeder Eintrag angibt, wie viele Punkte in der entsprechenden Bin enthalten sind. Diese Matrix wird in zwei Dimensionen mit einer Null-Eins-Matrix gewandelt, die die vollständig in einem Radius enthaltenen Kisten anzeigt. Letztere Matrix aussehen könnte
01110
11111
11111
11111
01110.
Jetzt wissen wir, für jedes Zentrum auf dem Gitter eine Zahl, die r
durch, wie viele Punkte ein Kreis mit dem Radius lowerbounded ist enthalten und upperbounded würde, um wie viele Punkte ein Kreis mit dem Radius (1+c) r
würde enthalten.
Dies ist nicht wirklich eine Programmierfrage, würde besser passen auf https://cs.stackexchange.com/. – kebs
Sie müssen sich durch diesen einen brutalen Weg durchkämpfen. Wenn, sagen wir, n == 100 und k == 3, müssen Sie nur durch jede Kombination von 3 Punkten gehen, um diejenige zu finden, die den kleinsten Kreis hat. Sie können einige Kombinationen schnell eliminieren, indem Sie prüfen, ob der Abstand zwischen zwei Punkten größer ist als der kleinste bisher gefundene Durchmesser. –
Diese Frage scheint off-topic zu sein, weil es um das Design von Algorithmen geht und nicht um die Implementierung. Es wurde [in Informatik veröffentlicht] (http://cs.stackexchange.com/questions/31960/minimal-covering-circle) wo es direkt am Thema ist. – Gilles