Что является лучшим алгоритмом, чтобы найти, коллинеарны ли какие-либо три точки в ряде точек, говорят n. Также объясните сложность, если это не тривиально.
Спасибо
Бала
Если вы сможете придумать алгоритм лучше, чем O(N^2), вы можете опубликовать его!
Эта проблема 3-SUM Hard, и существует ли для нее субквадратичный алгоритм (т.е. лучше, чем O(N^2)) - это открытая проблема. Было показано, что многие обычные задачи вычислительной геометрии (включая вашу) являются 3SUM-трудными, и этот класс задач постоянно растет. Как и NP-трудность, концепция 3SUM-трудности оказалась полезной для доказательства "крутизны" некоторых проблем.
Для доказательства того, что ваша проблема является 3SUM-трудной, обратитесь к превосходной статье Surver: http://www.cs.mcgill.ca/~jking/papers/3sumhard.pdf
Ваша проблема появляется на странице 3 (удобно названной 3-POINTS-ON-LINE) в вышеупомянутой статье.
Итак, лучший из известных на данный момент алгоритмов - O(N^2), и он у вас уже есть :-)
.Простой алгоритм O(d*N^2) по времени и пространству, где d - размерность, а N - количество точек (возможно, не оптимальный):
Другое простое (возможно, даже тривиальное) решение, которое не использует хеш-таблицу, выполняется за O (n 2 log n) времени и использует пространство O (n):
Пусть S
- набор точек, мы опишем алгоритм, который определяет, содержит ли S
три коллинеарных точки.
или
в S
выполните:
L
, параллельную оси x
, через o
. S
ниже L
ее отражением. (Например, если L
является осью x
, (a, -x)
для x> 0
станет ( а, х)
после отражения). Пусть новый набор точек будет S '
p
в S'
, является прямым углом сегмента po
строкой L
. Отсортируем точки S '
по их углам. S '
. Если есть две последовательные точки, которые коллинеарны o
- верните true. Цикл выполняется n
раз, и каждая итерация выполняет nlog n
шагов. Нетрудно доказать, что если на линии три точки, то они будут найдены, а иначе мы ничего не найдем.