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 O ( k n ) , {\displaystyle O(kn),} gdzie n {\displaystyle n} to całkowita liczba punktów, natomiast k {\displaystyle k} to liczba punktów należących do otoczki. Zwykle w praktyce k n , {\displaystyle k\ll n,} jednak w pesymistycznym przypadku złożoność czasowa może wynieść O ( n 2 ) . {\displaystyle O(n^{2}).}

Wariant 1

Przebieg algorytmu Jarvisa dla przykładowych danych

Algorytm przebiega następująco:

  • P 1 {\displaystyle P_{1}} – 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),
  • Q 1 {\displaystyle Q_{1}} – 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):
    1. i := 1 , {\displaystyle i:=1,}
    2. powtarzaj:
      • S := P i , {\displaystyle S:=P_{i},}
      • P i + 1 {\displaystyle P_{i+1}} – punkt N , {\displaystyle N,} dla którego kąt między wektorem S N {\displaystyle SN} a wektorem [ 1 , 0 ] {\displaystyle [1,0]} jest najmniejszy; N {\displaystyle N} należy do otoczki,
      • jeśli N = Q 1 , {\displaystyle N=Q_{1},} koniec iterowania,
      • i := i + 1 , {\displaystyle i:=i+1,}
  • wyznaczanie lewego łańcucha otoczki (czerwony):
    1. i := 1 , {\displaystyle i:=1,}
    2. powtarzaj:
      • S := Q i , {\displaystyle S:=Q_{i},}
      • Q i + 1 {\displaystyle Q_{i+1}} – punkt N , {\displaystyle N,} dla którego kąt między wektorem S N {\displaystyle SN} a wektorem [ 1 , 0 ] {\displaystyle [-1,0]} jest najmniejszy; N {\displaystyle N} należy do otoczki,
      • jeśli N = P 1 , {\displaystyle N=P_{1},} koniec iterowania,
      • i := i + 1 , {\displaystyle i:=i+1,}
  • ostatecznie otoczkę wypukłą określają punkty P {\displaystyle P} i Q {\displaystyle Q} (z pominięciem tych powtarzających się na granicach łańcuchów)


Wariant 2

Przebieg algorytmu Jarvisa dla przykładowych danych

Zamiast rozpatrywać dwa osobne łańcuchy, można od razu utworzyć całą otoczkę.

  • P 1 {\displaystyle P_{1}} – 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),
  • P 0 := [ , y ( P 1 ) ] , {\displaystyle P_{0}:=[-\infty ,y(P_{1})],}
  • i := 1 , {\displaystyle i:=1,}
  • powtarzaj:
    • P i + 1 {\displaystyle P_{i+1}} – punkt N , {\displaystyle N,} dla którego kąt P i 1 P i N {\displaystyle P_{i-1}P_{i}N} jest największy,
    • jeśli N = P 1 , {\displaystyle N=P_{1},} koniec iterowania,
    • i := i + 1 , {\displaystyle i:=i+1,}
  • ostatecznie otoczkę tworzą punkty P 1 i . {\displaystyle P_{1\dots i}.}

Implementację można usprawnić, odrzucając w każdej iteracji punkty znajdujące się po prawej stronie wektora P 1 P i , {\displaystyle P_{1}P_{i},} 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.

  1. Zrzutuj punkty na płaszczyznę (np. XY) i wykonaj dwa pierwsze kroki algorytmu dla płaszczyzny:
    • znajdź dolny punkt otoczki P 1 , {\displaystyle P_{1},}
    • oraz kolejny punkt na otoczce P 2 . {\displaystyle P_{2}.}
  2. Dodaj krawędź P 1 P 2 {\displaystyle P_{1}P_{2}} do kolejki.
  3. Dopóki kolejka nie pusta, powtarzaj:
    • weź krawędź A B {\displaystyle AB} z kolejki,
    • znajdź taki punkt C , {\displaystyle C,} aby wszystkie pozostałe punkty znalazły się po lewej stronie trójkąta A B C , {\displaystyle ABC,}
    • trójkąt A B C {\displaystyle ABC} należy do otoczki,
    • dodaj do kolejki dwie krawędzie nowego trójkąta: A C {\displaystyle AC} i B C {\displaystyle BC} (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

  1. Donald R. Chand, Sham Kupur. An algorithm for convex polytypes. „JACM”, s. 78–86, 1970. (ang.). 
  2. R.A. Jarvis. On the identification of the convex hull of a finite set of points in the plane. „Information Processing Letters”, s. 18–21, 1973. DOI: 10.1016/0020-0190(73)90020-3. (ang.). 

Bibliografia

  • Lech Banachowski, Krzysztof Diks, Wojciech Rytter: Algorytmy i struktury danych. Warszawa: Wydawnictwa Naukowo-Techniczne, 2003, s. 267–268. ISBN 83-204-2796-7.