Алгоритм Ендрю

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Зображення перебігу алгоритму
Верхня (червона) та нижня (синя) опуклі оболонки

Алгоритм Ендрю, також відомий як монотонний ланцюг — алгоритм побудови опуклої оболонки на площині, є модифікацією алгоритму Грехема.

На відміну від алгоритму Грехема, в якому побудова здійснюється за допомогою стеку, використовує лексикографічне впорядкування точок по координатах, що дозволяє алгоритму не використовувати дійсні числа і тригонометричні функції. Алгоритм окремо обчислює верхню і нижню оболонки з послідовних ланцюгів точок. Фактично, алгоритм Ендрю є окремим випадком алгоритму Грехема, коли центральна точка вибирається нескінченно віддаленою у від'ємному напрямку по осі ординат, так що в цьому випадку впорядкування по абсцисі збігається з впорядкуванням по полярному куту.

Застосування[ред. | ред. код]

Цей алгоритм сортує набір точок за рахунок збільшення по осі , а у разі, коли у точок координати однакові, то по . Нехай мінімальні і максимальні координати будуть і . Очевидно, що у першій з точок . Але можуть бути й інші точки з цієї мінімальної -координатою. Знайдемо такі точки в яких є два мінімуму і два максимуму і з'єднаємо їх відрізком. Остання множина точок ділиться на дві, залежно від того з якого боку від цієї прямої точки розташовані. Таким чином ми можемо визначити нову нижню і нову верхню лінії. Об'єднання цих ліній дає шукану опуклу оболонку.

Для побудови верхньої оболонки точки множини впорядковується відповідно до зростання абсциси. Після цього відбувається обробка отриманих даних за алгоритмом Грехема. Для цього алгоритм Ендрю використовує стек для зберігання поточної верхньої оболонки. Точка вважається, що знаходиться на вершині стека. Після закінчення роботи алгоритму стек містить верхню оболонку множини .

Даний алгоритм можна запрограмувати на багатьох мовах програмування.[1]

Псевдокод[ред. | ред. код]

Вхідні дані: список P точок на площині.

Передумова: повинно бути не менше 3 точок.

Відсортуйте точки P за координатою x (у разі рівності, сортуйте за координатою y).

Ініціалізуйте U та L як порожні списки.
Списки будуть містити вершини верхньої та нижньої оболонок відповідно.

for i = 1, 2, ..., n:
     while L містить принаймні дві точки та послідовність останніх двох точок
             L і точка P[i] не робить повороту проти годинникової стрілки:
         вилучити останню точку з L
     додати P[i] до L

for i = n, n-1, ..., 1:
     while U містить щонайменше дві точки та послідовність останніх двох точок
             U і точка P[i] не робить повороту проти годинникової стрілки:
         видалити останню точку з U
     додати P[i] до U

Видаліть останню точку кожного списку (це те саме, що перша точка іншого списку).
Об'єднайте L і U, щоб отримати опуклу оболонку точок P.
У підсумку точки будуть перераховані в порядку проти годинникової стрілки.

Див. також[ред. | ред. код]

Література[ред. | ред. код]

Посилання[ред. | ред. код]

  1. [1] [Архівовано 11 березня 2014 у Wayback Machine.], Monotone chain