Étant donné un ensemble de points, trouvez si l'un des trois points est colinéaire
Quel est le meilleur algorithme pour trouver si les trois points sont colinéaires dans un ensemble de points-dire n. Veuillez également expliquer la complexité, si elle n'est pas négligeable.
Grâce
Bala
source d'informationauteur Boolean
Vous devez vous connecter pour publier un commentaire.
Si vous pouvez trouver une meilleure que O(N^2) l'algorithme, vous pouvez le publier!
Ce problème est 3-SOMME Duret si il y a un sous-quadratique de l'algorithme (c'est à dire mieux que O(N^2)) car c'est un problème ouvert. De nombreuses communes de calcul des problèmes de géométrie (y compris la vôtre) ont été montré pour être 3SUM dur et cette classe de problèmes est en croissance. Comme NP-Dureté, la notion de 3SUM de la Dureté de l'a prouvé utile pour prouver la "ténacité" de certains problèmes.
Une preuve que votre problème est 3SUM dur, reportez-vous à l'excellent surver papier ici: http://www.cs.mcgill.ca/~jking/documents/3sumhard.pdf
Votre problème apparaît à la page 3 (idéalement appelé 3-POINTS SUR la LIGNE) dans le mentionné ci-dessus le papier.
Donc, le mieux connu de l'algorithme est O(N^2) et que vous l'avez déjà 🙂
Une simple O(d*N^2) le temps et l'espace de l'algorithme, où d est la dimension et N est le nombre de points (probablement pas optimale):
Un autre simple (peut-être même trivial) solution qui permet de ne pas utiliser une table de hachage, s'exécute en O(n2log n) le temps, et utilise O(n) de l'espace:
Laisser
S
être un ensemble de points, nous allons décrire un algorithme qui détermine si ou nonS
contient des trois points colinéaires.o
dansS
faire:L
parallèle à lax
-axeo
.S
ci-dessousL
avec son reflet. (Par exemple siL
est lex
axe,(a,-x)
pourx>0
deviendra(a,x)
après la réflexion). Laissez le nouvel ensemble de pointsS'
p
dansS'
est le droit de l'angle du segmentpo
avec la ligneL
. Permettez-nous de trier les points deS'
par leurs angles.S'
. Si il y a deux points consécutifs qui sont colinéaireso
- return true.La boucle s'exécute
n
fois, et à chaque itération effectuenlog n
étapes. Il n'est pas difficile de prouver que si il y a trois points sur une ligne, qu'ils soient trouvés, et nous trouverons rien sinon.