Алгоритм Грэхема

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Алгоритм Грэхема — алгоритм построения выпуклой оболочки в двухмерном пространстве. В этом алгоритме задача о выпуклой оболочке решается с помощью стека, сформированного из точек-кандидатов. Все точки входного множества заносятся в стек, а потом точки, не являющиеся вершинами выпуклой оболочки, со временем удаляются из него. По завершении работы алгоритма в стеке остаются только вершины оболочки в порядке их обхода против часовой стрелки.

Содержание

[править] Алгоритм

В качестве входных данных процедуры Graham выступает множество точек Q, где |Q|\geqslant 3. В ней вызывается функция Top(S), которая возвращает точку, находящуюся на вершине стека S, не изменяя при этом его содержимое. Кроме того, используется также функция NextToTop(S), которая возвращает точку, расположенную в стеке S, на одну позицию ниже от верхней точки; стек S при этом не изменяется.

Graham(Q)
1) Пусть p_0 — точка из множества Q с минимальной координатой y или самая левая из таких точек при наличии совпадений
2) Пусть <p_1, p_2,\ldots,p_m> — остальные точки множества Q, отсортированные в порядке возрастания полярного угла,
      измеряемого против часовой стрелки относительно точки p_0 
     (если полярные углы нескольких точек совпадают, то по расстоянию до точки p_0)
3) Push(p_0,S)
4) Push(p_1,S)
5) for i = 2 to m do
6)     while угол, образованный точками NextToTop(S),Top(S) и p_i, образуют не левый поворот
            (при движении по ломаной, образованной этими точками, мы движемся прямо или вправо)
7)       do Pop(S)
8)    Push(p_i,S)
9) return S

Для определения, образуют ли три точки a, b и c левый поворот, можно использовать обобщение векторного произведения на двумерное пространство, а именно условие левого поворота будет выглядеть следующим образом: u_x v_y - u_y v_x > 0, где  u = \left\{ b_x - a_x, \; b_y - a_y \right\},
v = \left\{ c_x - a_x, \; c_y - a_y \right\}

[править] Корректность сканирования по Грэхему

Если процедура Graham обрабатывает множество точек Q, где |Q|\geqslant 3, то по завершении этой процедуры стек S будет содержать (в направлении снизу вверх) только вершины оболочки CH(Q) в порядке обхода против часовой стрелки.

[править] Время работы

Время работы процедуры Graham равно O(n lg n), где n = |Q|. Как несложно показать, циклу while потребуется время O(n). В то время, как сортировка полярных углов займет O(n lg n) времени, откуда и следует общая асимптотика процедуры Graham.

[править] См. также

[править] Литература

  • Т. Кормен, Ч. Лейзерсон, Р.Ривест, К.Штайн Алгоритмы. Построение и анализ. = Introduction to Algorithms. — 2-e изд. — “Вильямс”, 2005.

[править] Ссылки

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Участие
Печать/экспорт
Инструменты
На других языках