Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull — различия между версиями
Yurik (обсуждение | вклад) (→Алгоритм Джарвиса) |
Yurik (обсуждение | вклад) (→Псевдокод) |
||
| Строка 32: | Строка 32: | ||
k++; | k++; | ||
while S[k-1] != S[1] | while S[k-1] != S[1] | ||
| − | + | return k | |
== Сложность == | == Сложность == | ||
Версия 09:37, 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
Сложность
Добавление каждой точки в ответ занимает времени, всего точек будет , поэтому итоговая сложность .