Алгоритм Грехема (англ. Graham scan) — метод знаходження опуклої оболонки для скінченної множини точок на площині за час O(n log n). Названий на честь Рональда Грехема, який опублікував первісний варіант алгоритму в 1972 році. Алгоритм знаходить всі вершини опуклої оболонки впорядковані вздовж її межі.
Алгоритм
Перший крок в алгоритмі — знайти точку з найменшою у-координатою. Якщо таких декілька, то обираємо серед них точку з найменшою х-координатою. Назвемо її P. Цей крок має складність O(n), де n — кількість точок. Додамо цю точку в стек.
Далі, точки мають бути відсортовані в порядку зростання кута, який вони разом з P утворюють з віссю х. Будь-який алгоритм сортування підходить. Для пришвидшення обчислень, не обов'язково визначати кут, що ці точки утворюють з віссю х; замість цього достатньо обчислити котангенс цього кута: це монотонно спадна функція на проміжку і може бути обчислена простими арифметичними операціями.
Алгоритм виконується вважаючи, що точки відсортовано згідно з попереднім кроком. Для кожної точки він визначає чи було пересування від двох попередніх точок до цієї точки поворотом ліворуч чи поворотом праворуч. Якщо це був поворот праворуч, тоді передостання точка (від якої повертали) не є частиною опуклої оболонки і має бути видалена зі стека. Цей процес триває доти доки останні три точки утворюють поворот праворуч. Як тільки поворот ліворуч був отриманий, алгоритм рухається до наступної точки у відсортованному масиві. (Якщо в якийсь момент виявляється, що три точки колінеарні, користувач може сам вирішувати, що робити в такому випадку, адже іноді потрібно отримати всі точки, що належать до опуклої оболонки.)
Визначення, коли три точки утворюють поворот ліворуч, а коли поворот праворуч не вимагає обчислення кута між двома відрізками, і може бути визначено за допомогою простих арифметичних операцій. Для трьох точок , і , просто обчисліть напрямок векторного добутку двох векторів визначених точками , і , , яке характеризується знаком виразу . Якщо результат 0, точки колінеарні; якщо позитивний, точки утворюють поворот ліворуч, інакше поворот праворуч.
Насамкінець алгоритм досягне точки з якої ми починали, тепер він завершився і стек містить точки опуклої оболонки в напрямку зворотному до годинникового.
Час роботи
Загальний час роботи дорівнює O(n log n).
Псевдокод
# Три точки йдуть проти годинникової стрілки якщо ccw > 0, за стрілкою якщо # ccw < 0, і колінеарні якщо ccw = 0 через те, що ccw визначена як # така, що повертає signed area трикутника сформованного p1, p2 та p3. function ccw(p1, p2, p3): return (p2.x - p1.x)*(p3.y - p1.y) - (p2.y - p1.y)*(p3.x - p1.x)
Результат буде збережений в points
.
let N = number of points let points[N+1] = the array of points swap points[1] with the point with the lowest y-coordinate sort points by polar angle with points[1] # points[0] буде позначкою зупинки алгоритму. let points[0] = points[N] # M буде вказувати кількість точок в опуклій оболонці. let M = 2 for i = 3 to N: # Шукаємо наступну правильну точку на опуклій оболонці. while ccw(points[M-1], points[M], points[i]) <= 0: M -= 1 # Пересуваємо points[i] в правильне місце та оновлюємо M. M += 1 swap points[M] with points[i]
Див. також
- (Алгоритми побудови опуклої оболонки множини точок)
- Алгоритм Ендрю — вдосконалений алгоритм Грехема.
Література
- Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. Розділ 33.3: Знаходження опуклої оболонки. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
Примітки
- Graham, R.L. (1972). An Efficient Algorithm for Determining the Convex Hull of a Finite Planar Set [ 17 травня 2017 у Wayback Machine.]. Information Processing Letters 1, 132–133
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Algoritm Grehema angl Graham scan metod znahodzhennya opukloyi obolonki dlya skinchennoyi mnozhini tochok na ploshini za chas O n log n Nazvanij na chest Ronalda Grehema yakij opublikuvav pervisnij variant algoritmu v 1972 roci Algoritm znahodit vsi vershini opukloyi obolonki vporyadkovani vzdovzh yiyi mezhi Priklad znahodzhennya opukloyi obolonki algoritmom Grehema AlgoritmYak mozhna pobachiti A B i B C sliduyut v napryamku protilezhnomu godinnikovomu a C D ni Algoritm viznachaye taku situaciyu ta vidminyaye poperedno obranij segment doti doki napryamok znov ne bude proti godinnikovogo B D v comu vipadku Pershij krok v algoritmi znajti tochku z najmenshoyu u koordinatoyu Yaksho takih dekilka to obirayemo sered nih tochku z najmenshoyu h koordinatoyu Nazvemo yiyi P Cej krok maye skladnist O n de n kilkist tochok Dodamo cyu tochku v stek Dali tochki mayut buti vidsortovani v poryadku zrostannya kuta yakij voni razom z P utvoryuyut z vissyu h Bud yakij algoritm sortuvannya pidhodit Dlya prishvidshennya obchislen ne obov yazkovo viznachati kut sho ci tochki utvoryuyut z vissyu h zamist cogo dostatno obchisliti kotangens cogo kuta ce monotonno spadna funkciya na promizhku 0 p displaystyle 0 pi i mozhe buti obchislena prostimi arifmetichnimi operaciyami Algoritm vikonuyetsya vvazhayuchi sho tochki vidsortovano zgidno z poperednim krokom Dlya kozhnoyi tochki vin viznachaye chi bulo peresuvannya vid dvoh poperednih tochok do ciyeyi tochki povorotom livoruch chi povorotom pravoruch Yaksho ce buv povorot pravoruch todi peredostannya tochka vid yakoyi povertali ne ye chastinoyu opukloyi obolonki i maye buti vidalena zi steka Cej proces trivaye doti doki ostanni tri tochki utvoryuyut povorot pravoruch Yak tilki povorot livoruch buv otrimanij algoritm ruhayetsya do nastupnoyi tochki u vidsortovannomu masivi Yaksho v yakijs moment viyavlyayetsya sho tri tochki kolinearni koristuvach mozhe sam virishuvati sho robiti v takomu vipadku adzhe inodi potribno otrimati vsi tochki sho nalezhat do opukloyi obolonki Viznachennya koli tri tochki utvoryuyut povorot livoruch a koli povorot pravoruch ne vimagaye obchislennya kuta mizh dvoma vidrizkami i mozhe buti viznacheno za dopomogoyu prostih arifmetichnih operacij Dlya troh tochok x1 y1 displaystyle x 1 y 1 x2 y2 displaystyle x 2 y 2 i x3 y3 displaystyle x 3 y 3 prosto obchislit napryamok vektornogo dobutku dvoh vektoriv viznachenih tochkami x1 y1 displaystyle x 1 y 1 x2 y2 displaystyle x 2 y 2 i x1 y1 displaystyle x 1 y 1 x3 y3 displaystyle x 3 y 3 yake harakterizuyetsya znakom virazu x2 x1 y3 y1 y2 y1 x3 x1 displaystyle x 2 x 1 y 3 y 1 y 2 y 1 x 3 x 1 Yaksho rezultat 0 tochki kolinearni yaksho pozitivnij tochki utvoryuyut povorot livoruch inakshe povorot pravoruch Nasamkinec algoritm dosyagne tochki z yakoyi mi pochinali teper vin zavershivsya i stek mistit tochki opukloyi obolonki v napryamku zvorotnomu do godinnikovogo Chas robotiZagalnij chas roboti dorivnyuye O n log n Psevdokod Tri tochki jdut proti godinnikovoyi strilki yaksho ccw gt 0 za strilkoyu yaksho ccw lt 0 i kolinearni yaksho ccw 0 cherez te sho ccw viznachena yak taka sho povertaye signed area trikutnika sformovannogo p1 p2 ta p3 function ccw p1 p2 p3 return p2 x p1 x p3 y p1 y p2 y p1 y p3 x p1 x Rezultat bude zberezhenij v points let N number of points let points N 1 the array of points swap points 1 with the point with the lowest y coordinate sort points by polar angle with points 1 points 0 bude poznachkoyu zupinki algoritmu let points 0 points N M bude vkazuvati kilkist tochok v opuklij obolonci let M 2 for i 3 to N Shukayemo nastupnu pravilnu tochku na opuklij obolonci while ccw points M 1 points M points i lt 0 M 1 Peresuvayemo points i v pravilne misce ta onovlyuyemo M M 1 swap points M with points i Priklad roboti algoritmu Grehema Div takozhAlgoritmi pobudovi opukloyi obolonki mnozhini tochok Algoritm Endryu vdoskonalenij algoritm Grehema LiteraturaT Kormen Ch Lejzerson R Rivest K Stajn 2009 1990 Rozdil 33 3 Znahodzhennya opukloyi obolonki Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 PrimitkiGraham R L 1972 An Efficient Algorithm for Determining the Convex Hull of a Finite Planar Set 17 travnya 2017 u Wayback Machine Information Processing Letters 1 132 133