Задача динамічної підтримки опуклої оболонки
Задача динамічної підтримки опуклої оболонки належить класу динамічних задач обчислювальної геометрії. Вона полягає в підтримці опуклої оболонки для набору вхідних даних що динамічно змінюються, тобто додаються, видаляються або змінюються.
Формальна постановка задачі
Задані порожня множина S і послідовність із N точок (р1, р2, ..., рN ), кожна з яких або додається до множини S, або вилучається з неї. Необхідно підтримувати опуклу оболонку множини S. Використовується той факт, що границя опуклої оболонки є об'єднанням двох (опуклих) монотонних ламаних ліній (ланцюгів), які обмежують оболонку зверху і знизу і відповідно до цього називаються В-оболонкою і Н-оболонкою множини точок. Розглянемо побудову В-оболонки.
Алгоритм
Відповідна структура даних організована наступним чином. Її основою є збалансоване за висотою двійкове дерево пошуку Т, листки якого використовуються для збереження точок поточної множини. Процедура пошуку буде проводитися відповідно до значення абсциси точок, тобто проходження листків дерева зліва направо дає множину точок, впорядковану за x-координатою. Зазначимо, що послідовність точок В-оболонки (її вершин) також впорядкована за зростанням абсциси, і, тому вона є підпослідовністю глобальної послідовності точок, яка зберігається в листках дерева. Упорядковуємо S за x-координатою. Нехай v — вузол дерева Т. Позначимо через ЛСИН[v] і ПСИН[v] його лівого і правого нащадків відповідно. Побудуємо В-оболонку точок, які зберігаються в листках піддерева з коренем у вузлі v. Позначимо через U(v) В-оболонку множини точок, які зберігаються в листках піддерева з коренем v. Виходячи із принципу індукції, припустимо, що вже існують U(ЛСИН[v]) і U(ПСИН[v]). Далі (мал. 2) визначаються дві опорні точки р1 і р2 єдиного спільного опорного відрізку для двох оболонок. Тут використовується функція З'ЄДНАТИ(U1, U2), яка дозволяє знайти опорний відрізок для двох В-оболонок U1, U2. Функція З'ЄДНАТИ дозволяє ефективно розчіпляти U1 на два ланцюги, які складають впорядковану пару (U11, U12), і аналогично U2- на пару ланцюгів (U21, U22). При цьому виконується така умова: опорна точка р1 ∈ U1 входить до складу U11, а точка р2 ∈ U2 — до складу U22 (тобто в обох випадках опорна точка належить «зовнішньому» підланцюгу). На цьому етапі, зчепивши U11 і U22, одержуємо шукану В-оболонку U1 ∪ U2. Природно, щоб кожен вузол v дерева Т вказував на зчеплену чергу, яка представляє ту частину U(v), яка не належить U(БАТЬКО[v]).
Обернена операція: маючи U(v), одержати U(ЛСИН[v]) і U(ПСИН[v]).
Знаючи ребро [р1, р2], яке з'єднує опорні точки (одне ціле число J[v], яке вказує на положення точки р1 у ланцюзі вершин U(v)), можна розчепити U(v) на ланцюги U11 і U22, які в свою чергу можуть бути зчеплені з ланцюгами, що зберігаються в ЛСИН[v] і ПСИН[v] відповідно. Структура даних Т доповнюється такими атрибутами, які пов'язуються з кожним вузлом v дерева:
- Вказівником на зчеплену чергу Q[v], яка містить частину U(v), що не входить до U(БАТЬКО[v]) (якщо v є коренем, то Q[v]=U(v)).
- Цілим числом J[v], яке вказує на положення (індекс) лівої опорної точки в U(v)
Функція З'ЄДНАТИ(U1, U2):
- Знайти р1 і р2.
- Розчепити U1 на U11 та U12.
- Розчепити U2 на U21 та U22.
- Зчепити U11 з U22 ⇔ CH(S1 ∪ S2): U11*U22
Структура даних використовує пам'ять об'ємом О(N).
Враховуючи, що операції розчеплення і зчеплення зчеплених черг є стандартними, наша увага буде зосереджена на операції, що виконується функцією З'ЄДНАТИ, для якої був запропонований наступний розв'язок:
Лема 1 З'єднання двох розділених опуклих ланцюгів, які містять в сумі N точок, може бути виконане за О(logN) кроків.
Доведення. Нехай дано дві В-оболонки U1, U2 і дві вершини q1 ∈ U1, q2∈U2. Кожна із цих двох вершин може бути класифікована відносно відрізка [q1,q2] як опукла, опорна або ввігнута. Залежно від класифікації можливі 9 випадків, схематично зображених на малюнку 3(а). Усі випадки зрозумілі за винятком випадку (q1,q2) = (ввігнута, ввігнута), який детальніше представлений на малюнку 3 (б). Нехай пряма l1 проходить через q1 і її правого сусіда на U1. Аналогічно пряма l2 проходить через
q2 і її лівого сусіда на U2. Позначимо через р точку перетину прямих l1 і l2.
U1 і U2 розділимі вертикаллю l.
- Припустимо, що точка р знаходиться праворуч від прямої l. р1 може належати лише заштрихованій області і u(y) < v(y) ⇒ довільна вершина q" ∈ U2прав. відносно q2, є ввігнутою відносно відрізка [q',q"], де q' — довільна вершина U1 і U2прав. відносно q2 не розглядається. Що стосується ланцюга ліворуч від вершини q1, то для нього не можна це стверджувати.
- Якщо точка перетину р знаходиться ліворуч від прямої l, то ланцюг ліворуч від вершини q1 можна не розглядати.
Посилання
- Підтримка динамічної опуклої оболонки - основні алгоритми обчислювальної геометрії
- Overmars, M. H.; van Leeuwen, J. (1981). Maintenance of configurations in the plane. Journal of Computer and System Sciences 23 (2): 166–204. doi:10.1016/0022-0000(81)90012-X..
- Jacob Rico, Dynamic Planar Convex Hull (2002), a BRICS dissertation