Distanza più breve tra un punto in A e un punto in B


9

ABnABmin { dist(p,q) | pAqB }

Non sono sicuro di aver ragione, ma questo problema è molto simile ai problemi che possono essere risolti dalla programmazione lineare nella geometria computazionale. Tuttavia, la riduzione a LP non è semplice. Anche il mio problema sembra correlato alla ricerca della stip più sottile tra due serie di punti che ovviamente possono essere risolti da LP in O(n) nello spazio bidimensionale.


4
Qual è la domanda qui?
Raffaello


Non sono un esperto, ma di solito nell'apprendimento automatico, dove questi punti sono dati, gli insiemi si comportano bene per la maggior parte del tempo e sono raggruppati insieme, quindi algoritmi come quello suggerito da @Pedro funzionano bene.
Chazisop,

3
"che ovviamente può essere risolto da LP in O (n) nello spazio bidimensionale" - Mi chiedo cosa abbia spinto questa affermazione. La "programmazione lineare" non è generalmente risolvibile in tempo lineare; il "lineare" si riferisce a qualcos'altro. Quindi l'LP ha una forma speciale?
Raffaello

Risposte:


5

Ho una soluzione che può sembrare un po 'contorta, ma dovrebbe essere più efficiente della ricerca ingenua :O(n2)

  1. lascia sia l'asse tra i centri di massa di e .A BvAB
  2. Ordinare i punti in e lungo questo asse rispettivamente in ordine decrescente e crescente, risultando nelle sequenze , , ..., e , , ..., .B a 0 a 1 a n b 0 b 1 b nABa0a1anb0b1bn

Il resto è in pseudo-codice per renderlo più chiaro:

d = infinity.
for j from 1 to n
    if (b_1 - a_j) along v > d then break endif
    for k from 1 to n
        if (b_k - a_j) along v > d then
            break
        else
            d = min( d , ||b_k - a_j|| )
        endif
    enddo
enddo

Cioè, preordinando i punti lungo , puoi filtrare le coppie che non saranno mai entro una dall'altra poiché lungo sarà sempre.vdbkajvbkaj

Nel caso peggiore questo è ancora , ma se e sono ben separati, dovrebbe essere molto più veloce di quello, ma non migliore di , che è richiesto per l'ordinamento.O(n2)ABO(nlogn)

Aggiornare

Questa soluzione non è affatto estratta da un cappello. È un caso speciale di ciò che uso nelle simulazioni di particelle per trovare tutte le coppie interagenti di particelle con binning spaziale. Il mio lavoro che spiega il problema più generale è qui .

Per quanto riguarda il suggerimento di utilizzare un algoritmo di cambio linea modificato, sebbene intuitivamente semplice, non sono convinto che questo sia in quando si considerano insiemi disgiunti. Lo stesso vale per l'algoritmo randomizzato di Rabin.O(nlogn)

Non sembra esserci molta letteratura che affronti il ​​problema della coppia più vicina in insiemi disgiunti, ma ho trovato questo , che non pretende di essere sotto , e questo , che non sembra per fare affermazioni su qualsiasi cosa.O(n2)

L'algoritmo sopra può essere visto come una variante della scansione del piano suggerita nel primo documento (Shan, Zhang e Salzberg), tuttavia invece di utilizzare l' asse e nessun ordinamento, viene utilizzato l'asse tra i set e gli insiemi vengono attraversati in ordine decrescente / crescente.x


2
@Pedro: mi dispiace non aver commentato prima (nessuna volta al momento). Il motivo per cui ho annullato il voto della tua risposta è stato perché era una risposta negativa e non avrebbe dovuto essere al top. Questo è in realtà un problema ben noto nella geometria computazionale con il caso peggiore O (n log n). Una buona risposta avrebbe sottolineato il problema noto (forse con un riferimento) e le soluzioni comuni, che includono: usare alberi kd e test elementally, algoritmi di sweep, ecc. L'idea generale dovrebbe essere quella di preelaborare in una struttura ordinata e utilizzare . Guarda il caso 1D - O più ovvio (n log n) lì.
ex0du5,

2
@ ex0du5: sembra che dovresti pubblicare la tua risposta! Si noti che "esiste una risposta migliore" di solito non è una buona ragione per il downvoting; questa misura dovrebbe essere riservata a risposte errate, spam e formattate in modo molto errato. Pedro non è nessuno dei due. Vedi anche qui per un'impressione di quanto alcuni pensano che dovrebbe essere dato prima di un voto negativo.
Raffaello

1
@Raphael: non ho risposto perché c'era una risposta giusta e non ho avuto il tempo di cercare riferimenti. Per quanto riguarda il tuo riferimento su come votare, questo è un orribile algoritmo per questi siti! Soprattutto gli studenti CS dovrebbero capire l'importanza di non perdere l'obiettivo del formalismo. L'obiettivo del voto è spostare le risposte in una classifica che guiderà gli studenti successivi dello stesso problema alle risposte più utili. Il mio algoritmo per votare lo fa. Quell'algo: ovviamente no. Questo può essere discusso su un meta se vuoi, ma da adulti, dovremmo usare i nostri poteri per il bene, credo.
ex0du5,

1
@ ex0du5: sembra che tu abbia un po 'di tempo a disposizione adesso. Puoi davvero dimostrare che questa istanza è in realtà un "problema ben noto con il caso peggiore "? O(nlogn)
Pedro,

1
@ ex0du5: in realtà, la ricerca del vicino più vicino, ad esempio usando alberi kd , ha solo una complessità media O (logn) . Quindi torniamo al punto di partenza.
Pedro,

4

È possibile adattare l' algoritmo di lineweep "coppia più vicina" che è .O(nlogn)

L'unica modifica che dovrai fare è ignorare le coppie che appartengono allo stesso set.

Modifica: questo in realtà non è semplice (o addirittura possibile) come ho descritto. Vedi i commenti per la discussione.


2
Solo un'osservazione, si può anche adattare il classico algoritmo di divisione e conquista per le coppie più vicine che gira anche in ; vedi anche Wikipedia . O(nlogn)
Rizwanhudda,

1
Per un algoritmo di tempo lineare randomizzato, vedi ad esempio Rabin lancia una moneta sul blog di Lipton.
Juho,

3
Potresti essere un po 'più specifico su come implementarlo per insiemi disgiunti, specialmente per quanto riguarda il mantenimento del limite di ? O(nlogn)
Pedro,

-1 per erroneità. L'algoritmo di allineamento delle righe della coppia più vicina che si collega si basa sull'insieme ordinato contenente elementi , ma nel caso di insiemi disgiunti, questo insieme inizia con elementi, quindi non è più in , in almeno non nel peggiore dei casi. n O ( n registro n )O(1)nO(nlogn)
Pedro,

1
@Pedro: perché dovrebbe essere più grande? Semmai, l'insieme degli attuali punti candidati dovrebbe ridursi.
Raffaello

4

L'idea in problemi come questo è quella di creare una struttura ordinata da uno degli insiemi che consenta query efficienti sul vicino più vicino. Il classico documento che presentava una struttura di query O (log n) per dimensione arbitraria era:

Shamos e Hoey sulle soluzioni Voronoi

Da allora sono state create numerose altre partizioni spaziali basate sulle idee delle tessellazioni Delauney, che si traducono anche in una varietà di descrizioni di sweep del sottospazio. Si noti che il metodo Voronoi rientrerebbe anche in una descrizione generale di divisione e conquista a causa del suo partizionamento piano che rende la fase di costruzione O (n log n).

Quindi, la soluzione di base a questo problema è:

  1. Prendi il set A e crea l'efficiente struttura di query Neighbor più vicina a tua scelta. Questa fase di costruzione è O (n log n) [vedi teorema 4].
  2. Per ogni elemento in B, interrogare la struttura A per il vicino più vicino. Ogni query è O (log n) [vedi teorema 15, dimensione fissa], quindi il tempo di query totale per tutti i punti in B è O (n log n).
  3. Quando il risultato per il punto più vicino in A per ogni B viene recuperato, inserirlo in una struttura ordinata sulla distanza. Questo è O (log n) inserire ogni risultato o O (n log n) per tutti.
  4. Quando tutte le B sono state osservate, puoi rapidamente (O (1)) ottenere il punto B nella struttura ordinata con la distanza più vicina ad un punto in A.

Come si può vedere guardando la complessità di ogni passaggio, la complessità totale è O (n log n). Per il lettore moderno che non guarda i documenti classici, questo è trattato in molti libri sugli algoritmi, ad esempio "Il manuale di progettazione dell'algoritmo" di Skiena.


1
"La soluzione di Artium, per esempio, può essere scritta in questa forma ed è completamente valida." - beh, quello che proponi qui non è più un algoritmo (puro) di sweep-line, quindi non lo so.
Raffaello

@Raphael: Certo che lo è. Gli algoritmi Sweepline preelaborano i punti in una struttura ordinata proprio come descritto qui. Ho anche collegato all'algoritmo di Fortune sotto la sua risposta, che mostra che l'algoritmo sweepline è solo un'istanza dell'algoritmo Voronoi. Il motivo per cui ho mantenuto la soluzione generica per la struttura della query è perché sono stati sviluppati un gran numero di meccanismi geometrici per questo.
ex0du5,

Non è necessario un ordine particolare durante l'iterazione su , mentre l'ordine è essenziale per (molti / tutti?) Algoritmi di sweepline (da qui il nome, immagino). B
Raffaello

1

Non sono sicuro di aver ragione, ma questo problema è molto simile ai problemi che possono essere risolti dalla programmazione lineare nella geometria computazionale. Tuttavia, la riduzione a LP non è semplice. Anche il mio problema sembra legato alla ricerca della stip più sottile tra due serie di punti che ovviamente possono essere risolti da LP nello spazio bidimensionale.

Il limite inferiore per questo problema è nel modello di albero delle decisioni algebrico. Darò uno schizzo approssimativo della sua prova qui.O(nlogn)

Ridurremo l'istanza del problema di distinzione tra elementi E in C.

  • Immettere in E: S={a1,a2,a3,...,an}
  • Sia > 0 una piccola frazioneϵ
  • A = ,B = { ( a i + ϵ ) : 1 i n }{(ai,0):1in}B={(ai+ϵ):1in}
  • Ora se riusciamo a trovare la distanza più breve (d) tra gli insiemi A e B. Possiamo decidere il problema di distinzione degli elementi nel tempo aggiuntivo come segue O(n)
    • L'insieme ha un duplicato se e solo se d =ϵSϵ

Sappiamo che il limite inferiore del runtime per decidere il problema di distinzione tra elementi è . Pertanto, per riduzione, il limite inferiore si applica anche al nostro problema.O(nlogn)

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.