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