- Алгоритм Джарвиса
-
Алгоритм Джарвиса (или алгоритм обхода Джарвиса, или алгоритм заворачивания подарка) определяет последовательность элементов множества, образующих выпуклую оболочку для этого множества. Метод можно представить как обтягивание верёвкой множества вбитых в доску гвоздей. Алгоритм работает за время , где — общее число точек на плоскости, — число точек в выпуклой оболочке.
Содержание
Описание алгоритма
Пусть дано множество точек. В качестве начальной берётся самая левая нижняя точка (ее можно найти за обычным проходом по всем точкам), она точно является вершиной выпуклой оболочки. Затем для каждой точки ищется против часовой стрелки точка путём нахождения за среди оставшихся точек (+ самая левая нижняя) точки с наименьшим полярным углом . Она и будет следующей вершиной выпуклой оболочки. При этом сам угол не обязательно вычислять, достаточно вычислить векторное произведение (обобщением векторного произведения для двумерного случая является псевдоскалярное произведение) между лучами и , где найденный на данный момент минимум, претендент (первым минимумом может быть выбрана любая точка). Если векторное произведение отрицательно, то найден новый минимум. Если равно нулю, то есть и лежат на одной прямой, то минимум та, которая лежит дальше от точки . Алгоритм продолжается пока . Почему алгоритм остановится? Потому что самая левая нижняя точка в любом случае принадлежит выпуклой оболочке.
Jarvis(P) 1) p[1] = самая левая нижняя точка множества P; 2) i = 1; 3) do: p[i+1] = любая точка из P (кроме уже попавших в выпуклую оболочку, но включая p[1]); (a)for (для каждой точки j из P, кроме уже попавших в выпуклую оболочку, но включая p[1]) p[i+1] = min_polar_angle(p[i+1], P[j]); // минимум через векторное произведение, как описано выше (b)i = i + 1; while p[i] != p[1] 4) return p;
Анализ
Цикл 3) выполнится раз, при этом цикл (a) каждый раз выполняется за . Все остальные операции выполняются за . Следовательно, алгоритм работает за или в худшем случае, когда точек попадут в выпуклую оболочку.
См. также
Литература
- Прапарата Ф., Шеймос М. Вычислительная геометрия: Введение = Computational Geometry An introduction. — М.: Мир, 1989. — С. 478.
- Ласло М. Вычислительная геометрия и компьютерная графика на C++. — М.: БИНОМ, 1997. — С. 304.
- Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн. Алгоритмы. Построение и анализ = Introduction to Algorithms. — 2-e изд. — “Вильямс”, 2005. — С. 1296.
Ссылки
Категория:- Геометрические алгоритмы
Wikimedia Foundation. 2010.