web-dev-qa-db-fra.com

Comment trouver les deux points les plus éloignés?

C'est une question qui m'a été posée lors d'un entretien d'embauche il y a quelque temps. Et je n'arrive toujours pas à trouver une réponse raisonnable.

La question est:

on vous donne un ensemble de points (x, y). Trouvez les 2 points les plus éloignés. Distants les uns des autres.

Par exemple, pour les points: (0,0), (1,1), (-8, 5) - les plus éloignés sont: (1,1) et (-8,5) car leur distance est plus grande de à la fois (0,0) - (1,1) et (0,0) - (- 8,5).

L'approche évidente consiste à calculer toutes les distances entre tous les points et à trouver le maximum. Le problème est qu’il s’agit de O (n ^ 2), ce qui le rend excessivement coûteux pour les grands ensembles de données.

Il existe une approche avec les premiers points de suivi situés sur la limite, puis le calcul de leur distance, en partant du principe qu'il y aura moins de points sur la limite que "l'intérieur", mais cela reste coûteux et échouera dans le pire des cas.

J'ai essayé de chercher sur le Web, mais je n’ai trouvé aucune réponse raisonnable - même s’il s’agissait peut-être simplement de mon manque de compétences en matière de recherche.

44
user80168

EDIT: Une solution consiste à trouver le convexe coque http://en.wikipedia.org/wiki/Convex_hull de l'ensemble des points, puis les deux les points distants sont des sommets de cela.

Peut-être répondu ici: Algorithme pour trouver deux points les plus éloignés l'un de l'autre

Également:

20
zaf

Les algorithmes de points limites abondent (recherchez des algorithmes de coque convexe). À partir de là, cela devrait prendre O(N) pour trouver les points opposés les plus éloignés.

D'après les commentaires de l'auteur: trouvez d'abord une paire de points opposés sur la coque, puis contournez-la à demi-serré. Selon les angles entre les arêtes, vous devrez avancer l'un ou l'autre marcheur, mais il faudra toujours O(N) pour faire le tour de la coque.

8
Marcelo Cantos

Trouvez la moyenne de tous les points, mesurez la différence entre tous les points et la moyenne, prenez le point à la plus grande distance de la moyenne et trouvez le point le plus éloigné de celle-ci. Ces points seront les coins absolus de la coque convexe et les deux points les plus éloignés. Je l’ai récemment fait pour un projet nécessitant des coques convexes confinées à des plans infinis dirigés au hasard. Cela a très bien fonctionné. 

6
Rich Colburn

Cette question est introduite dans Introduction à l’algorithme. Il a mentionné 1) Calcul Convex Hull O (NlgN). 2) S'il y a M vectex sur Convex Hull. Ensuite, nous avons besoin de O(M) pour trouver la paire la plus éloignée. 

Je trouve ces liens utiles. Il inclut une analyse des détails de l’algorithme et du programme . http://www.seas.gwu.edu/~simhaweb/alg/lectures/module1/module1.html

Souhaitez que cela soit utile.

3
yuan

Vous recherchez un algorithme permettant de calculer le diamètre d'un ensemble de points, Diam (S). On peut montrer qu'il s'agit du même diamètre que celui de la coque convexe de S, Diam (S) = Diam (CH (S)). Donc, calculez d’abord la coque convexe de l’ensemble.

Maintenant, vous devez trouver tous les points antipodaux sur la coque convexe et choisir la paire avec une distance maximale. Il existe O(n) points antipodaux sur un polygone convexe. Cela donne donc un algorithme O (n lg n)} pour trouver les points les plus éloignés.

Cette technique est appelée Compas rotatifs. C'est ce que décrit Marcelo Cantos dans sa réponse.

Si vous écrivez soigneusement l'algorithme, vous pouvez le faire sans calculer les angles. Pour plus de détails, vérifiez ceci URL .

2
saadtaame

Un algorithme stochastique pour trouver la paire la plus éloignée serait

  • Choisissez un point au hasard
  • Obtenez le point le plus éloigné
  • Répétez quelques fois
  • Supprimer tous les points visités
  • Choisissez un autre point aléatoire et répétez plusieurs fois.

Vous êtes dans O(n) tant que vous prédéterminez "quelques fois", mais que vous n'êtes pas sûr de trouver la paire la plus éloignée. Mais en fonction de vos points, le résultat devrait être plutôt bon. =)

2
Jens

Un point de départ pourrait être d'examiner les problèmes les plus proches, qui ont été examinés. Wikipedia répertorie quelques options:

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

0
Joel Goodwin

Cela semble facile si les points sont donnés en coordonnées cartésiennes. Si facile que je suis à peu près sûr de passer à côté de quelque chose. N'hésitez pas à signaler ce qui me manque!

  1. Trouvez les points avec les valeurs maximales et minimales de leurs coordonnées x, y et z (total de 6 points). Ceux-ci devraient être les plus "distants" de tous les points limites.
  2. Calculer toutes les distances (30 distances uniques)
  3. Trouver la distance maximale
  4. Les deux points qui correspondent à cette distance maximale sont ceux que vous recherchez.
0
Justin Henrie

Juste quelques réflexions:

Vous pouvez ne regarder que les points qui définissent la coque convexe de votre ensemble de points pour en réduire le nombre, ... mais cela semble quand même un peu "pas optimal".

Sinon, il pourrait y avoir une approche récursive quad-oct/arbre pour rapidement relier certaines distances entre des ensembles de points et éliminer une grande partie de vos données.

0
Adrien