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