Algorytm Grahama

Algorytm Grahama

Algorytm Grahama to efektywny sposób na znalezienie otoczki wypukłej dla danego zbioru punktów w płaszczyźnie. Warto zaznaczyć, że nie ma jego wersji dla przestrzeni o wyższych wymiarach. Opracowany został przez Ronalda Grahama.

Jego czasowa złożoność obliczeniowa wynosi O(n log n).

Algorytm realizuje się według następujących kroków:

  • Wybierz punkt (oznaczony jako O) z najniższą wartością współrzędnej y.
  • Przesuń wszystkie punkty, aby punkt O zbiegał się z początkiem układu współrzędnych.
  • Posortuj punkty leksykograficznie względem:
    • kąta pomiędzy wektorem OPi a dodatnią osią układu współrzędnych,
    • odległości punktu Pi od początku układu współrzędnych.
  • Wybierz punkt (oznaczony jako S) z najmniejszą współrzędną y; w przypadku, gdy kilka punktów ma tę samą wartość y, wybierz spośród nich ten z najmniejszą współrzędną x.
  • Przeglądaj listę posortowanych punktów, zaczynając od punktu S:
    • Od obecnej pozycji wybierz trzy kolejne punkty (oznaczone jako A, B, C).
    • Jeżeli punkt B znajduje się na zewnątrz trójkąta AOC, może on należeć do otoczki wypukłej. Przejdź do następnego punktu na liście.
    • Jeśli punkt B jest wewnątrz trójkąta AOC, nie należy on do otoczki. Usuń punkt B z listy i cofnij się o jedną pozycję (o ile bieżąca pozycja nie jest równa początkowej).

Ze względu na wcześniejsze kroki algorytmu (sortowanie oraz sposób wybierania analizowanych trójek punktów), dwa z trzech warunków przynależności punktu B do trójkąta AOC są spełnione, tj. B leży po „wewnętrznej” stronie prostych OA i OC. Aby stwierdzić przynależność do trójkąta, wystarczy zbadać, po której stronie odcinka AC znajduje się punkt B, wykorzystując znak iloczynu wektorowego:

|C – A| × |B – A|.

W praktyce można również zrealizować krok 4. jako krok 1, tj. przyjąć, że O = S.

Przykładowy przebieg algorytmu

W tej sekcji można przedstawić szczegółowy przebieg algorytmu z konkretnymi danymi wejściowymi.

Zobacz też

Przypisy

Bibliografia

Mark de Berg, Mirosław Kowaluk: Geometria obliczeniowa. Algorytmy i zastosowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 2007. ISBN 978-83-204-3244-2. Brak numerów stron w książce.

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

Przeczytaj u przyjaciół: