Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull — различия между версиями
Yurik (обсуждение | вклад) (→Алгоритм Эндрю) |
Yurik (обсуждение | вклад) (→Псевдокод) |
||
Строка 22: | Строка 22: | ||
== Псевдокод == | == Псевдокод == | ||
− | Inplace-реализация алгоритма. <tex>S[1..n]</tex> - исходное множество | + | Inplace-реализация алгоритма. <tex>S[1..n]</tex> - исходное множество, <tex>n > 2</tex> |
Jarvis(S) | Jarvis(S) |
Версия 14:14, 16 января 2014
Конспект не готов. |
Ниже приводятся основные алгоритмы построения выпуклых оболочек статического множества. Используются обозначения:
- размер входных данных, - размер оболочки.Алгоритм Джарвиса
По-другому "Gift wrapping algorithm" (Заворачивание подарка).
Описание Алгоритма
1) Возьмем самую правую нижнюю точку
нашего множества. Добавляем ее в ответ.2) На каждом следующем шаге для последнего добавленного
ищем среди всех недобавленных точек и с максимальным полярным углом относительно (Если углы равны, надо сравнивать по расстоянию). Добавляем в ответ. Если , заканчиваем алгоритм.
Корректность
Точка
, очевидно, принадлежит оболочке. На каждом последующем шаге алгоритма мы получаем прямую , по построению которой все точки множества лежат слева от нее. Значит, выпуклая оболочка состоит из -ых и только из них.Псевдокод
Inplace-реализация алгоритма.
- исходное множество,Jarvis(S) find i such that S[i] has the lowest y-coordinate and highest x-coordinate p0 = S[i] pi = p0 k = 0 do k++ for i = k..n if S[i] has lower angle and higher distance than S[k] in relation to pi swap(S[i], S[k]) pi = S[k] while pi != p0 return k
Сложность
Добавление каждой точки в ответ занимает
времени, всего точек будет , поэтому итоговая сложность .Ссылки
Алгоритм Грэхема
Описание Алгоритма
1)Находим самую правую нижнюю точку множества
, добавляем в ответ.2)Сортируем все остальные точки по полярному углу относительно
.3)Добавляем в ответ
- самую первую из отсортированных точек.4)Берем следующую по счету точку
. Пока и две последних точки в текущей оболочке и образуют неправый поворот, удаляем из оболочки .5)Добавляем в оболочку
.6)Делаем п.5, пока не закончатся точки.
Корректность
Конспект не готов. |
Докажем, что на каждом шаге множество
-тых является выпуклой оболочкой всех уже рассмотренных точек. Доказательство проведем по индукции.1)База. Для трех первых точек утверждение, очевидно, выполняется.
2)Переход. Предположим от противного, что утверждение на
-м шаге перестает выполняться. Тогда существует два варианта:- В нашей оболочке есть лишние точки.
Этого не может быть, так как на каждом шаге мы добавляем ровно одну точку, которая точно входит в оболочку, так как имеет наибольший полярный угол среди всех остальных.
- В нашей оболочке нет каких-то точек, которые есть в настоящей.
Удаляем мы только те
Псевдокод
Inplace-реализация алгоритма.
- исходное множество,Graham(S) find i such that S[i] has the lowest y-coordinate and highest x-coordinate swap(S[i], S[1]) sort S[2..n] by angle in relation to S[1] k = 2 for p = 3..n while S[k - 1], S[k], S[p] has non-right orientation k-- swap(S[p], S[k + 1]) return k
Сложность
Сортировка точек занимает
времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность этой части - . Суммарное время - .