Алгоритмы выпуклой оболочки - Википедия - Convex hull algorithms
Алгоритмы, которые строят выпуклые оболочки различных объектов имеют широкий спектр приложений в математика и Информатика.
В вычислительная геометрия предложены многочисленные алгоритмы вычисления выпуклой оболочки конечного множества точек с различными вычислительные сложности.
Вычисление выпуклой оболочки означает, что однозначный и эффективный представление требуемой выпуклой формы. Сложность соответствующих алгоритмов обычно оценивается в терминах п, количество точек ввода, а иногда и с точки зрения час, количество точек на выпуклой оболочке.
Планарный корпус
Рассмотрим общий случай, когда входом в алгоритм является конечный неупорядоченный набор точек на декартовой плоскости. Важный частный случай, когда точки задаются в порядке обхода границы простого многоугольника, описан позже в отдельном подразделе.
Если не все точки находятся на одной прямой, то их выпуклая оболочка представляет собой выпуклый многоугольник чьи вершины - это некоторые из точек входного набора. Его наиболее распространенное представление - это список его вершин, упорядоченных по его границе по или против часовой стрелки. В некоторых приложениях удобно представлять выпуклый многоугольник как пересечение множества полупланы.
Нижняя оценка вычислительной сложности
Легко показать, что для конечного множества точек на плоскости нижняя граница вычислительной сложности нахождения выпуклой оболочки, представленной выпуклым многоугольником, такая же, как и для сортировка используя следующие снижение. Для набора числа для сортировки рассмотреть набор точек точек на плоскости. Поскольку они лежат на парабола, который является выпуклая кривая легко видеть, что вершины выпуклой оболочки, проходя по границе, производят отсортированный порядок чисел . Четко, линейное время требуется для описанного преобразования чисел в точки и последующего извлечения их отсортированного порядка. Следовательно, в общем случае выпуклая оболочка п точки не могут быть вычислены быстрее, чем сортировка.
Стандартный Ω (п бревно п) нижняя оценка для сортировки доказана в модель дерева решений вычислений, в которых могут выполняться только числовые сравнения, но не арифметические операции; однако в этой модели выпуклые оболочки вообще не могут быть вычислены. Для сортировки также требуется Ω (п бревно п) время в алгебраическое дерево решений модель вычисления, модель, которая больше подходит для выпуклых оболочек, и в этой модели для выпуклых оболочек также требуется Ω (п бревно п) время.[1] Однако в моделях компьютерной арифметики, которые позволяют сортировать числа быстрее, чем О(п бревно п) время, например, используя целочисленная сортировка алгоритмы, плоские выпуклые оболочки также могут быть вычислены быстрее: Сканирование Грэма Алгоритм для выпуклых оболочек состоит из одного шага сортировки, за которым следует линейный объем дополнительной работы.
Оптимальные алгоритмы, чувствительные к выходу
Как указано выше, сложность нахождения выпуклой оболочки в зависимости от входного размера п ограничена снизу величиной Ω (п бревно п). Однако сложность некоторых алгоритмов выпуклой оболочки можно охарактеризовать как с точки зрения размера входных данных п и размер вывода час (количество очков в корпусе). Такие алгоритмы называются алгоритмы, чувствительные к выходу. Они могут быть асимптотически эффективнее, чем (п бревно п) алгоритмов в случаях, когда час = о(п).
Нижняя граница времени работы алгоритмов выпуклой оболочки в худшем случае была установлена равной Ω (п бревно час) в плоском случае.[1] Есть несколько алгоритмов, которые достигают этого оптимального временная сложность. Самый ранний был представлен Киркпатрик и Зайдель в 1986 году (кто назвал это " алгоритм конечной выпуклой оболочки "). Намного более простой алгоритм был разработан Чан в 1996 году и называется Алгоритм Чана.
Алгоритмы
Ниже перечислены известные алгоритмы выпуклой оболочки, отсортированные по дате первой публикации. Временная сложность каждого алгоритма указывается в количестве входных точек. п и количество точек на корпусе час. Обратите внимание, что в худшем случае час может быть размером с п.
- Подарочная упаковка, a.k.a. Марш джарвиса — О(нэ)
Один из простейших (хотя и не самый эффективный в худшем случае) планарных алгоритмов. Создано независимо Chand & Kapur в 1970 году и Р.А. Джарвисом в 1973 году. О (нэ) временная сложность, куда п - количество точек в наборе, а час - количество точек в корпусе. В худшем случае сложность Θ (п2). - Сканирование Грэма — О(п бревно п)
Чуть более сложный, но гораздо более эффективный алгоритм, опубликованный Рональд Грэм в 1972 году. Если точки уже отсортированы по одной из координат или по углу к фиксированному вектору, то алгоритм принимает O (п) время. - Quickhull
Создан независимо в 1977 году У. Эдди и в 1978 году А. Быкатом. Как и быстрая сортировка алгоритм, он имеет ожидаемую временную сложность О(п бревно п), но может выродиться в О(п2) в худшем случае. - Разделяй и властвуй — О(п бревно п)
Другой O (п бревно п), опубликованный в 1977 г. Препарата и Хонг. Этот алгоритм применим и к трехмерному случаю. - Монотонная цепочка, a.k.a. Алгоритм Эндрю— О(п бревно п)
Опубликовано в 1979 году А.М. Андреем. Алгоритм можно рассматривать как вариант сканирования Грэма, который лексикографически сортирует точки по их координатам. Когда вход уже отсортирован, алгоритм принимает О(п) время. - Алгоритм инкрементальной выпуклой оболочки — О(п бревно п)
Опубликовано в 1984 году Майклом Каллаем. - Алгоритм Киркпатрика – Зейделя — О(п бревно час)
Первый оптимальный алгоритм, чувствительный к выходу. Он изменяет алгоритм разделяй и властвуй, используя технику брака до завоевания и низкоразмерное линейное программирование. Опубликовано Киркпатрик и Зайдель в 1986 г. - Алгоритм Чана — О(п бревно час)
Более простой оптимальный алгоритм, чувствительный к выходу, созданный Чан в 1996 году. Совмещает подарочную упаковку с исполнением О(п бревно п) (например, сканирование Грэма) на небольших подмножествах входных данных.
Эвристика Акля – Туссена
Следующая простая эвристика часто используется в качестве первого шага в реализации алгоритмов выпуклой оболочки для повышения их производительности. Он основан на эффективном алгоритме выпуклой оболочки по Селим Акл и Г. Т. Туссен, 1978. Идея состоит в том, чтобы быстро исключить многие точки, которые в любом случае не были бы частью выпуклой оболочки. Этот метод основан на следующей идее. Найдите две точки с наименьшими и наибольшими координатами x и две точки с наименьшими и наибольшими координатами y. (Каждая из этих операций требует О (п). Эти четыре точки образуют выпуклый четырехугольник, и все точки, лежащие в этом четырехугольнике (кроме четырех изначально выбранных вершин), не являются частью выпуклой оболочки. Найти все эти точки, лежащие в этом четырехугольнике, также можно за O (п), а значит, вся операция O (п). По желанию, точки с наименьшей и наибольшей суммой координат x и y, а также точки с наименьшей и наибольшей разностью координат x и y также могут быть добавлены к четырехугольнику, образуя неправильный выпуклый восьмиугольник, внутренности которого могут безопасно выбросить. Если точки являются случайными величинами, то для узкого, но часто встречающегося класса функций плотности вероятности это выбросить этап предварительной обработки заставит алгоритм выпуклой оболочки работать за линейное ожидаемое время, даже если сложность алгоритма выпуклой оболочки наихудшего случая является квадратичной по п.[2]
Оперативные и динамические задачи выпуклой оболочки
В приведенном выше обсуждении рассматривается случай, когда все точки ввода известны заранее. Можно рассмотреть два других параметра.[1]
- Задача о выпуклой оболочке онлайн: Входные точки получаются последовательно одна за другой. После того, как каждая точка поступает на вход, выпуклая оболочка для полученного набора точек должна быть эффективно вычислена.
- Динамическая выпуклая оболочка поддержание: Входные точки могут быть последовательно вставлены или удалены, а выпуклая оболочка должна обновляться после каждой операции вставки / удаления.
Вставка точки может увеличить количество вершин выпуклой оболочки не более чем на 1, а удаление может преобразовать п-вершинную выпуклую оболочку в п-1-вертекс один.
С онлайн-версией можно работать с помощью O (log п) на точку, что является асимптотически оптимальным. Динамическая версия может обрабатываться с помощью O (log2 п) за операцию.[1]
Простой многоугольник
Выпуклая оболочка простой многоугольник делится многоугольником на части, одна из которых является самим многоугольником, а остальные карманы ограничен частью границы многоугольника и единственной кромкой корпуса. Хотя было опубликовано много алгоритмов для задачи построения выпуклой оболочки простого многоугольника, почти половина из них неверны.[3]Маккаллум и Авис представили первый правильный алгоритм.[4]Позднее упрощение Грэм и Яо (1983) и Ли (1983) использует только один структура данных стека. Их алгоритм обходит многоугольник по часовой стрелке, начиная с его самой левой вершины. При этом он сохраняет в стеке выпуклую последовательность вершин, тех, которые еще не были идентифицированы как находящиеся в карманах. На каждом шаге алгоритм следует по пути вдоль многоугольника от вершины стека до следующей вершины, которая не находится в одном из двух карманов, смежных с вершиной стека. Затем, хотя две верхние вершины в стеке вместе с этой новой вершиной не находятся в выпуклом положении, он выталкивает стек, прежде чем, наконец, поместить новую вершину в стек. Когда обход по часовой стрелке достигает начальной точки, алгоритм возвращает последовательность вершин стека в качестве корпуса.[5][6]
Высшие измерения
Известен ряд алгоритмов как для трехмерного случая, так и для произвольных размеров.[7] Алгоритм Чана используется для размеров 2 и 3, и Quickhull используется для вычисления выпуклой оболочки в более высоких измерениях.[8]
Для конечного множества точек выпуклая оболочка является выпуклый многогранник в трех измерениях, или вообще выпуклый многогранник для любого количества измерений, вершинами которых являются некоторые из точек входного набора. Однако его представление не так просто, как в плоском случае. В более высоких измерениях, даже если известны вершины выпуклого многогранника, построение его лица - нетривиальная задача, как и двойственная задача построения вершин по граням. Размер выходной информации о грани может быть экспоненциально больше, чем размер входных вершин, и даже в тех случаях, когда входные и выходные данные имеют сопоставимый размер, известные алгоритмы для выпуклых оболочек большой размерности не подходят. чувствительный к выходу из-за проблем как с вырожденными входными данными, так и с промежуточными результатами высокой сложности.[9]
Смотрите также
Рекомендации
- ^ а б c d Препарата, Шамос, Вычислительная геометрия, Глава «Выпуклые оболочки: основные алгоритмы»
- ^ Люк Деврой и Годфрид Туссен, "Заметка о линейных алгоритмах ожидаемого времени для поиска выпуклой оболочки", Вычисление, Vol. 26, 1981, стр. 361-366.
- ^ Алупис, Грег. "История алгоритмов выпуклой оболочки линейного времени для простых многоугольников". Получено 11 октября, 2020.
- ^ Маккаллум, Дункан; Авис, Дэвид (1979), "Линейный алгоритм поиска выпуклой оболочки простого многоугольника", Письма об обработке информации, 9 (5): 201–206, Дои:10.1016/0020-0190(79)90069-3, МИСТЕР 0552534
- ^ Грэм, Рональд Л.; Яо, Ф. Фрэнсис (1983), "Нахождение выпуклой оболочки простого многоугольника", Журнал алгоритмов, 4 (4): 324–331, Дои:10.1016/0196-6774(83)90013-5, МИСТЕР 0729228
- ^ Ли, Д. Т. (1983), "О нахождении выпуклой оболочки простого многоугольника", Международный журнал компьютерных и информационных наук, 12 (2): 87–98, Дои:10.1007 / BF00993195, МИСТЕР 0724699
- ^ Видеть Дэвид Маунт с Конспект лекций, включая лекцию 4 о последних разработках, в том числеАлгоритм Чана.
- ^ Барбер, К. Брэдфорд; Добкин, Дэвид П .; Хухданпаа, Ханну (1 декабря 1996 г.). «Алгоритм quickhull для выпуклых оболочек». Транзакции ACM на математическом ПО. 22 (4): 469–483. Дои:10.1145/235815.235821.
- ^ Авис, Дэвид; Бремнер, Дэвид; Зайдель, Раймунд (1997), "Насколько хороши алгоритмы выпуклой оболочки?", Вычислительная геометрия: теория и приложения, 7 (5–6): 265–301, Дои:10.1016 / S0925-7721 (96) 00023-5.
дальнейшее чтение
- Томас Х. Кормен, Чарльз Э. Лейзерсон, Рональд Л. Ривест, и Клиффорд Штайн. Введение в алгоритмы, Второе издание. MIT Press и McGraw-Hill, 2001. ISBN 0-262-03293-7. Раздел 33.3: Поиск выпуклой оболочки, стр. 947–957.
- Франко П. Препарата, С.Дж. Hong. Выпуклые оболочки конечных множеств точек в двух и трех измерениях, Commun. ACM, т. 20, нет. 2. С. 87–93, 1977.
- Марк де Берг; Марк ван Кревельд; Марк Овермарс & Отфрид Шварцкопф (2000). Вычислительная геометрия (2-е изд. Перераб.). Springer-Verlag. ISBN 978-3-540-65620-3. Раздел 1.1: Пример: выпуклые оболочки (описывает классические алгоритмы для двумерных выпуклых оболочек). Глава 11: Выпуклые оболочки: стр. 235–250 (описывает рандомизированный алгоритм для трехмерных выпуклых оболочек Кларксона и Шора).
внешняя ссылка
- Вайсштейн, Эрик В. "Выпуклый корпус". MathWorld.
- 2D, 3D и dD выпуклая оболочка в CGAL, Библиотека алгоритмов вычислительной геометрии
- Код Кулла для выпуклой оболочки, триангуляции Делоне, диаграммы Вороного и пересечения полупространства
- Демо как Flash SWF, Джарвис, Грэм, Квик (разделяй и властвуй) и алгоритмы Чана
- Алгоритм упаковки подарков на C #