Динамическая выпуклая оболочка (достаточно log^2 на добавление/удаление)
Пусть дано множество точек , изначально пустое, и последовательность точек , которые последовательно добавляются или удаляются из (естественно, точка может быть удалена, если она уже принадлежит ). Требуется динамически поддерживать выпуклую оболочку .
В статье описан алгоритм, требующий
времени на добавление/удаление точки.Содержание
Левая и правая выпуклые оболочки
Определим левую (правую) выпуклую оболочку множества точек
, как выпуклую оболочку множества , где . Тогда задачу можно свести к поддержанию отдельно левой и правой выпуклых оболочек. Далее будем рассматривать только динамическое поддержание левой оболочки (далее, для краткости, будем называть её просто выпуклой оболочкой). Заметим также, что точки вдоль выпуклой оболочки отсортированы по ординате.Структура данных
Будем хранить отсортированные лексикографически (красно-черного или AVL). Во внутренних вершинах будем хранить вспомогательную информацию: во-первых, наименьшую точку в поддереве с корнем в данной вершине; а во-вторых, пару точек, определяющих общую касательную к выпуклым оболочкам точек левого и правого поддеревьев данной вершины (будем называть такую пару точек мостом).
) точки в листьях сбалансированного бинарного дерева поиска (например,Операции
Получение выпуклой оболочки
Принадлежность точки выпуклой оболочке
Вставка точки
Удаление точки
Удаление точки производится по аналогии с вставкой: сначала мы удалим точку из сбалансированного дерева поиска, а затем пересчитаем мосты, хранящиеся в вершинах, которые затронула балансировка. Очевидно, что удаление, как и вставка, работает за
.Источники
- Реализация Антона Ковшарова
- Ф. Препарата, М. Шеймос. Вычислительная геометрия (1989). стр. 151 (тут описан более сложный алгоритм с двухуровневой структурой данных, но с такой же асимптотикой)
- Overmars, M. H.; van Leeuwen, J. (1981), "Maintenance of configurations in the plane" (и тут тоже)