Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull — различия между версиями
Yurik (обсуждение | вклад) |
Yurik (обсуждение | вклад) (→Алгоритм Грехэма) |
||
| Строка 40: | Строка 40: | ||
Добавление каждой точки в ответ занимает <tex>O(n)</tex> времени, всего точек будет <tex>k</tex>, поэтому итоговая сложность <tex>O(nk)</tex>. | Добавление каждой точки в ответ занимает <tex>O(n)</tex> времени, всего точек будет <tex>k</tex>, поэтому итоговая сложность <tex>O(nk)</tex>. | ||
| − | = Алгоритм | + | = Алгоритм Грэхема = |
== Описание Алгоритма == | == Описание Алгоритма == | ||
| − | == | + | [[File:Temp.gif|thumb|250px|Промежуточный шаг алгоритма]] |
| + | 1)Находим самую правую нижнюю точку множества <tex>p_0</tex>, добавляем в ответ. | ||
| + | 2)Сортируем все остальные точки по полярному углу относительно <tex>p_0</tex>. | ||
| + | 3)Добавляем в ответ <tex>p_1</tex> - самую первую из отсортированных точек. | ||
| + | 4)Берем следующую по счету точку в массиве <tex>t</tex>. Пока <tex>t</tex> и две последних точке в ответе образуют неправый поворот, удаляем из ответа последнюю точку. | ||
| + | 5)Делаем п.4, пока не закончатся точки. | ||
| + | |||
| + | == Корректность == | ||
| + | |||
== Псевдокод == | == Псевдокод == | ||
| + | |||
| + | Подаем в функцию исходное множество S, возвращаем позицию <tex>k</tex> - в <tex>S[1..k - 1]</tex> будет хранится наша оболочка. | ||
| + | <tex>turn(a, b, c)</tex> - модифицированная функция поворота, учитывающая случай, когда точки лежат на одной прямой. | ||
| + | |||
== Сложность == | == Сложность == | ||
| + | |||
| + | Сортировка точек занимает <tex>O(n log n)</tex> времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность этой части - <tex>O(n)</tex>. Суммарное время - <tex>O(n log n)</tex>. | ||
= Алгоритм Эндрю = | = Алгоритм Эндрю = | ||
= Алгоритм Чена = | = Алгоритм Чена = | ||
= Алгоритм QuickHull = | = Алгоритм QuickHull = | ||
Версия 11:35, 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
Сложность
Добавление каждой точки в ответ занимает времени, всего точек будет , поэтому итоговая сложность .
Алгоритм Грэхема
Описание Алгоритма
1)Находим самую правую нижнюю точку множества , добавляем в ответ. 2)Сортируем все остальные точки по полярному углу относительно . 3)Добавляем в ответ - самую первую из отсортированных точек. 4)Берем следующую по счету точку в массиве . Пока и две последних точке в ответе образуют неправый поворот, удаляем из ответа последнюю точку. 5)Делаем п.4, пока не закончатся точки.
Корректность
Псевдокод
Подаем в функцию исходное множество S, возвращаем позицию - в будет хранится наша оболочка. - модифицированная функция поворота, учитывающая случай, когда точки лежат на одной прямой.
Сложность
Сортировка точек занимает времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность этой части - . Суммарное время - .