Die folgende Übung wurde an von mir betreute Schüler verteilt:
Entwickeln Sie bei Punkten in der Ebene einen Algorithmus, der ein Punktpaar findet, dessen Abstand zwischen allen Punktpaaren minimal ist. Der Algorithmus sollte in der Zeit laufen .
Es gibt einen (relativ) einfachen Divide and Conquer-Algorithmus, der die Aufgabe in der Zeit löst .
Frage 1 : Gibt es einen Algorithmus, der das gegebene Problem genau im ungünstigsten Fall löst ?
Was mich vermuten ließ, dass dies möglich sein könnte, ist ein Ergebnis, das ich in einem Vortrag gesehen habe (Referenz geschätzt). Es wurde etwas in der Richtung angegeben, dass nicht mehr als eine konstante Anzahl von Punkten in der Ebene um einen Punkt innerhalb eines Kreises mit dem Radius , wobei der minimale Abstand zwischen zwei der beteiligten Punkte ist . Ich denke, , die Punkte bilden ein gleichseitiges Sechseck mit in der Mitte (im Extremfall).
In diesem Fall sollte der folgende Algorithmus das Problem in Schritten lösen .
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
Beachten Sie, dass dies in linearer Zeit geschieht (angeblich), da nur eine konstante Anzahl von Punkten in r
nicht weiter entfernt sein kann als m
von p
(unter der Annahme der obigen Aussage); Nur diese Punkte müssen untersucht werden, um ein neues Minimum zu finden. Es gibt natürlich einen Haken; Wie implementieren Sie nextNeighbour
(möglicherweise mit Vorverarbeitung in linearer Zeit)?
Frage 2 : eine Reihe von Punkten Lassen und einen Punkt p ∉ R . Sei m ∈ R mit
und
.
Angenommen, ist endlich. Ist es möglich, mit minimalem Abstand von in (amortisierter) Zeit ? (Sie können davon ausgehen, dass konstruiert wird, indem Sie die untersuchten Punkte nacheinander hinzufügen .) p ' ∈ R p , m p O ( 1 ) R p
quelle
Antworten:
In Standardmodellen ist es unmöglich, das Problem in weniger als Zeit zu lösen , z. B. mithilfe algebraischer Entscheidungsbäume. Dies folgt aus der Arbeit von Yao und Ben-Or, die zeigt, dass es in diesem Modell nicht möglich ist, zu entscheiden, ob ein Satz von Eingangsnummern alle unterschiedlich ist oder nicht (siehe http://people.bath.ac.uk/masnnv /Teaching/AAlg11_8.pdf ). Stellen Sie sich bei Ihrem Problem vor, dass alle auf der realen Linie sind. Wenn zwei Punkte gleich sind, wäre Ihre Ausgabe zwei Punkte mit dem Abstand Null, andernfalls nicht. Eine Lösung für Ihr Problem würde also auch das Problem DISTINCT NUMBERS lösen. Wenn Sie annehmen möchten, dass alle Ihre Punkte unterschiedlich sind, fügen Sie einfach zumn i ϵ x i n ϵ 2 n ϵ Ω ( n log n )cnlogn n iϵ xi Eingaben des Problems DISTINCT NUMBERS. In diesem Fall sind die Zahlen nicht alle unterschiedlich, wenn Ihre Ausgabe höchstens ist. (Obwohl in diesem Fall müssen Sie ein Versprechen Version verwenden , wenn die Differenz von je zwei verschiedenen Zahlen zumindest , aber ich denke , der gleiche Beweis zeigen Werke , die Sie auch benötigen in diesem Fall.)nϵ 2nϵ Ω(nlogn)
quelle
Es gibt einen randomisierten linearen Algorithmus für die erwartete Zeit von Rabin; siehe zB Rabin wirft eine Münze auf Liptons Blog.
quelle
Soweit ich Frage 2 verstehe, liefert Rabins Algorithmus auch eine Art Antwort darauf. Bei jedem Zeitschritt ist die Datenstruktur ein Raster mit einer Zellenbreite, die kleiner ist als der kleinste Abstand zwischen den bisher gesehenen Punktpaaren, geteilt durch (sodass keine Zelle mehr als einen einzelnen Punkt enthält). Um die Abfrage in Frage 2 zu beantworten, müssen Sie nur einer Zelle im Raster zuordnen und eine konstante Anzahl von Zellen um sie herum betrachten. Wenn nach der Analyse des Algorithmus der eingestellte Eingabepunkt in zufälliger Reihenfolge untersucht wird, beträgt die amortisierte Aktualisierungszeit für das Gitter pro neuem Erwartungspunkt. pO(1)2–√ p O(1)
quelle