Алгоритм Кіркпатрика — Зейделя
Побудова опуклої оболонки методом «розділяй та володарюй» — алгоритм побудови опуклої оболонки зі швидкістю O(n log h), де n — кількість вхідних точок, та h — кількість точок в опуклій оболонці. Свою назву отримав від імен розробників — Девіда Кіркпатрика та Раймонда Зейделя.[1]
Опис алгоритму
Дано множина , що складається з точок.
- Якщо ( — деяке невелике ціле число), то побудувати опуклу оболонку одним з відомих методів та зупинитися, інакше перейти до кроку 2.
- Розіб'ємо початкову множину довільним чином на два приблизно рівних за потужністю підмножини та (нехай містить точок, а містить точок).
- Рекурсивно (п. 1) знаходимо опуклі оболонки кожної з підмножин та .
- Будуємо опуклу оболонку початкової множини опуклу оболонку об'єднанням двох опуклих оболонок і .
Оскільки: , складність цього алгоритму є рішенням рекурсивного співвідношення , де — час побудови опуклої оболонки об'єднання двох опуклих багатокутників, кожний з яких має близько вершин. Далі буде показано, що .
Визначення
Опорною прямою до опуклого багатокутника називається пряма , що проходить через деяку вершину багатокутника таким чином, що всі внутрішні точки багатокутника лежать по одну сторону від прямої .
До опуклого багатокутнику можна побудувати опорні прямі з точки , яка не належить йому. Скористаємося тим, що пряма , де — деяка вершина багатокутника , є опорною до в тому і лише в тому випадку, якщо ребра і лежать в одній півплощині, обмеженою цією прямою. Неважко бачити, що для побудови опорних прямих потрібно в гіршому випадку один обхід вершин багатокутника , тобто вони знаходяться за лінійний час.
Реалізація
Нехай ми вже маємо побудовані опуклі оболонки і .
- Знайдемо деяку внутрішню точку багатокутника (наприклад, центроїд будь-яких трьох вершин ). Така точка буде внутрішньою точкою .
- Можливо два випадки:
- Точка не є внутрішньою точкою багатокутника . Проводимо дві опорні прямі для багатокутника , що проходять через точку . Ці опорні прямі проходять через вершини і багатокутника . Всі точки всередині трикутника не належить границі опуклої оболонки . Всі інші точки упорядковуємо по полярному куту щодо точки , злиттям двох упорядкованих списків вершин за час , а потім застосовуємо до отриманого списком метод обходу Грехема, що вимагає лише лінійний час.
- Точка є внутрішньою точкою багатокутника . Упорядковуємо вершини обох багатокутників щодо центру , зливаючи два впорядкованих списку вершин і за .
- Тепер до отриманого списком вершин можна застосувати алгоритм Грехема за винятком фази сортування точок по полярній координаті, тоді він буде виконаний за лінійний час.
Тепер отримана опукла оболонка об'єднання опуклих багатокутників .
Складність алгоритму
У сумі всі три фази алгоритму виконуються за час . Таким чином, і отримуємо співвідношення , рішенням якого, як відомо, є , що і визначає складність алгоритму.
Примітки
- Kirkpatrick, David G.; Seidel, Raimund (1986). The ultimate planar convex hull algorithm. SIAM Journal on Computing 15 (1): 287–299. doi:10.1137/0215021.