Задача динамічної підтримки опуклої оболонкиЗадача динамічної підтримки опуклої оболонки належить класу динамічних задач обчислювальної геометрії. Вона полягає в підтримці опуклої оболонки для набору вхідних даних що динамічно змінюються, тобто додаються, видаляються або змінюються. Формальна постановка задачіЗадані порожня множина 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]).
Функція З'ЄДНАТИ(U1, U2):
Структура даних використовує пам'ять об'ємом О(N).
Посилання
|
Portal di Ensiklopedia Dunia