Suche nächstgelegenen Punkt in einer effizienten Art und Weise
Habe ich einen Punkt in der 2d Ebene zum Beispiel (x0,y0) und eine Menge von n Punkten (x1,y1)...(xn,yn) und ich möchte nächstgelegene Punkt (x0,y0) in einer Weise, die besser ist, als zu versuchen, alle Punkte. Alle Lösungen?
Sollte ich auch sagen, dass meine Punkte sind auf diese Art sortiert:
bool less(point a,point b){
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}
- Ist x0 und y0 das erste element in das sortierte Liste der Punkte?
- Nein. Es ist komplett aus der Liste 😀
- Ist der Punkt willkürlich? Ändert es? Das heißt, wird Sie später finden wollen, den nächsten Punkt zu einem anderen Punkt?
- Ich kann Abfragen möchten für viele verschiedene Punkte
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung eines quad-trees für 2D
http://en.wikipedia.org/wiki/Quadtree
Voronoi-Diagramm ist speziell für die Suche nach nächsten Punkt sehr schnell. Obwohl es durchaus ein Schmerz zu implementieren, finden Sie möglicherweise einige vorhandene Bibliothek/Umsetzung.
Es ist auch eine option, um immer wieder die Aufteilung der Ebene in Quadrate, also eine Art Baum, wo jeder nicht-Blatt-Knoten hat 4 Kinder (oben rechts, Quadrat, unten-rechts, Quadrat, etc.). Dann, vier Plätze, die Sie finden, die Ihren Punkt an und fahren Sie mit es rekursiv. Oft ergibt sich der Punkt nahe genug, so können Sie beseitigen die Notwendigkeit zu prüfen anderen Plätzen.
Aber es ist einfach, erstellen Sie ein "Gegenbeispiel" für diese Strategie, welche wird Ergebnis in der linearen Zeit.
Aber es gibt nicht viel Sie tun können, mit Ihrem sortierte array den Prozess zu beschleunigen. Sie benötigen eine spezielle Datenstruktur.
Bearbeiten
Die zweite Struktur ist genannt Quadtree, Dank VGE für die Bereitstellung der Namen.
Zur effizienten nächste-Nachbar-Suche, die Sie brauchen, um eine räumliche Partitionierung, zum Beispiel eine k - d-Baum.
Wenn Sie nicht verwenden, jede Art von Baum-Datenstruktur zu helfen, begrenzen den Bereich der Werte, die Sie haben, zu Abfrage -, Sie gehen zu müssen, überprüfen, um jeden Punkt in Ihrem Bereich des möglichen "Nachbarn". Eine Möglichkeit zur Begrenzung der Vergleiche wäre zu prüfen, dem Quadrat der Entfernung von Ihr bestimmten Zeitpunkt die für den kleinsten Wert:
std::min_element()
liefert die Antwort mit weniger Komplexität (max(N-1,0) - Vergleiche) alsstd::sort()
(O(N·log(N))). Mit Ausnahme der Fehlerbehandlung auf, so ergibt sich der nächste Punkt:std::min_element(...)->pt
.std::min_element
ist eine gute alternative zur Sortierung der quadrierten Distanzen für die nur das minimale element.Wenn Sie die Menge von N Punkten dann statt nur schob Sie in eine Reihe, Sie können die hash-map, basierend auf der linearen Distanz von dem Punkt, unter Berücksichtigung . Also Punkte mit gleichen linearen Abstand in der gleichen Eimer. Dann Holen die Punkt(E) auf der Grundlage der Entfernung wird eine Konstante Zeit Betrieb.
Eine besonders schöne Lösung ist ANN: A Library for Approximate Nearest Neighbor-Suche. ich habe es für Punkt-zu-Standort in Triangulationen. Sie initialisiert eine Datenstruktur mit dem Punkte, in meinem Fall habe ich die Mittelpunkte von meiner Dreiecke. Dann können Sie den pass in einem anderen Punkt und wieder Liste mit den ungefähren nächsten Nachbarn Punkte. Auch die Anzahl der Punkte, die zurückgegeben wird, ist wählbar als parameter. Trotzdem ANN war eine große Bibliothek, für meine Zwecke, dann empfehle ich Ihnen, check it out.
Glück!