Comment calculer efficacement le point le plus isolé?

8

Étant donné un ensemble fini Sde points dans , comment calculer efficacement un "point le plus isolé" ?RXS

On définit un "point le plus isolé" parX

X=argmaxpSminqS{p}(p,q)

(J'ai utilisé la notation X=argmin même si elle n'est pas nécessairement unique. Ici désigne la distance euclidienne.) En d'autres termes, nous recherchons un point avec la plus grande distance du plus proche voisin.

Un algorithme naïf consisterait à calculer toutes les distances par paires, à trouver le voisin avec la distance la moins longue pour chaque point, puis à trouver le maximum de celles-ci. Il s'agit d'opérations O(n2) , mais pouvons-nous faire mieux que cela?

flawr
la source
Je suggère de regarder les structures de données pour la recherche du plus proche voisin . Je soupçonne qu'ils peuvent être adaptés pour aider à résoudre ce problème plus efficacement que la méthode naïve.
DW
@DW Merci pour la recommandation. J'ai essayé de chercher dans les arbres kd, mais je n'ai pas trouvé de moyen plus efficace pour résoudre ce problème.
flawr

Réponses:

1

Utilisez n'importe quel algorithme pour tous les voisins les plus proches ; alors vous pouvez résoudre trivialement votre problème. Un tel algorithme trouve, pour chaque point de données, son plus proche voisin. Le point le plus isolé est celui dont le voisin le plus proche est le plus éloigné, donc une fois que vous avez résolu tous les voisins les plus proches, vous pouvez trouver le point le plus isolé par un simple balayage linéaire.

Apparemment, tous les voisins les plus proches peuvent être trouvés en temps ; voir les références sur Wikipédia. Ou, si vous voulez quelque chose à implémenter, prenez n'importe quelle structure de données pour les voisins les plus proches, et pour chaque point , trouvez son voisin le plus proche.O(nJournaln)p

DW
la source
0

Comme suggéré dans les commentaires, j'examinerais les requêtes des voisins les plus proches.

Faire une NN-Query par point devrait être de l'ordre de donc c'est déjà mieux que la solution naïve.O(nlog(n))

Vous pouvez encore améliorer cela en ajoutant un paramètre à la requête NN qui contient la distance du voisin le plus proche du point le plus isolé que vous avez trouvé jusqu'à présent. Vous pouvez ensuite abandonner toute requête NN dès qu'elle trouve un point plus proche que . Cela devrait accélérer considérablement votre recherche.muneXmuneX

D'ailleurs, les gens suggèrent souvent KD-Trees pour NN-Search. Les arbres KD sont très faciles à mettre en œuvre mais d'après mon expérience, ils évoluent toujours moins bien avec des dimensions plus élevées que les autres arbres. Pour environ, je recommanderais d'utiliser un R-Tree, tel que R * Tree (R-Star-Tree), X-Tree ou STR-charger R-Tree, ou un PH-Tree (qui ressemble plus à un quadruple au niveau du bit).>dix

TilmannZ
la source