Алгоритм нахождения выпуклой оболочки множества точек на плоскости
В вычислительной геометрии алгоритм Чана [1] , названный в честь Тимоти М. Чана , является оптимальным чувствительным к выходу алгоритмом для вычисления выпуклой оболочки набора точек в 2- или 3-мерном пространстве. Алгоритм занимает время, где — число вершин выходных данных (выпуклой оболочки). В плоском случае алгоритм объединяет алгоритм ( например, сканирование Грэма ) с маршем Джарвиса ( ), чтобы получить оптимальное время. Алгоритм Чана примечателен тем, что он намного проще алгоритма Киркпатрика–Зейделя , и он естественным образом распространяется на 3-мерное пространство. Эта парадигма [2] была независимо разработана Фрэнком Нильсеном в его докторской диссертации. [3]
Алгоритм
Обзор
Для одного прохода алгоритма требуется параметр , который находится между 0 и (количеством точек нашего множества ). В идеале, однако , количество вершин в выходной выпуклой оболочке неизвестно в начале. Выполняется несколько проходов с увеличивающимися значениями , которые затем завершаются, когда (см. ниже о выборе параметра ).
Алгоритм начинается с произвольного разбиения набора точек на подмножества , каждое из которых содержит не более точек; обратите внимание, что .
Для каждого подмножества он вычисляет выпуклую оболочку, , используя алгоритм (например, сканирование Грэма ), где — количество точек в подмножестве. Поскольку существуют подмножества точек, эта фаза занимает время.
Во время второй фазы выполняется марш Джарвиса с использованием предварительно вычисленных (мини) выпуклых оболочек, . На каждом шаге этого алгоритма марша Джарвиса у нас есть точка в выпуклой оболочке (в начале это может быть точка в с наименьшей координатой y, которая гарантированно находится в выпуклой оболочке ), и нужно найти точку такую, чтобы все остальные точки находились справа от линии [ необходимо разъяснение ] , где обозначение просто означает, что следующая точка, то есть , определяется как функция и . Выпуклая оболочка множества , , известна и содержит не более точек (перечисленных по часовой стрелке или против часовой стрелки), что позволяет производить вычисления за время с помощью бинарного поиска [ как? ] . Следовательно, вычисление для всех подмножеств может быть выполнено за время. Затем мы можем определить, используя ту же технику, которая обычно используется в марше Джарвиса, но рассматривая только точки (т. е. точки в мини-выпуклых оболочках) вместо всего множества . Для этих точек одна итерация марша Джарвиса равна , что пренебрежимо мало по сравнению с вычислением для всех подмножеств. Марш Джарвиса завершается, когда процесс повторяется несколько раз (потому что, согласно принципу работы марша Джарвиса, после не более чем итераций его самого внешнего цикла, где — количество точек в выпуклой оболочке , мы должны были найти выпуклую оболочку), следовательно, вторая фаза занимает время, эквивалентное времени , если близко к (см. ниже описание стратегии выбора, чтобы это было так).
Выполняя две описанные выше фазы, во времени вычисляется выпуклая оболочка точек .
Выбор параметрам
Если для выбрано произвольное значение , может случиться, что . В этом случае после шагов во второй фазе мы прерываем марш Джарвиса , так как его прогон до конца занял бы слишком много времени. В этот момент время будет потрачено, а выпуклая оболочка не будет рассчитана.
Идея состоит в том, чтобы сделать несколько проходов алгоритма с увеличивающимися значениями ; каждый проход завершается (успешно или неудачно) со временем. Если увеличивается слишком медленно между проходами, число итераций может быть большим; с другой стороны, если оно увеличивается слишком быстро, первое, для которого алгоритм завершается успешно, может быть намного больше , и производить сложность .
Стратегия возведения в квадрат
Одна из возможных стратегий — возводить в квадрат значение на каждой итерации, вплоть до максимального значения (соответствующего разбиению на одноэлементные множества). [4] Начиная со значения 2, на итерации выбирается . В этом случае итерации выполняются, учитывая, что алгоритм завершается, как только мы имеем
с логарифмом, взятым по основанию , а общее время работы алгоритма равно
В трех измерениях
Для обобщения этой конструкции для 3-мерного случая вместо сканирования Грэма следует использовать алгоритм вычисления 3-мерной выпуклой оболочки Препараты и Хонга, а также 3-мерную версию марша Джарвиса. Временная сложность остается . [1]
Псевдокод
В следующем псевдокоде текст в скобках и курсивом является комментариями. Для полного понимания следующего псевдокода рекомендуется, чтобы читатель уже был знаком с алгоритмами сканирования Грэма и марша Джарвиса для вычисления выпуклой оболочки, , набора точек, .
Вход: Задайте с помощью точек.
Выходные данные: множество точек , выпуклая оболочка .
(Выберите точку, которая гарантированно находится в : например, точку с наименьшей координатой y.)
(Эта операция требует времени: например, мы можем просто выполнить итерацию .)
( используется в части марша Джарвиса этого алгоритма Чана,
так что для вычисления второй точки, , в выпуклой оболочке .)
(Примечание: это не точка .)
(Более подробную информацию см. в комментариях рядом с соответствующей частью алгоритма Чана.)
(Примечание: количество точек в конечной выпуклой оболочке неизвестно . )
(Это итерации, необходимые для нахождения значения , которое является оценкой .)
( требуется для этого алгоритма Чана для нахождения выпуклой оболочки .)
(Более конкретно, мы хотим , чтобы не выполнять слишком много ненужных итераций
и поэтому временная сложность этого алгоритма Чана равна .)
(Как объяснялось выше в этой статье, используется стратегия, при которой для нахождения требуется максимум итераций .)
(Примечание: финал может быть не равен , но он никогда не будет меньше и больше .)
(Тем не менее, этот алгоритм Чана останавливается после выполнения итераций самого внешнего цикла,
то есть, даже если , он не выполняет итерации самого внешнего цикла.)
(Более подробную информацию см. ниже в части марша Джарвиса этого алгоритма, где возвращается значение , если .)
для делать
(Установите параметр для текущей итерации. Используется «схема возведения в квадрат», описанная выше в этой статье.
Существуют и другие схемы: например, «схема удвоения», где , для .
Однако если использовать «схему удвоения», то результирующая временная сложность этого алгоритма Чана составит .)
(Инициализируйте пустой список (или массив) для хранения точек выпуклой оболочки по мере их нахождения.)
(Произвольно разбить множество точек на подмножества, каждое из которых содержит примерно по 10 элементов.)
(Вычислить выпуклую оболочку всех подмножеств точек, .)
(Это требует времени.)
Если , то временная сложность равна .)
для делать
(Вычислить выпуклую оболочку подмножества , , используя сканирование Грэма, что требует времени.)
( — выпуклая оболочка подмножества точек .)
(На этом этапе были вычислены выпуклые оболочки соответствующих подмножеств точек .)
(Примечание : на итерации известно и является точкой в выпуклой оболочке :
в данном случае это точка с наименьшей координатой y.)
(Выберите точку , которая максимизирует угол [ почему? ] , чтобы она стала следующей точкой на выпуклой оболочке .)
(Марш Джарвиса заканчивается, когда следующая выбранная точка на выпуклой оболочке, , становится начальной точкой, .)
если
(Вернуть выпуклую оболочку , содержащую точки.)
(Примечание: конечно, нет необходимости возвращать , что равно .)
возвращаться
еще
(Если после итераций не найдена точка такая, что , то .)
(Нам нужно начать заново с более высоким значением .)
Выполнение
В статье Чана содержится несколько предложений, которые могут улучшить практическую эффективность алгоритма, например:
При вычислении выпуклых оболочек подмножеств исключите из рассмотрения в последующих вычислениях точки, не входящие в выпуклую оболочку.
Выпуклые оболочки более крупных наборов точек можно получить путем слияния ранее вычисленных выпуклых оболочек, а не пересчета с нуля.
С вышеизложенной идеей, доминирующая стоимость алгоритма заключается в предварительной обработке, т. е. вычислении выпуклых оболочек групп. Чтобы уменьшить эту стоимость, мы можем рассмотреть повторное использование оболочек, вычисленных из предыдущей итерации, и их слияние по мере увеличения размера группы.
Расширения
В статье Чана описываются и другие проблемы, известные алгоритмы которых можно сделать максимально чувствительными к выходным данным, используя его методику, например:
Вычисление нижней огибающей набора отрезков прямой, которая определяется как нижняя граница неограниченной трапеции , образованной пересечениями.
Хершбергер [5] дал алгоритм, который можно ускорить до , где h — число ребер в конверте
Построение выходных чувствительных алгоритмов для многомерных выпуклых оболочек. С использованием группирующих точек и эффективных структур данных сложность может быть достигнута при условии, что h имеет полиномиальный порядок в .
^ ab Chan, Timothy M. (1996). «Оптимальные алгоритмы выпуклой оболочки, чувствительные к выходу, в двух и трех измерениях». Дискретная и вычислительная геометрия . 16 (4): 361–368. doi : 10.1007/BF02712873 .
^ Нильсен, Франк (2000). «Группировка и запросы: парадигма получения чувствительных к выходу алгоритмов». Дискретная и вычислительная геометрия . Конспект лекций по информатике. Том 1763. С. 250–257. doi : 10.1007/978-3-540-46515-7_21 . ISBN978-3-540-67181-7.
^ Хершбергер, Джон (1989). «Нахождение верхней огибающей n отрезков линии за время O(n log n)». Information Processing Letters . 33 (4): 169–174. doi :10.1016/0020-0190(89)90136-1.