Введение

Алгоритм вычисления выпуклых оболочек для набора точек

В вычислительной геометрии алгоритм обхода по контуру (или метод "заворачивания подарка") — это алгоритм для вычисления выпуклой оболочки заданного набора точек.

Плоскость

В двухмерном случае алгоритм также известен как алгоритм Джарвиса, названный в честь Р. А. Джарвиса, опубликовавшего его в 1973 году; его временная сложность составляет O(nh), где n — количество точек, а h — количество точек на выпуклой оболочке. Его практическая производительность по сравнению с другими алгоритмами построения выпуклой оболочки благоприятна, когда n мало или ожидается, что h будет очень малым по отношению к n. В общем случае алгоритм уступает многим другим (см. Алгоритмы построения выпуклой оболочки).

Алгоритм

Для упрощения описание ниже предполагает, что точки находятся в общем положении, то есть никакие три точки не лежат на одной прямой. Алгоритм может быть легко модифицирован для обработки коллинеарности, включая выбор, сообщать ли только об экстремальных точках (вершинах выпуклой оболочки) или обо всех точках, лежащих на выпуклой оболочке. Кроме того, полная реализация должна учитывать вырожденные случаи, когда выпуклая оболочка содержит только 1 или 2 вершины, а также вопросы ограниченной арифметической точности, как при компьютерных вычислениях, так и во входных данных. Алгоритм "обёртывания подарком" начинается с i=0 и точки p0, заведомо лежащей на выпуклой оболочке, например, самой левой точки, и выбирает точку pi+1 таким образом, чтобы все остальные точки лежали справа от прямой pi pi+1. Эту точку можно найти за время O(n), сравнивая полярные углы всех точек относительно точки pi, принятой за центр полярной системы координат. Увеличивая i на 1 и повторяя процесс до тех пор, пока не будет достигнута точка ph=p0, получим выпуклую оболочку за h шагов. В двух измерениях алгоритм "обёртывания подарком" аналогичен процессу наматывания нитки (или обёрточной бумаги) вокруг набора точек. Этот подход можно обобщить на более высокие размерности.

Сложность

Внутренняя петля проверяет каждую точку в наборе S, а внешняя петля повторяется для каждой точки на оболочке. Следовательно, общее время работы определяется размером выходных данных, поэтому алгоритм «марш Джарвиса» является алгоритмом, чувствительным к объему выходных данных. Однако, поскольку время работы зависит линейно от числа вершин оболочки, он быстрее, чем алгоритмы, такие как сканирование Грэма, только когда число h вершин оболочки меньше log n. Алгоритм Чана, другой алгоритм построения выпуклой оболочки, сочетает в себе логарифмическую зависимость сканирования Грэма с чувствительностью к объему выходных данных алгоритма «заворачивания подарков», достигая асимптотического времени работы, которое превосходит как сканирование Грэма, так и «заворачивание подарков».