Dovrò concordare con jk ed Ewan con la creazione di Voronoi Diagram. Questo dividerà lo spazio in poligoni. Ogni punto in K avrà un poligono che descrive tutti i punti più vicini ad esso. Ora, quando ottieni una query su un punto, devi trovare in quale poligono si trova. Questo problema si chiama Point Location e può essere risolto creando un Trapezoidal Map.
jk già collegato alla creazione dello Voronoi Diagram utilizzando Fortune's algorithm che richiede O (n log n) passaggi di calcolo e costa O (n) spazio. This website mostra come creare una mappa trapezoidale e come interrogarla. È inoltre possibile trovare alcuni limiti là:
ora di creazione previsto: O (n log n)
prevista complessità spaziale: O (n)
Ma, soprattutto, tempo di risposta previsto: O (log n). Questo è (teoricamente) migliore di O (√ n) dell'albero kD.
La mia fonte (diversa dai collegamenti precedenti) è: Computational Geometry: algorithms and applications, capitoli sei e sette.
Qui sono disponibili informazioni dettagliate sulle due strutture di dati (incluse prove dettagliate). La versione di Google books ha solo una parte di ciò che ti serve, ma gli altri link dovrebbero essere sufficienti per il tuo scopo. Basta comprare il libro se ti interessa questo genere di cose (è un buon libro).
fonte
2009-12-14 16:21:38
buon pensiero! per dataset di grandi dimensioni, ciò ridurrebbe enormemente il tempo di esecuzione. –
Dato che hai a che fare con i pixel, questo significa anche che puoi passare alla matematica intera, che è un altro enorme bonus di velocità –
@rikh Anche se hai bisogno della distanza, potresti sempre fare il 'sqrt' una volta che sai qual è il punto più vicino. –