Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull — различия между версиями
Yurik (обсуждение | вклад) (→Описание Алгоритма) |
Yurik (обсуждение | вклад) (→Алгоритм Грэхема) |
||
| Строка 67: | Строка 67: | ||
== Корректность == | == Корректность == | ||
| + | {{notready}} | ||
| + | |||
| + | Докажем, что на каждом шаге множество <tex>p_i</tex>-тых является выпуклой оболочкой всех уже рассмотренных точек. Доказательство проведем по индукции. | ||
| + | |||
| + | 1)База. Для трех первых точек утверждение, очевидно, выполняется. | ||
| + | |||
| + | 2)Переход. Предположим от противного, что утверждение на <tex>i</tex>-м шаге перестает выполняться. Тогда существует два варианта: | ||
| + | * В нашей оболочке есть лишние точки. | ||
| + | Этого не может быть, так как на каждом шаге мы добавляем ровно одну точку, которая точно входит в оболочку, так как имеет наибольший полярный угол среди всех остальных. | ||
| + | |||
| + | * В нашей оболочке нет каких-то точек, которые есть в настоящей. | ||
| + | Удаляем мы только те | ||
== Псевдокод == | == Псевдокод == | ||
| − | + | Inplace-реализация алгоритма. <tex>S[1..n]</tex> - исходное множество, <tex>n > 2</tex> | |
| + | |||
| + | 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 | ||
== Сложность == | == Сложность == | ||
Сортировка точек занимает <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>. | ||
| + | |||
| + | == Ссылки == | ||
| + | |||
| + | * [http://en.wikipedia.org/wiki/Graham_scan Английская статья — Wikipedia] | ||
| + | * [http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%93%D1%80%D1%8D%D1%85%D0%B5%D0%BC%D0%B0 Русская статья — Wikipedia] | ||
= Алгоритм = | = Алгоритм = | ||
Версия 14:13, 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
Сложность
Сортировка точек занимает времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность этой части - . Суммарное время - .