Ho un set di dati di circa 100.000 (X, Y) coppie che rappresentano i punti nello spazio 2D. Per ogni punto, voglio trovare i suoi vicini k-più vicini.Scelta idonea della struttura dati e dell'algoritmo per la ricerca veloce del vicino più vicino di k in 2D
Quindi, la mia domanda è: quale struttura/algoritmo dei dati sarebbe una scelta adatta, supponendo che voglio minimizzare assolutamente il tempo di esecuzione complessivo?
Non sto cercando codice, solo un puntatore verso un approccio adeguato. Sono un po 'intimidito dalla gamma di scelte che sembrano rilevanti: quad-tree, R-trees, kd-trees, ecc.
Sto pensando che l'approccio migliore sia costruire una struttura dati, quindi eseguire alcuni tipo di k - Ricerca dei vicini più vicina per ogni punto. Tuttavia, poiché (a) conosco i punti in anticipo e (b) so che devo eseguire la ricerca per ogni punto esattamente una volta, forse c'è un approccio migliore?
alcuni dettagli in più:
- Dal momento che voglio minimizzare tutto il tempo di esecuzione, non mi importa se la maggior parte del tempo viene speso per la struttura vs ricerca.
- Le coppie (X, Y) sono abbastanza distribuite, quindi possiamo assumere una distribuzione quasi uniforme.
Grazie mille, questo sembra un ottimo approccio. – visitor93746
Il concetto di "bucket bucket" è molto utile. Ma non è così ovvio se o quanto le reti multiple sovrapposte acceleri le cose. @Bio potrebbe voler codificare alcune configurazioni diverse di griglie sovrapposte e confrontare le prestazioni su alcuni dati di esempio. Includerei un algoritmo a griglia singola, il quattro (?) - algoritmo di griglia di @ Rex e probabilmente un algoritmo a due griglia in cui i vertici di ciascuna griglia si trovano nei centri del secchio dell'altro. – aschepler
@aschepler: concordato e c'è anche un equilibrio tra il numero di griglie separate e la dimensione di ciascun elemento della griglia. Quattro griglie garantiscono che sarai sempre almeno (d/4) lontano da un muro. Una singola griglia finemente distanziata con un buon algoritmo di potatura sarà probabilmente la più veloce; è solo più complicato da implementare. Disporre di orientamenti diversi potrebbe probabilmente aiutare ancor di più che avere griglie sovrapposte, ma ancora una volta ciò diventa ancora più complicato. –