Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull — различия между версиями
Yurik (обсуждение | вклад) (→Алгоритм Эндрю) |
Yurik (обсуждение | вклад) (→Алгоритм Грэхема) |
||
Строка 50: | Строка 50: | ||
== Описание Алгоритма == | == Описание Алгоритма == | ||
− | [[File: | + | [[File:Graham2.png|thumb|400px|Промежуточный шаг алгоритма. Зелеными линиями обозначена текущая выпуклая оболочка, синими - промежуточные соединения точек, красными - те отрезки, которые раньше входили в оболочку, а сейчас нет. На текущем шаге при добавлении точки <tex>p</tex> последовательно убираем из оболочки точки с <tex>i+3</tex>-ей до <tex>i+1</tex>-ой]] |
+ | |||
1)Находим самую правую нижнюю точку множества <tex>p_0</tex>, добавляем в ответ. | 1)Находим самую правую нижнюю точку множества <tex>p_0</tex>, добавляем в ответ. | ||
+ | |||
2)Сортируем все остальные точки по полярному углу относительно <tex>p_0</tex>. | 2)Сортируем все остальные точки по полярному углу относительно <tex>p_0</tex>. | ||
+ | |||
3)Добавляем в ответ <tex>p_1</tex> - самую первую из отсортированных точек. | 3)Добавляем в ответ <tex>p_1</tex> - самую первую из отсортированных точек. | ||
− | 4)Берем следующую по счету точку | + | |
− | 5)Делаем п. | + | 4)Берем следующую по счету точку <tex>t</tex>. Пока <tex>t</tex> и две последних точки в текущей оболочке <tex>p_i</tex> и <tex>p_{i-1}</tex> образуют неправый поворот, удаляем из оболочки <tex>p_i</tex>. |
+ | |||
+ | 5)Добавляем в оболочку <tex>t</tex>. | ||
+ | |||
+ | 6)Делаем п.5, пока не закончатся точки. | ||
== Корректность == | == Корректность == | ||
Строка 62: | Строка 69: | ||
== Псевдокод == | == Псевдокод == | ||
− | |||
− | |||
== Сложность == | == Сложность == | ||
− | Сортировка точек занимает <tex>O(n log n)</tex> времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность этой части - <tex>O(n)</tex>. Суммарное время - <tex>O(n log n)</tex>. | + | Сортировка точек занимает <tex>O(n \log n)</tex> времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность этой части - <tex>O(n)</tex>. Суммарное время - <tex>O(n \log n)</tex>. |
− | |||
= Алгоритм = | = Алгоритм = |
Версия 12:53, 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, пока не закончатся точки.
Корректность
Псевдокод
Сложность
Сортировка точек занимает
времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность этой части - . Суммарное время - .