Динамическая выпуклая оболочка (достаточно 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" (и тут тоже)