Ich werde mit jk und Ewan mit einer Voronoi Diagram übereinstimmen müssen. Dadurch wird das Leerzeichen in Polygonen aufgeteilt. Jeder Punkt in K wird ein Polygon haben, das alle Punkte beschreibt, die ihm am nächsten sind. Jetzt, wenn Sie eine Abfrage eines Punktes erhalten, müssen Sie herausfinden, in welchem Polygon es liegt. Dieses Problem wird Point Location genannt und kann durch den Aufbau einer Trapezoidal Map gelöst werden.
jk bereits verknüpft mit der Erstellung der Voronoi Diagram mit Fortune's algorithm, die O (n log n) Rechenschritte und kostet O (n) Raum. This website zeigt Ihnen, wie Sie eine trapezförmige Map erstellen und abfragen. Sie können auch einige Grenzen dort finden:
Erwartete Erstellungszeit: O (n log n)
Erwartete Speicherkomplexität: O (n)
Aber am wichtigsten ist, erwartete Abfragezeit: O (log n). Dies ist (theoretisch) besser als O (√ n) des kD-Baumes.
Meine Quelle (außer den Links oben) ist: Computational Geometry: algorithms and applications, Kapitel sechs und sieben.
Dort finden Sie detaillierte Informationen zu den beiden Datenstrukturen (inklusive detaillierter Proofs). Die Google Bücher Version hat nur einen Teil von dem, was Sie brauchen, aber die anderen Links sollten für Ihren Zweck ausreichen. Kaufen Sie das Buch einfach, wenn Sie an so etwas interessiert sind (es ist ein gutes Buch).
gutes Denken! Für große Datensätze würde dies die Laufzeit enorm reduzieren. –
Da Sie mit Pixeln zu tun haben, bedeutet dies auch, dass Sie auf ganzzahlige Mathematik, was ein weiterer riesiger Geschwindigkeitsbonus ist –
@rikh Drop Auch wenn Sie die Entfernung benötigen, können Sie immer die 'sqrt' tun, sobald Sie wissen, welcher Punkt ist nächste. –