Nehmen wir an, wir haben zwei Sätze von Punkten A, B, und wir wollen für jeden Punkt in Menge A seinen nächsten Nachbarn in Menge B finden.
Es gibt viele gute Algorithmen, um den nächsten Nachbarn für einen Punkt zu finden. Gibt es eine Möglichkeit, die Informationen, die wir für a_1 erhalten haben, zu verwenden, um effizienter nach dem nächsten Nachbarn für a_2 oder anderen Punkten im Set zu suchen?
Ich denke so etwas wie: benutze Dreiecksunwichtigkeit, um ein Intervall für die mögliche Entfernung zwischen jedem Punkt in B und dem neuen Punkt a_2 zu erhalten, und sortiere die Max und Min der Intervalle, und dann kann ich nur die Punkte in B suchen fällt in das erste Intervall.
Details für Schritt 2: Behalte alle Kanten des Voronoi-Diagramms, die derzeit von der Sweep-Linie geschnitten werden, in einem bestimmten geordneten Container. Wenn die Sweep-Linie einen Scheitelpunkt des Voronoi-Diagramms abdeckt, entfernen Sie Kanten, die zu diesem Scheitelpunkt gehören, vom / zum Container. Um zu sehen, zwischen welchen Kanten ein Punkt liegt, erhalten Sie im Container die Nachfolger / Vorgänger-Kanten.
Die Zeitkomplexität ist O ((M + N) log M). N = | A |, M = | B |.
Sie können davon profitieren, wenn Sie Bentleys lesen, die "effiziente Programme schreiben", in denen er sich mit einer Fallstudie des Programms für Geschäftsreisenden beschäftigt. Eine der Ersparnisse, die er erkannte, war, dass der Unterschied zwischen zwei Punkten darin bestand, eine Quadratwurzel zu nehmen, die teuer war. Wenn Sie die Quadratwurzel verwenden, erhalten Sie die tatsächliche Entfernung. Wenn Sie nicht die Quadratwurzel verwenden, erhalten Sie eine Zahl, die Sie zum Vergleich mit anderen relativen Werten verwenden können.
Ich empfehle dringend, das Buch zu lesen. Es wird dein Gehirn an den richtigen Ort bringen.
Tags und Links algorithm nearest-neighbor