Algorytm Jarvisa
Algorytm Jarvisa, marsz Jarvisa lub owijanie prezentów (ang. gift wrapping algorithm) – metoda wyznaczania otoczki wypukłej zbioru punktów umieszczonych na płaszczyźnie lub przestrzeni o większej liczbie wymiarów.
Algorytm został niezależnie opracowany przez Donalda Chanda oraz Shama Kapura (1970)[1] oraz R. Jarvisa (1973, przypadek na płaszczyźnie)[2].
Algorytm na płaszczyźnie
Algorytm działa w czasie gdzie to całkowita liczba punktów, natomiast to liczba punktów należących do otoczki. Zwykle w praktyce jednak w pesymistycznym przypadku złożoność czasowa może wynieść
Wariant 1
Algorytm przebiega następująco:
- – punkt na otoczce wypukłej o najmniejszej współrzędnej y (jeśli jest więcej niż jeden, wybierany jest ten o najmniejszej współrzędnej x),
- – punkt na otoczce wypukłej o największej współrzędnej y (jeśli jest więcej niż jeden, wybierany jest ten o największej współrzędnej x),
- wyznaczanie prawego łańcucha otoczki (niebieski):
- powtarzaj:
- – punkt dla którego kąt między wektorem a wektorem jest najmniejszy; należy do otoczki,
- jeśli koniec iterowania,
- wyznaczanie lewego łańcucha otoczki (czerwony):
- powtarzaj:
- – punkt dla którego kąt między wektorem a wektorem jest najmniejszy; należy do otoczki,
- jeśli koniec iterowania,
- ostatecznie otoczkę wypukłą określają punkty i (z pominięciem tych powtarzających się na granicach łańcuchów)
Wariant 2
Zamiast rozpatrywać dwa osobne łańcuchy, można od razu utworzyć całą otoczkę.
- – punkt na otoczce wypukłej o najmniejszej współrzędnej y (jeśli jest więcej niż jeden, wybierany jest ten o najmniejszej współrzędnej x),
- powtarzaj:
- – punkt dla którego kąt jest największy,
- jeśli koniec iterowania,
- ostatecznie otoczkę tworzą punkty
Implementację można usprawnić, odrzucając w każdej iteracji punkty znajdujące się po prawej stronie wektora ponieważ na pewno nie będą należały do otoczki. Zabieg ten nie wpływa jednak na asymptotyczną złożoność obliczeniową algorytmu.
Algorytm w przestrzeni
Algorytm w przestrzeni znajduje wielościan wypukły, którego ścianami są trójkąty.
- Zrzutuj punkty na płaszczyznę (np. XY) i wykonaj dwa pierwsze kroki algorytmu dla płaszczyzny:
- znajdź dolny punkt otoczki
- oraz kolejny punkt na otoczce
- Dodaj krawędź do kolejki.
- Dopóki kolejka nie pusta, powtarzaj:
- weź krawędź z kolejki,
- znajdź taki punkt aby wszystkie pozostałe punkty znalazły się po lewej stronie trójkąta
- trójkąt należy do otoczki,
- dodaj do kolejki dwie krawędzie nowego trójkąta: i (o ile nie były wcześniej przetwarzane).
Algorytm w wyższych wymiarach
Algorytm dla danych trójwymiarowych można uogólnić na przestrzenie o większej liczbie wymiarów.
Zobacz też
- algorytm Grahama
- quickhull
Przypisy
Bibliografia
- Lech Banachowski, Krzysztof Diks, Wojciech Rytter: Algorytmy i struktury danych. Warszawa: Wydawnictwa Naukowo-Techniczne, 2003, s. 267–268. ISBN 83-204-2796-7.