2010-04-29 16 views
38

Questa è una domanda che mi è stata chiesta per un colloquio di lavoro qualche tempo fa. E ancora non riesco a capire una risposta sensata.Come trovare due punti più distanti?

domanda è:

si è dato insieme di punti (x, y). Trova 2 punti più lontani. Distanti l'uno dall'altro.

Ad esempio, per i punti: (0,0), (1,1), (-8, 5) - i più distanti sono: (1,1) e (-8,5) perché la distanza tra loro sono più grandi da entrambi (0,0) - (1,1) e (0,0) - (- 8,5).

L'approccio ovvio è calcolare tutte le distanze tra tutti i punti e trovare il massimo. Il problema è che è O (n^2), che lo rende proibitivo per i dataset di grandi dimensioni.

C'è un approccio con i primi punti di tracciamento che si trovano sul confine e quindi calcola le distanze per loro, sulla premessa che ci saranno meno punti sul confine che "dentro", ma è ancora costoso, e fallirà nel peggiore caso.

Ho provato a cercare sul Web, ma non ho trovato alcuna risposta ragionevole - anche se questo potrebbe essere semplicemente la mia mancanza di capacità di ricerca.

+2

Era "qualche tempo fa" dell'ordine di un'ora? ;-) –

+0

Se puoi eseguire l'ordinamento in O (nlogn), prova ad usarlo. –

+0

Cosa intendi, Gabriel? Ordina per cosa? –

risposta

15

EDIT: Un modo è quello di trovare il convesso scafo http://en.wikipedia.org/wiki/Convex_hull della serie di punti e poi i due punti distanti sono i vertici di questo.

Possibilmente risposta qui: Algorithm to find two points furthest away from each other

anche:

+0

Quelle domande riguardano algoritmi di grafi, non geometria computazionale, non è vero? –

+1

è possibile modellare il problema come un grafico ponderato completo –

+0

buona risposta, mi piace. – ldog

7

Algoritmi per punto limite abbondano (cercare algoritmi di scafo convesso). Da lì, dovrebbe occorrere O (N) per trovare i punti opposti più lontani.

Dal commento dell'autore: per prima cosa trova una qualsiasi coppia di punti opposti sullo scafo, quindi giragli intorno in modo semi-serrato. A seconda degli angoli tra i bordi, dovrai far avanzare uno dei due camminatori o l'altro, ma sarà sempre necessario O (N) per circumnavigare lo scafo.

+1

Supponiamo ora che tutti i punti N dati siano sullo scafo convesso. Ancora O (N)? –

+0

Sì, perché per prima cosa trovi una coppia di punti opposti sullo scafo, e poi giragli intorno in modo semi-serrato. A seconda degli angoli tra i vertici, dovrai far avanzare uno dei due camminatori o l'altro, ma sarà sempre necessario O (N) per circumnavigare lo scafo. –

+0

Si prega di inviare un algoritmo completo per verificare quali sono i punti più lontani, dato lo scafo convesso (un insieme di nodi e il loro ordine). –

0

A pochi pensieri:

Si potrebbe guardare solo i punti che definiscono il convesso del vostro insieme di punti per ridurre il numero, ... ma sembra ancora un po ' "non ottimale".

Altrimenti potrebbe esserci un approccio ricorsivo quad/oct-tree per il rapido collegamento di alcune distanze tra insiemi di punti ed eliminare ampie parti dei dati.

0

Un punto di partenza potrebbe essere guardando i problemi al più vicino punti, che sono state esaminate.Wikipedia elenca alcune opzioni:

http://en.wikipedia.org/wiki/Closest_point_query

+0

Oppure http://en.wikipedia.org/wiki/Closest_pair_problem – zaf

+0

Bene, le soluzioni per la base più vicina per dividere e conquistare, e non ho idea di come applicarlo per trovare i punti più lontani. –

1

Un algoritmo stocastico di trovare la coppia più lontana sarebbe

  • scegliere un punto casuale
  • Prendi il punto più lontano ad esso
  • Ripetere una Poche volte
  • Rimuovi tutti i punti visitati
  • Scegli un altro r punto casuale e ripetere alcune volte.

Sei in O (n) fino a quando si predeterminerà "alcune volte", ma non è garantito che trovi effettivamente la coppia più distante. Ma a seconda della serie di punti, il risultato dovrebbe essere abbastanza buono. =)

+1

Considera questo, quindi correggi o cancella la tua risposta in modo da non ottenere downvotes: immagina di avere un insieme di punti quasi quadrati, '{A = (0, 0), B = (10, 10), C = (10, 0), D = (0, 11)} '; i punti più lontani sono BD (distanza = 14,86); ma se provi a iniziare da A o B ti sentirai tentato di rimuovere C (AC = BC = 10) o D (AD = 11, BD = 10.05) poiché sono più vicini al vertice scelto rispetto al vertice opposto (AC = 14,14), ** mentre in realtà la distanza più lunga è in realtà 14,86 **. – ANeves

+0

@sr pt: nel tuo esempio, i CD sono i punti più lontani, non BD. A partire da A o B si sceglie sempre l'altro nel passaggio 2, quindi solo questi due vengono rimossi al punto 4. – Jens

3

Questa domanda è stata introdotta in Introduzione all'algoritmo. Ha menzionato 1) Calcola Convex Hull O (NlgN). 2) Se è presente M vectex su Convex Hull. Quindi abbiamo bisogno di O (M) per trovare la coppia più lontana.

Trovo questo link utile. Comprende l'analisi dei dettagli dell'algoritmo e del programma. http://www.seas.gwu.edu/~simhaweb/alg/lectures/module1/module1.html

Desideri questo sarà utile.

2

Si sta cercando un algoritmo per calcolare il diametro di un set di punti, Diam (S). Si può dimostrare che questo è uguale al diametro dello scafo convesso di S, Diam (S) = Diam (CH (S)). Quindi prima calcola lo scafo convesso del set.

Ora devi trovare tutti i punti degli antipodi sullo scafo convesso e raccogliere la coppia con la massima distanza. Ci sono O (n) punti antipodali su un poligono convesso. Quindi questo dà un algoritmo O (n lg n) per trovare i punti più lontani.

Questa tecnica è nota come Calibri rotanti. Questo è ciò che Marcelo Cantos descrive nella sua risposta.

Se si scrive attentamente l'algoritmo, è possibile fare a meno degli angoli di calcolo. Per i dettagli, controllare questo URL.

0

Sembra facile se i punti sono indicati in coordinate cartesiane. Così facile che sono abbastanza sicuro di trascurare qualcosa. Sentiti libero di indicare cosa mi manca!

  1. Trova i punti con i valori massimo e minimo delle loro coordinate x, yez (6 punti in totale). Questi dovrebbero essere i più "remoti" di tutti i punti di confine.
  2. Calcolare tutte le distanze (30 Distanze unici)
  3. trovare la distanza massima
  4. I due punti che corrispondono a questa distanza max sono quelli che stai cercando.
+0

Ovviamente O (N) btw ... –

+0

Okay, dopo un ulteriore pensiero non è garantito trovare i due punti più lontani. Doh! Tuttavia, ti dà la dimensione minima della regione delimitata dall'array dei punti, che non verrà superata da una scala di oltre sqrt (2). Potrebbe essere utile! –

-1

Dato un insieme di punti {(x1, y1), (x2, y2) ... (xn, yn)} trova 2 punti più distanti.

Il mio approccio:

1). Hai bisogno di un punto di riferimento (xa, ya), e sarà:
xa = (x1 + x2 + ... + xn)/n
ya = (y1 + y2 + ... + yn)/n

2). Calcola tutta la distanza dal punto (xa, ya) a (x1, y1), (x2, y2), ... (xn, yn)
Il primo "punto più distante" (xb, yb) è quello con il massima distanza

3). Calcola tutta la distanza dal punto (xb, yb) a (x1, y1), (x2, y2), ... (xn, yn)
L'altro "punto più distante" (xc, yc) è quello con il massima distanza

Così avete ottenuto il vostro punti più distanti (XB, YB) (XC, YC) a O (n)

Ad esempio, per i punti: (0,0), (1,1), (- 8, 5)

1). Punto di riferimento (xa, ya) = (-2.333, 2)

2). Calcolare le distanze:
da (-2.333, 2) a (0,0): 3.073
da (-2.333, 2) a (1,1): 3.480
da (-2.333, 2) a (-8 , 5): 6.411
Quindi il primo punto più distante è (-8, 5)

3). Calcolare le distanze:
da (-8, 5) a (0,0): 9.434
da (-8, 5) a (1,1): 9.849
da (-8, 5) a (-8 , 5): 0
Così l'altro punto più lontano è (1, 1)

+0

prima non hai nemmeno provato perché è corretto, ma ecco un esempio perché è sbagliato {{0, 0}, {10,0}, {- 10,0}, {0,17}} la risposta corretta è 20, la tua risposta è ~ 19.72 – Vladp

-2

un'occhiata a triangoli ad angolo retto A- (x1, y1), B- (x2, y2) e la distanza b/w A e B è = sqrt [(| x1 | + | x2 |)^2 + (| y1 | + | y2 |)^2]

+0

Ha già detto che calcolare le distanze tra tutti è troppo espansivo ... –

0

Trova la media di tutti i punti, misura la differenza tra tutti i punti e la media, prendi il punto più lontano dalla media e trova il punto più lontano da esso. Questi punti saranno gli angoli assoluti dello scafo convesso e i due punti più distanti. Recentemente ho fatto questo per un progetto che necessitava di scafi convessi limitati a piani infiniti diretti casualmente. Ha funzionato alla grande.

Problemi correlati