Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull — различия между версиями
Yurik (обсуждение | вклад) (→Псевдокод) |
Yurik (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
{{notready}} | {{notready}} | ||
+ | Ниже приводятся основные алгоритмы построения выпуклых оболочек статического множества. Используются обозначения: <tex>n</tex> - размер входных данных, <tex>k</tex> - размер оболочки. | ||
+ | |||
= Алгоритм Джарвиса = | = Алгоритм Джарвиса = | ||
Версия 11:19, 13 января 2014
Конспект не готов. |
Ниже приводятся основные алгоритмы построения выпуклых оболочек статического множества. Используются обозначения:
- размер входных данных, - размер оболочки.Содержание
Алгоритм Джарвиса
По-другому "Заворачивание подарка"
Описание Алгоритма
1) Возьмем самую правую нижнюю точку
нашего множества. Добавляем ее в ответ.2) На каждом следующем шаге для последнего добавленного
ищем среди всех недобавленных точек и с максимальным полярным углом относительно (Если углы равны, надо сравнивать по расстоянию). Добавляем в ответ. Если , заканчиваем алгоритм.Корректность
Точка
, очевидно, принадлежит оболочке. На каждом шаге мы получаем прямую , по построениению которой все точки множества лежат слева от нее. Значит эти точки принадлежат выпуклой оболочке.Псевдокод
Подаем в функцию исходное множество S, возвращаем позицию
- в будет хранится наша оболочка. - модифицированная функция поворота, учитывающая случай, когда точки лежат на одной прямой.Jarvis(S) for i = 1..n if S[i] is right and higher than S[1] swap(S[1], S[i]) k = 1 do for i = 1 and k+1..n if (turn(S[k+1], S[i], S[k])) swap(S[k+1], S[k]) k++; while S[k-1] != S[1] return k
Сложность
Добавление каждой точки в ответ занимает
времени, всего точек будет , поэтому итоговая сложность .