Учитывая ряд точек, найдите, коллинеарна ли какая-либо из трех точек

Что является лучшим алгоритмом, чтобы найти, коллинеарны ли какие-либо три точки в ряде точек, говорят n. Также объясните сложность, если это не тривиально.

Спасибо
Бала

15
задан Gabriel Ščerbák 29 April 2010 в 09:46
поделиться

3 ответа

Если вы сможете придумать алгоритм лучше, чем 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), и он у вас уже есть :-)

.
15
ответ дан 1 December 2019 в 02:55
поделиться

Простой алгоритм O(d*N^2) по времени и пространству, где d - размерность, а N - количество точек (возможно, не оптимальный):

  • Создайте ограничивающую рамку вокруг множества точек (сделайте ее достаточно большой, чтобы на границе не было точек)
  • Для каждой пары точек вычислите прямую, проходящую через них.
  • Для каждой прямой вычислите две точки столкновения с ограничивающей рамкой.
  • Две точки столкновения определяют исходную линию, поэтому если есть совпадающие линии, они также дадут те же две точки столкновения.
  • Используйте хэш-множество, чтобы определить, есть ли дублирующиеся пары точек столкновения.
  • Существует 3 коллинеарные точки тогда и только тогда, когда есть дубликаты.
6
ответ дан 1 December 2019 в 02:55
поделиться

Другое простое (возможно, даже тривиальное) решение, которое не использует хеш-таблицу, выполняется за O (n 2 log n) времени и использует пространство O (n):

Пусть S - набор точек, мы опишем алгоритм, который определяет, содержит ли S три коллинеарных точки.

  1. Для каждой точки или в S выполните:
    1. Проведите линию L , параллельную оси x , через o .
    2. Замените каждую точку в S ниже L ее отражением. (Например, если L является осью x , (a, -x) для x> 0 станет ( а, х) после отражения). Пусть новый набор точек будет S '
    3. Угол каждой точки p в S' , является прямым углом сегмента po строкой L . Отсортируем точки S ' по их углам.
    4. Просмотрите отсортированные точки в S '. Если есть две последовательные точки, которые коллинеарны o - верните true.
  2. Если в цикле не обнаружены коллинеарные точки - вернуть false.

Цикл выполняется n раз, и каждая итерация выполняет nlog n шагов. Нетрудно доказать, что если на линии три точки, то они будут найдены, а иначе мы ничего не найдем.

4
ответ дан 1 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: