Il n'y a probablement pas de solution à ce problème qui est nettement mieux que O(n^2) dans un modèle standard de calcul.
Le problème de recherche de trois points colinéaires se réduit au problème de trouver la ligne qui passe par le plus de points, et de trouver trois points colinéaires est 3SUM-dur, ce qui signifie que de le résoudre en moins de O(n^2) serait un résultat théorique.
Voir la question précédente sur la recherche de trois points colinéaires.
Pour votre référence (à l'aide de l'connu la preuve), supposons que nous voulons répondre à un 3SUM problème tel que de trouver x, y, z dans la liste des X tels que x + y + z = 0. Si nous avions un algorithme rapide pour la colinéaires point de problème, nous avons pu utiliser cet algorithme pour résoudre le 3SUM problème comme suit.
Pour chaque x dans X, créer le point (x, x^3) (pour l'instant, nous supposons que les éléments de X sont distincts). Ensuite, vérifiez s'il existe trois points colinéaires parmi les points créés.
De voir que cela fonctionne, remarque que si x + y + z = 0 alors la pente de la droite de x à y est
(y^3 - x^3) / (y - x) = y^2 + yx + x^2
et la pente de la droite de x à z est
(z^3 - x^3) / (z - x) = z^2 + zx + x^2 = (-(x + y))^2 - (x + y)x + x^2
= x^2 + 2xy + y^2 - x^2 - xy + x^2 = y^2 + yx + x^2
A l'inverse, si la pente de x à y est égal à la pente de x à z
y^2 + yx + x^2 = z^2 + zx + x^2,
ce qui implique que
(y - z) (x + y + z) = 0,
donc soit y = z ou z = -x - y comme suffit à prouver que la réduction est valide.
Si il y a des doublons dans X, vous devez d'abord vérifier si x + 2y = 0 pour tout x et dupliquez-y de l'élément (en temps linéaire en utilisant le hachage ou O(n lg n) le temps à l'aide de tri), puis supprimer les doublons avant de réduire à la colinéaires point trouver de problème.