La domanda di base è la frequenza con cui si eseguono le query su un singolo insieme di punti.
Se stai per trovare un punto più vicino nel set una volta, allora @Lucian ha ragione: potresti anche lasciare i punti non ordinati, e fare una ricerca lineare per trovare il punto giusto.
Se si esegue un numero relativamente elevato di query rispetto allo stesso insieme di punti, è utile organizzare i dati del punto per migliorare la velocità della query. @izomorphius ha già menzionato un albero k-d, e questo è sicuramente un buon suggerimento. Un'altra possibilità (certamente, abbastanza simile) è un albero di ottobre. Tra i due, trovo un albero di ottobre un po 'più facile da capire. In teoria, un albero k-d dovrebbe essere leggermente più efficiente (in media), ma non ho mai visto molta differenza - anche se forse con dati diversi la differenza sarebbe diventata significativa.
Si noti, tuttavia, che la costruzione di qualcosa di simile a un albero k-D o ottobre-albero non è terribilmente lento, quindi non c'è bisogno di fare un sacco di query in un insieme di punti per giustificare la costruzione di uno. Una query chiaramente non lo giustifica, e probabilmente due non lo faranno - ma contrariamente a quanto suggerisce Luchian, O (N log N) (solo per esempio) non è molto lento. In parole povere, log (N) è il numero di cifre nel numero N, quindi O (N log N) non è realmente molto più lento di O (N). Ciò, a sua volta, significa che non è necessario un numero particolarmente elevato di query per giustificare l'organizzazione dei dati per accelerare ciascuno di essi.
fonte
2012-06-25 14:10:03
+1 per O (_n_). Penso che 'std :: min_element' sia probabilmente la soluzione più naturale. –