Динамическая выпуклая оболочка (достаточно log^2 на добавление/удаление) — различия между версиями
(Новая страница: «<div style="background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1p...») |
|||
Строка 6: | Строка 6: | ||
В статье описан алгоритм, требующий <tex>O(\log^2{n})</tex> времени на добавление/удаление точки. | В статье описан алгоритм, требующий <tex>O(\log^2{n})</tex> времени на добавление/удаление точки. | ||
− | == | + | == Структура данных == |
− | Определим | + | Определим верхнюю (нижнюю) выпуклую оболочку множества точек <tex>P</tex>, как выпуклую оболочку множества <tex>P \cup \{\infty_-\} </tex> <tex>(P \cup \{\infty_+\})</tex>, где <tex>\infty_- = (0, -\infty), \infty_+ = (0, +\infty)</tex>. Тогда задачу можно свести к поддержанию отдельно верхней и нижней выпуклых оболочек. Далее будем рассматривать только динамическое поддержание верхней оболочки (далее, для краткости, будем называть её просто выпуклой оболочкой). |
+ | |||
+ | Будем хранить отсортированные лексикографически (<tex>p < q \Leftrightarrow p_x < q_x \lor p_x = q_x \land p_y < q_y</tex>) точки в листьях сбалансированного бинарного дерева поиска (например, [[Красно-черное дерево|красно-черного]] или [[АВЛ-дерево|AVL]]). Во внутренних вершинах будем хранить вспомогательную информацию: во-первых, наименьшую точку в поддереве с корнем в данной вершине; а во-вторых, пару точек, определяющих общую касательную к выпуклым оболочкам точек левого и правого поддеревьев данной вершины (будем называть такую пару точек мостом). | ||
+ | |||
+ | == Операции == | ||
+ | |||
+ | === Получение выпуклой оболочки === | ||
+ | |||
+ | === Принадлежность точки выпуклой оболочке === | ||
+ | |||
+ | === Вставка точки === | ||
+ | |||
+ | === Удаление точки === | ||
− | |||
== Источники == | == Источники == | ||
+ | * [https://github.com/antonkov/cg/blob/master/include/cg/convex_hull/dynamic_hull.h Реализация Антона Ковшарова] | ||
+ | * Ф. Препарата, М. Шеймос. Вычислительная геометрия (1989). стр. 151 (тут описан более сложный алгоритм с двухуровневой структурой данных, но с такой же асимптотикой) | ||
+ | * Overmars, M. H.; van Leeuwen, J. (1981), "Maintenance of configurations in the plane" (и тут тоже) | ||
+ | |||
+ | [[Категория: Вычислительная геометрия]] |
Версия 11:15, 21 января 2014
Эта статья находится в разработке!
Пусть дано изначально пустое множество и последовательность точек , которые последовательно добавляются или удаляются из (естественно, точка может быть удалена, если она уже принадлежит ). Требуется на каждой итерации поддерживать выпуклую оболочку .
В статье описан алгоритм, требующий
времени на добавление/удаление точки.Содержание
Структура данных
Определим верхнюю (нижнюю) выпуклую оболочку множества точек
, как выпуклую оболочку множества , где . Тогда задачу можно свести к поддержанию отдельно верхней и нижней выпуклых оболочек. Далее будем рассматривать только динамическое поддержание верхней оболочки (далее, для краткости, будем называть её просто выпуклой оболочкой).Будем хранить отсортированные лексикографически (красно-черного или AVL). Во внутренних вершинах будем хранить вспомогательную информацию: во-первых, наименьшую точку в поддереве с корнем в данной вершине; а во-вторых, пару точек, определяющих общую касательную к выпуклым оболочкам точек левого и правого поддеревьев данной вершины (будем называть такую пару точек мостом).
) точки в листьях сбалансированного бинарного дерева поиска (например,Операции
Получение выпуклой оболочки
Принадлежность точки выпуклой оболочке
Вставка точки
Удаление точки
Источники
- Реализация Антона Ковшарова
- Ф. Препарата, М. Шеймос. Вычислительная геометрия (1989). стр. 151 (тут описан более сложный алгоритм с двухуровневой структурой данных, но с такой же асимптотикой)
- Overmars, M. H.; van Leeuwen, J. (1981), "Maintenance of configurations in the plane" (и тут тоже)