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