Schnellen Algorithmus zu finden, der x am nächsten Punkte zu einem gegebenen Punkt auf einer Ebene
Ich würde gerne einen schnellen Algorithmus, um zu finden, die x nächsten Punkte zu einem gegebenen Punkt auf einer Ebene.
Sind wir eigentlich im Umgang mit nicht zu viele Punkte (zwischen 1.000 und 100.000), aber ich brauche die x nächsten Punkte für jeden dieser Punkte. (wobei x in der Regel werden zwischen 5 und 20.)
Muss ich dies in C# schreiben.
Etwas mehr Kontext über die use-case: Diese Punkte sind Koordinaten auf der Karte. (Ich weiß, das heißt, wir sind nicht gerade das sprechen über ein Flugzeug, aber ich hoffe, um zu vermeiden, Umgang mit Projektion Fragen.) Am Ende Punkte, die noch viele andere Punkte in der Nähe zu Ihnen angezeigt werden soll, in rot, Punkte, die nicht zu viele Punkte in der Nähe, Sie sollte grün dargestellt. Zwischen diesen beiden extremees die Punkte sind auf einem Farbverlauf.
- Ich bin mir nicht sicher, dass der Algorithmus Sie für Fragen ist die beste Lösung für Ihren Anwendungsfall. Vielleicht könntest du in einer Schleife durch alle Punkte an, und berechnen einer groben Dichte-Funktion (ein 2-D Histogramm). Dann könnten Sie einfach jede Farbe Punkt-auf Basis berechnete Dichte für die Zelle ist es in, vielleicht in Anbetracht benachbarten Zellen, zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie brauchen, ist eine Datenstruktur, die die entsprechenden für die Organisation der Punkte in einer Ebene. Die K-D-Baum wird oft in solchen Situationen. Sehen k-d-Baum auf Wikipedia.
Hier fand ich eine Allgemeine Beschreibung der Geometrische Algorithmen
UPDATE
Ich die Portierung einer Java-Implementierung von einem KD-Baum für C#. Bitte sehen Benutzer:Ojd/KD-Baum auf RoboWiki. Sie können den code herunterladen gibt, oder Sie können herunterladen CySoft.Collections.zip direkt aus meinem homepage (nur download, keine Doku).
Für einen bestimmten Punkt (nicht alle), und als die Anzahl der Punkte ist nicht extrem, man könnte berechnen Sie den Abstand von jedem Punkt:
(Die ich benutzt habe x = 20)
Die Berechnung basiert auf Doppel, so dass die fpu sollte in der Lage sein zu tun, einen guten job hier.
Beachten Sie, dass Sie möglicherweise eine bessere Leistung, wenn der Punkt ist eine Klasse statt einer Struktur.
Müssen Sie erstellen eine distanzfunktion, dann Entfernung berechnen, für jeden point und Sortieren Sie die Ergebnisse und nehmen Sie die erste x.
Wenn die Ergebnisse müssen zu 100% genau ist, dann können Sie den standard-Abstand-Funktion:
d = SQRT((x2 - x1)^2 + (y2 - y1)^2)
Machen diese effektiver. lets sagen, die Entfernung ist k. Nehmen Sie alle Punkte mit x-Koordinaten zwischen x k und x+k. ähnlich nehmen -, y-k und y+k. So haben Sie entfernt alle überschüssige Koordinaten. jetzt machen die Entfernung von (x-x1)^2 + (y-y1)^2. Machen Sie einen min-heap mit k Elementen auf Sie , und fügen Sie Sie zu den Haufen, wenn neue point < min(heap). Sie haben nun die k-minimalen Elemente in den heap.