Дан набор точек в плоскости; предложите критерии и алгоритмы определения, образуют ли они вершины выпуклого многоугольника, минимальной по включению оболочки, сравните сложности алгоритмов.

25 Ноя в 11:52
5 +5
0
Ответы
1
Кратко — критерий: все заданные точки должны быть экстремальными (vertices) выпуклой оболочки множества; эквивалентно — их множество совпадает с множеством вершин выпуклой оболочки (и при требовании «вершины» — ни одна точка не лежит строго внутри или на отрезке между двумя других вершин).
1) Формулировки/критерии
- Точка ppp экстремальна ⇔ не существует представления p=∑i≠pλixip=\sum_{i\ne p}\lambda_i x_ip=i=p λi xi с λi≥0, ∑λi=1\lambda_i\ge0,\ \sum\lambda_i=1λi 0, λi =1.
- Набор точек в «выпуклой позиции» ⇔ ни одна точка не лежит внутри выпуклой оболочки остальных.
- Практически: вычислить выпуклую оболочку HHH множества; если множество вершин HHH совпадает с исходным множеством (и, при строгом требовании на вершины, на HHH нет коллинеарных внутренних точек на ребрах), то ответ — да.
2) Полный алгоритм (рекомендованный)
- Удалить дубликаты; пусть nnn — число оставшихся точек.
- Построить выпуклую оболочку (например, алгоритм Andrew / monotone chain или Graham scan), получив упорядоченный список вершин HHH.
- Для вычисления ориентации троек точек (a,b,c)(a,b,c)(a,b,c) используйте знак векторного произведения
orient(a,b,c)=(bx−ax)(cy−by)−(by−ay)(cx−bx).\text{orient}(a,b,c)= (b_x-a_x)(c_y-b_y)-(b_y-a_y)(c_x-b_x).orient(a,b,c)=(bx ax )(cy by )(by ay )(cx bx ). Положительный знак — левый поворот, отрицательный — правый, ноль — коллинеарны.
- Сравнить размеры: если ∣H∣=n|H|=nH=n и при этом для всех соседних троек вершин orient≠0\text{orient}\ne0orient=0 (нет коллинеарных подряд точек), то все точки являются вершинами минимальной по включению выпуклой оболочки. Иначе — нет.
3) Варианты алгоритмов и сложности
- Andrew (monotone chain) или Graham scan: построение оболочки за O(nlog⁡n)O(n\log n)O(nlogn) (сортировка по x/углу) и затем линейная постройка. Общая сложность O(nlog⁡n)O(n\log n)O(nlogn).
- Gift wrapping (Jarvis march): O(nh)O(nh)O(nh), где h=∣H∣h=|H|h=H. Хорошо, когда hhh мало, худший случай O(n2)O(n^2)O(n2).
- Chan’s algorithm: O(nlog⁡h)O(n\log h)O(nlogh) — оптимально при малом hhh.
- Quickhull: обычно O(nlog⁡n)O(n\log n)O(nlogn) на практике, но худший случай O(n2)O(n^2)O(n2).
- Альтернатива для верификации, если дано предполагаемое упорядочение вершин: сортировка по углу вокруг внутренней точки + проверка ориентаций всех подряд троек — итого O(nlog⁡n)O(n\log n)O(nlogn) (сортировка) и затем O(n)O(n)O(n) проверок. Если упорядочение уже есть — проверка за O(n)O(n)O(n).
4) Замечания по коллинеарности
- Если допускаются точки, лежащие на ребрах (коллинеарные между двумя «угловыми» вершинами), то такие точки не считаются вершинами минимальной по включению оболочки. Чтобы учесть это, при построении оболочки можно настроить алгоритм на исключение коллинеарных внутренних точек (например, при Andrew при равенстве ориентации удалять среднюю точку).
Вывод: самый простой и надёжный путь — построить выпуклую оболочку (Andrew/Graham) за O(nlog⁡n)O(n\log n)O(nlogn) и проверить равенство множеств вершин; при необходимости использовать Jarvis/Chan для специальных случаев (мало вершин).
25 Ноя в 13:02
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир