Come calcolare in modo efficiente il punto più isolato?


8

Dato un insieme finito di punti in , come possiamo calcolare in modo efficiente un "punto più isolato" ?SRdxS

Definiamo un "punto più isolato" dix

x=argmaxpSminqS{p}d(p,q)

(Ho usato la notazione x=argmin anche se non è necessariamente unica. Qui d indica la distanza euclidea. Quindi, in altre parole, stiamo cercando un punto con la distanza maggiore dal vicino più vicino.

Un algoritmo ingenuo calcolerebbe tutte le distanze a coppie, trovando il vicino con la minima distanza per ogni punto e quindi trovando il massimo di questi. Questo richiede operazioni O(n2) , ma possiamo fare di meglio?


Suggerisco di guardare le strutture dati per la ricerca del vicino più vicino . Sospetto che possano essere adattati per aiutare a risolvere questo problema in modo più efficiente rispetto al metodo ingenuo.
DW

@DW Grazie per la raccomandazione. Ho provato a cercare alberi kd, ma non ho trovato un modo più efficiente per risolvere questo problema.
flawr

Risposte:


1

Utilizzare qualsiasi algoritmo per tutti i vicini più vicini ; allora puoi risolvere banalmente il tuo problema. Un tale algoritmo trova, per ciascun punto dati, il suo vicino più vicino. Il punto più isolato è quello il cui vicino più vicino è più lontano, quindi una volta risolti tutti i vicini più vicini, puoi trovare il punto più isolato con una semplice scansione lineare.

Apparentemente tutti i vicini più vicini possono essere trovati in tempo; vedi i riferimenti su Wikipedia. Oppure, se si desidera implementare qualcosa, prendere qualsiasi struttura di dati per i vicini più vicini e, per ogni punto , trovare il vicino più vicino.O(nlogn)p


0

Come suggerito nei commenti, vorrei esaminare le domande sui vicini più vicini.

Fare una query NN per punto dovrebbe essere nell'ordine di quindi è già meglio della soluzione ingenua.O(nlog(n))

Puoi migliorarlo ulteriormente aggiungendo un parametro alla query NN che contiene la distanza più vicina del punto più isolato che hai trovato finora. È quindi possibile interrompere qualsiasi query NN non appena trova un punto più vicino di . Questo dovrebbe accelerare un po 'la tua ricerca.dmaxdmax

A proposito, le persone spesso suggeriscono KD-Trees per NN-Search. Gli alberi KD sono molto facili da implementare ma nella mia esperienza costantemente ridimensionano meno bene con dimensioni più elevate rispetto ad altri alberi. Per o giù di lì, consiglierei di usare un R-Tree, come R * Tree (R-Star-Tree), X-Tree o R-Tree caricato con STR, o un PH-Tree (che è più simile a un bitree quadtree).d>10

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.