Алгоритми обчислення опуклої оболонкиВ обчислювальній геометрії існує багато алгоритмів знаходження опуклої оболонки скінченної множини точок з різною складністю обчислень. Обчислити опуклу оболонку означає, що виконане недвозначне та ефективне представлення необхідної опуклої форми. Обчислювальна складність відповідних алгоритмів зазвичай розраховується в термінах n — числа вхідних точок, та h — числа точок в опуклій оболонці. Плоский випадокРозглянемо загальний випадок, де вхідними даними алгоритму є скінченна невпорядкована множина точок декартової площини. Якщо не всі точки лежать на одній прямій, їх опуклою оболонкою буде опуклий многокутник, вершини якого — це деякі точки зі вхідної множини. Найчастіше його подання є переліком вершин, відсортованих за годинниковою стрілкою або проти годинникової стрілки. В деяких випадках зручно представляти опуклий многокутник як перетин множини півплощин або півпросторів у просторовому випадку. Нижня межа обчислювальної складностіДля скінченої множини точок на площині нижня межа обчислювальної складності находження опуклої оболонки у вигляді опуклого многокутника є тією ж, що й в задачі сортування з подальшим зведенням. Це унаочнює такий приклад. Для множини чисел, які треба відсортувати, розглянемо множину точок площини. Так як, вони лежать на параболі, яка є опуклою кривою, легко бачити, що вершини опуклої оболонки, що проходяться вздовж межі, створюють відсортовану множину чисел . Очевидно, для описаного перетворення чисел на точки і отримання їх відсортованого порядку потребується лінійний час. З цієї причини в загальному випадку опукла оболонка n точок не може бути обчислена швидше, ніж проведено їх сортування. Стандартна Ω(n log n) нижня межа сортування доведена в обчислювальній моделі дерева прийняття рішень, в якому виконуються тільки порівняння, але не арифметичні дії; однак в цій моделі опуклі оболонки не можуть бути обчислені взагалі. Сортування також потребує час Ω(n log n) в обчислювальній моделі алгебраїчного дерева прийняття рішень, моделі, що більш підходить для опуклих оболонок, і в цих моделях опуклі оболонки також потребують час Ω(n log n).[1] Однак в моделях комп'ютерної арифметики дозволяється сортувати числа швидше, ніж за час O(n log n), наприклад, при використанні алгоритмів цілочисельного сортування, пласкі опуклі оболонки також можуть бути обчислені швидше: Алгоритм Грехема для опуклих оболонок містить один крок сортування після якого йде лінійний об'єм додаткової роботи. Оптимальні чутливі до вихідних даних алгоритмиЯк зазначено вище, складність знаходження опуклої оболонки як функції вхідного розміру n обмежена знизу Ω(n log n). Однак складність деяких алгоритмів опуклої оболонки можна схарактеризувати як вхідним розміром n, так і вихідним розміром h (кількістю точок опуклої оболонки). Такі алгоритми називаються алгоритмами, чутливими до вихідних даних[en]. Вони можуть бути асимптотично ефективнішими, ніж алгоритми Θ(n log n) у випадках, коли h = o(n). Відомо, що нижня межа часу роботи в найгіршому випадку алгоритмів чутливих до вихідних даних опуклої оболонки дорівнює Ω(n log h) у планарному випадку.[1] Існує кілька алгоритмів, які досягають цієї оптимальної часової складності. Перший з таких алгоритмів був представлений Кіркпатріком[en] і Зейделем[en] у 1986 році (які назвали його «алгоритмом крайньої опуклої оболонки»). Більш простий алгоритм був розроблений Ченом[en] у 1996 році та називається алгоритм Чена. АлгоритмиВідомі алгоритми обчислення опуклої оболонки, наведені нижче, відсортовано за датою їх першої публікації. Обчислювальна складність кожного алгоритму наведена в термінах числа вхідних точок n і числа точок оболонки h. В найгіршому випадку h дорівнюватиме n.
Евристика Акла — ТуссенаНаступна проста евристика часто використовується як перший крок у реалізації алгоритмів опуклої оболонки для підвищення їх продуктивності. Він заснований на ефективному алгоритмі опуклої оболонки Селіма Акла[en] та Годфріда Туссена[en], 1978 р. Мета алгоритма в тому, щоб швидко відкинути багато точок, які все одно не будуть частиною опуклої оболонки. Цей метод заснований на наступній ідеї. Знайдіть дві точки з найменшою та найбільшою координатами x, а також дві точки з найменшою та найбільшою y-координатами. Кожна з цих операцій займає O(n). Ці чотири точки утворюють опуклий чотирикутник, і всі точки, які лежать у цьому чотирикутнику (за винятком чотирьох початково обраних вершин), не є частиною опуклої оболонки. Знаходження всіх точок, які лежать у цьому чотирикутнику, також потребує O(n) операцій, а отже, загальна кількість операцій дорівнює O(n). За бажанням, точки з найменшою та найбільшою сумою координат x і y, а також точки з найменшою та найбільшою різницею x- і y-координат також можуть бути додані до чотирикутника, утворюючи таким чином неправильний опуклий восьмикутник, всередині якого можна безпечно відкинути всі точки. Якщо точки є випадковими величинами, то для обмеженого, але часто зустрічаємого класу функцій щільності ймовірності, цей одноразовий етап попередньої обробки, призведе до виконання алгоритму опуклої оболонки за лінійний очікуваний час, навіть якщо складність алгоритму опуклої оболонки є квадратичною відносно n[2]. Онлайн та динамічні задачі з опуклою оболонкоюВище розглянуто випадок, коли всі вхідні точки відомі заздалегідь. Можемо розглянути два інших параметри[1].
Вставка точки може збільшити кількість вершин опуклої оболонки щонайбільше на 1, тоді як видалення може перетворити n-вершинну опуклу оболонку в (n-1) — вершину. Онлайн-версію можна обробляти за час O(log n) на точку, що є асимптотично оптимальним. Динамічна версія може оброблятися за допомогою O(log2 n) за операцію.[1] Простий багатокутникОпукла оболонка простого многокутника ділиться багатокутником на частини, однією з яких є сам багатокутник, а решта — це «кишені», обмежені частиною межі многокутника та одним ребром оболонки. Хоча для задачі побудови опуклої оболонки простого багатокутника опубліковано багато алгоритмів, майже половина з них є невірними.[3] Маккалум і Евіс надали перший правильний алгоритм.[4] Пізніше спрощення, зроблене Гремом та Яо, (1983) і Лі, (1983) використовує лише одну структуру даних — стек. Їхній алгоритм обходить багатокутник за годинниковою стрілкою, починаючи з його крайньої лівої вершини. При цьому він зберігає послідовність тих вершин у стеку, які ще не були ідентифіковані як вершини у межах кишень. На кожному етапі алгоритм проходить шлях уздовж багатокутника від вершини стека до наступної вершини, яка не знаходиться в одній із двох кишень, суміжних з вершиною стека. Потім, поки дві верхні вершини в стеку разом з цією новою вершиною не знаходяться в опуклому положенні, вона виштовхує стек, перш ніж, нарешті, помістити у нього нову вершину. Коли обхід за годинниковою стрілкою досягає початкової точки, алгоритм повертає послідовність вершин стека як оболонку.[5][6] Вищі розмірностіВідомі алгоритми обчислення опуклої оболонки в тривимірному просторі, як і в просторах з довільною вимірністю.[7] Наприклад, у випадках більших розмірностей можна застосовувати алгоритм Чена і алгоритм швидкої оболонки.[8] Для скінченної множини точок, опукла оболонка є опуклим багатогранником в тривимірному просторі і опуклим політопом для будь-якої кількості розмірностей, чиї вершини є точками з вхідної множини точок. Його представлення не є таким простим, як в плоскому випадку. У випадку більших розмірностей, навіть якщо відомі вершини опуклого політопу, побудова його граней є нетривіальною задачею, як і задача побудови вершин при наявних гранях. Об'єм вихідних даних є експоненціально більшим за об'єм вхідних даних і навіть у випадках, коли вхідні та вихідні дані мають порівняний об'єм, відомі алгоритми обчислення опуклої оболонки для віщих розмірностей не є чутливими до вихідних[en] даних у відношенні до питань вироджених вхідних даних і проміжних результатів високої складності.[9] Див. такожПримітки
Література
|