Вероятно, нет решения этой проблемы, которое было бы значительно лучше, чем O (n ^ 2) в стандартной модели вычислений.
Проблема нахождения трех коллинеарных точек сводится к проблеме нахождения линииэто проходит через большинство точек, и нахождение трех коллинеарных точек является трудностью 3SUM, означая, что решение этого вопроса менее чем за O (n ^ 2) времени будет основным теоретическим результатом.
См. предыдущийвопрос о нахождении трех коллинеарных точек.
Для справки (используя известное доказательство) предположим, что мы хотим ответить на задачу 3SUM, такую как поиск x, y, z в списке X, такой, что x + y+ z = 0. Если бы у нас был быстрый алгоритм для коллинеарной точечной задачи, мы могли бы использовать этот алгоритм для решения задачи 3SUM следующим образом.
Для каждого x в X создайте точку (x, x ^ 3) (пока мы предполагаем, что элементы X различны).Затем проверьте, существуют ли три коллинеарные точки среди созданных точек.
Чтобы убедиться, что это работает, обратите внимание, что если x + y + z = 0, то наклон линии от x до y равен * 1013.*
(y ^ 3 - x ^ 3) / (y - x) = y ^ 2 + yx + x ^ 2
, а наклон линии от x до z равен
(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
И наоборот, если наклон от x до y равен наклону от x доz тогда
y ^ 2 + yx + x ^ 2 = z ^ 2 + zx + x ^ 2,
, что означает, что
(y - z) (x+ y + z) = 0,
, поэтому достаточно либо y = z, либо z = -x - y, чтобы доказать, что сокращение действительно.
Если в X есть дубликаты, высначала проверьте, является ли x + 2y = 0 для любого элемента x и дублирующего элемента y (в линейное время, используя хэширование или время O (n lg n), используя сортировку), а затем удалите дубликаты, прежде чем переходить к коллинеарной задаче нахождения точки.*