Ordinamento per distanza euclidea


17

è un insieme di punti su un piano. Un punto casuale x S è dato sullo stesso piano. Il compito è quello di risolvere tutti y S dalla distanza euclidea tra x ed y .SxSySxy

Un approccio senza cervello è quello di calcolare le distanze tra e y per tutti y S e quindi ordinare loro utilizzando qualsiasi algoritmo veloce.xyyS

Esiste un modo per archiviare o preelaborare modo che il processo di ordinamento diventi più veloce?S


1
Puoi considerare una griglia di dimensioni appropriate e raggruppare i punti in base al quadrato corrispondente (usando, diciamo, tabella hash). Quindi per alcune coppie di quadrati puoi dedurre che tutti i punti di un quadrato sono più lontani da di tutti i punti di un altro quadrato. In pratica potrebbe aiutare, immagino. X
ilyaraz,

L '"approccio no-brain" che hai affermato corre nel tempo O (n log n), dove n è il numero di punti in S, che credo sia piuttosto veloce in pratica. Vuoi eliminare il fattore log n o vuoi qualcos'altro come l' ordinamento esterno ?
Tsuyoshi Ito,

Il punto è che ho un tempo praticamente illimitato per preparare la mia serie di punti, ma il tempo per ordinarli è molto limitato. Detto questo, si apprezza qualsiasi accelerazione dell'ordinamento standard, anche se è lo stesso O (n log n), ma più veloce nel caso peggiore (o nel migliore dei casi, o altro).
Alex K.

Ad esempio, se conservo S come un albero 2-d, posso trovare un vicino più vicino in O (log n) tempo. Forse esiste una soluzione simile per il mio compito. Non sono un grande esperto di strutture di dati spaziali - e ce ne sono così tante - potrei facilmente perderlo.
Alex K.

Risposte:


13

Soluzione 1: trova le bisettrici perpendicolari tra coppie di punti e costruisci la disposizione di queste linee. La disposizione ha Θ ( n 4 ) celle, all'interno delle quali l'ordine ordinato è costante. Quindi costruisci una struttura di dati sulla posizione dei punti per la disposizione e decora ogni cella con l'ordine ordinato che deve essere restituito per i punti all'interno di quella cella. Gli ordini ordinati tra celle adiacenti differiscono solo in una singola trasposizione, quindi è possibile utilizzare una struttura di dati persistente per consentire alle rappresentazioni di questi ordini ordinati di condividere lo spazio. Lo spazio totale è O ( n 4 ) e il tempo di query è OΘ(n2)Θ(n4)O(n4) .O(logn)

Soluzione 2: scegliere un campione casuale di di queste stesse bisettrici perpendicolari, costruire la loro disposizione e dividere ciascuna cella di disposizione per segmenti di linea verticale attraverso ogni incrocio di due linee campionate. La partizione risultante ha Θ ( n 2 ) celle, ognuna delle quali con alta probabilità è attraversata da O ( n ) bisettrici non campionate. Decora ogni cella della partizione in base a un ordinamento ordinato valido dei punti visto da alcune x all'interno della cella. Lo spazio totale è O ( n 3 ) .Θ(n)Θ(n2)O(n)O(n3)

Ora, per eseguire una query, individuare il punto di query nella partizione, cercare l'ordinamento memorizzato con la cella di partizione e utilizzare l' algoritmo di ordinamento del confronto dell'albero cartesiano di Levcopoulos & Petersson (1989) a partire da questo ordinamento memorizzato. Il tempo per questo passaggio è proporzionale a dove k i è il numero di punti fuori servizio con il punto y i . Ma k i è O ( n ) (ogni bisettrice non campionata causa al massimo una coppia di punti fuori ordine), quindi il tempo di interrogazioneΣioO(1+logKio)KioyioΣKioO(n) è anche O ( n ) .ΣioO(1+logKio)O(n)


1
PS ecco una variante alternativa della soluzione 2 che utilizza lo stesso spazio e tempo di query ma scambia un algoritmo di preelaborazione più complicato per un algoritmo di query più semplice: 11011110.livejournal.com/233793.html
David Eppstein

Perché pre-elaborazione quando è possibile ordinare da tutti i n punti di partenza nel tempo O ( n 2 log n ) e memorizzare i risultati in una tabella hash usando lo spazio O ( n 2 ) per una ricerca costante? n4nO(n2logn)O(n2)
Dave,

Perché ci sono punti di partenza con diversi ordinamenti, non Θ ( n 2 ) . Θ(n4)Θ(n2)
David Eppstein,

1

Probabilmente non sarai in grado di allontanarti da volta in qualsiasi modo lo tagli; anche pre-calcolare regioni corrispondenti a tutti i possibili ordinamenti potrebbe (credo) produrre O ( n ! ) regioni e quindi trovare la 'tua' regione con qualsiasi tecnica di ricerca significativa prenderà O ( log ( n ! ) ) = O ( n log ( n ) ) tempo. ( MODIFICA:nlog(n)O(n!)O(log(n!))=O(nlog(n))questo è assolutamente sbagliato; vedi l'eccellente risposta di David Eppstein per ulteriori informazioni!) Un modo utile per ridurre la complessità, d'altra parte - specialmente se non hai bisogno di tutto l'ordinamento in una volta ma devi solo essere in grado di estrarre casualmente il più vicino al volo - potrebbe essere attraverso diagrammi Voronoi di ordine superiore: estensioni della cella Voronoi standard che ospitano non solo il vicino più vicino ma il secondo più vicino, ecc. L'articolo di Frank Dehne sulla ricerca del vicino k più vicino, http: //people.scs .carleton.ca / ~ dehne / publications / 2-02.pdf sembra essere il riferimento canonico; la sua homepage su http://www.dehne.carleton.ca/publications contiene numerosi altri articoli sui diagrammi di Voronoi che potrebbero essere utili.K


3
Θ(n4)O(n!)Θ(n2)

@ David Penso che dovresti farne una risposta.
James King,

Seconded - n! mi sentivo sbagliato mentre lo scrivevo, ma non riuscivo a vedere un caso contrario. Modificherò presto la mia risposta per correggerla, ma mi piacerebbe davvero vederne una più direttamente informata; grazie!
Steven Stadnicki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.