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 .Sx∉Sy∈Sxy

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

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(log⁡n)

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+log⁡Kio)KioyioΣKioO(n) è anche O ( n ) .ΣioO(1+log⁡Kio)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(n2log⁡n)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.