Graham Scan

Graham Scan

Der Graham Scan (nach Ronald Graham 1972) ist ein effizienter Algorithmus zur Berechnung der konvexen Hülle einer endlichen Menge von Punkten in der Ebene. Bei n Punkten liegt seine asymptotische Laufzeit in \mathcal O(n \cdot \log n).

Inhaltsverzeichnis

Beschreibung

Vorbereitung

Sortierung einer Punktmenge nach Winkel mit Bezugspunkt P0. Der Winkel zwischen a und c (α) ist größer als der zwischen b und c (β), wenn T(P0,P1,P2) > 0.

Sei S = {P} eine endliche Punktmenge. Der Algorithmus beginnt mit einem Punkt der Menge, welcher garantiert ein Eckpunkt der konvexen Hülle ist. Man sucht sich dazu den Punkt mit der kleinsten Ordinate. Sind dies mehrere, so sucht man sich aus diesen Punkten den mit der kleinsten Abszisse aus (lexikographische Suche). Diese Suche kann in O(n) Schritten durchgeführt werden. Nachdem der Startpunkt P0 gefunden wurde, sortiert der Algorithmus die restlichen Punkte P in S nach aufsteigendem Winkel zwischen P0P und der x-Achse gegen den Uhrzeigersinn. Haben dabei zwei Punkte den gleichen Winkel (d. h. liegen mit P0 auf einer Linie, sind kollinear mit P0), so wird der Punkt, welcher näher an P0 liegt, verworfen.

Will man bestimmen, ob ein Punkt links von einem anderen liegt, d. h. ob die Linie eines Punkts mit dem Startpunkt einen größeren Winkel zur x-Achse hat als ein anderer Punkt mit dem Startpunkt, sollte man keine trigonometrischen Funktionen verwenden. Die Funktion T(P0,P1,P2) liefert das gewünschte Ergebnis mit weniger Rechenaufwand (fünf Subtraktionen, zwei Multiplikationen) und genauer. Das Ergebnis bleibt hier im rationalen Zahlenbereich, welcher ohne Verlust von Genauigkeit abgebildet werden kann. T bekommt drei Punkte P0, P1 und P2 übergeben. Das Ergebnis wird über den folgenden Ausdruck berechnet.

\begin{align}
T(P_0, P_1, P_2) &= (x_1 - x_0)(y_2 - y_0) - (x_2 - x_0)(y_1 - y_0) \\
 &=
\begin{cases}
  < 0, & \text{wenn }P_2\text{ ist rechts von }\overrightarrow{P_0P_1} \\
  = 0, & \text{wenn }P_2\text{ ist auf }\overrightarrow{P_0P_1} \\
  > 0, & \text{wenn }P_2\text{ ist links von }\overrightarrow{P_0P_1}
\end{cases}\end{align}

Berechnung

Nach Winkel sortierte Punktmenge – P0 wird als Startpunkt gewählt, da er den kleinsten Ordinatenwert hat. P1 fällt heraus, da er mit P2 und P0 kollinear ist.

S sei nun die sortierte Punktmenge. Als nächstes läuft man alle Punkte in S durch und prüft, ob diese Eckpunkte der konvexen Hülle sind. Es wird ein Stapelspeicher (Stack) angelegt, auf welchem sich alle Eckpunkte der konvexen Hülle für alle bereits abgearbeiteten Punkte befinden. Zu Beginn liegen P0 und P1 auf dem Stapel. Im k-ten Schritt wird Pk zur Betrachtung herangezogen und berechnet, wie er die vorherige konvexe Hülle verändert. Aufgrund der Sortierung liegt Pk immer außerhalb der Hülle der vorherigen Punkte Pi mit i < k.

Durch das Hinzufügen des Punktes kann es vorkommen, dass bereits auf dem Stapel liegende Punkte nicht mehr zur neuen konvexen Hülle gehören. Diese Punkte müssen mittels der „pop“ Operation vom Stapel entfernt werden. Ob ein Punkt noch zur konvexen Hülle gehört oder nicht ermittelt man, indem man berechnet, ob Pk links oder rechts des Vektors PT2→PT1 liegt (PT1 = oberstes Element des Stapels, PT2 = Element direkt unter PT1). Liegt Pk links, so bleibt PT1 weiterhin auf dem Stapel und Pk wird mit „push“ auf dem Stapel abgelegt, liegt Pk rechts, so wird PT1 von der neuen konvexen Hülle verschluckt, vom Stapel entfernt und die nächsten beiden oberen Punkte untersucht.

Dieser Test wird solange durchgeführt, bis Pk links des Vektors PT2→PT1 oder nur noch P0 und ein weiterer Punkt auf dem Stapel liegt. In beiden Fällen wird dann Pk auf dem Stapel abgelegt und mit dem nächsten Punkt Pk + 1 weitergerechnet. Die folgende Abbildung zeigt ein Beispiel, in welchem alle Fälle des eben beschriebenen Tests auftreten.

Beispiel – Graham Scan Algorithmus

In nebenstehender Abbildung werden zunächst die Punkte Pt4, Pt3, Pt2 und Pk − 1 auf den Stack gelegt. Zu jedem Zeitpunkt bilden die Punkte auf dem Stack ein konvexes Polygon (gestrichelte Linien). Erst als Pk hinzukommen soll, fallen Pk − 1 und Pt2 wieder raus, da sie zusammen mit Pk nicht konvex sind. Die konvexe Hülle dieser Punktmenge besteht aus P0, Pt4, Pt3 und Pk. P0 liegt dabei auf dem Stack ganz unten und Pk ganz oben. Die Punkte des gesuchten konvexen Polygons können mit „pop“ im Uhrzeigersinn vom Stapel geholt werden.

Anmerkung

Die Anzahl der „push“ und „pop“ Operationen übersteigt die obere Grenze von 2N (N = Anzahl der Punkte in der Eingabemenge) nicht. Die Berechnung ist also O(N). Die Sortierung der Punkte nach Winkel kann mit jedem beliebigen Sortieralgorithmus durchgeführt werden, z. B. dem Quicksort. Dieser hat im Durchschnitt average case die asympt. Laufzeit von O(Nlog N). Das bedeutet, dass die Laufzeit des Algorithmus durch die Sortierung vorgegeben ist, da O(N) + O(Nlog N) = O(Nlog N).

Pseudocode

Unter Nutzung eines Stacks

Funktion GrahamScan
  Eingabe: Punktemenge S = {P}
  Ausgabe: konvexe Hülle von S
  Beginn Funktion
    Sei S die nach dem Winkel zu P0 sortierte Punktemenge
    PUSH(P0)
    PUSH(P1)
    i := 2
    n := Anzahl der Punkte in S
    
    Solange i < n, führe aus:
      Sei Pt1 der oberste Punkt auf dem Stack
      Sei Pt2 der zweitoberste Punkt auf dem Stack
      Wenn Si links des Vektors Pt2→Pt1 liegt, dann führe aus:
        PUSH(Si)
        i := i + 1
      Ansonsten führe aus:
        POP(Pt1)
      Ende Bedingung
      
    Ende Schleife
    
  Ende Funktion

Ohne Nutzung eines Stacks

Funktion GrahamScan
  Eingabe: Punktemenge S = {P}
  Ausgabe: konvexe Hülle von S
  Beginn Funktion
    Sei S die nach dem Winkel zu P0 sortierte Punktemenge
    i := 1
    
    Solange i+1 < |S|, führe aus:
      Wenn Si rechts des Vektors Si−1→Si+1 liegt, dann führe aus:
        i := i + 1
      Ansonsten führe aus:
        Entferne das Element Si aus S
        i := i - 1
      Ende Bedingung
    
    Ende Schleife
  
  Ende Funktion

Im Code sei punkte ein Array aus Punkten, aus dem man mit punkte[i] das i-te Element erhält und welches schon nach dem Winkel zu punkte[0] sortiert ist. Der Code verändert dieses Array, indem die Elemente gelöscht werden, die nicht zur konvexen Hülle gehören.

Weblinks


Wikimedia Foundation.

Игры ⚽ Нужно решить контрольную?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Graham scan — The Graham scan is a method of computing the convex hull of a given set of points in the plane with time complexity O( n log n ). It is named after Ronald Graham, who published the original algorithm in 1972 [Graham, R.L. (1972).… …   Wikipedia

  • Graham — or Graeme is the name of a Scottish family, Clan Graham, which has given its name to many things:People*For people with Graham as a surname see Graham (surname) *For people with Graham as a given name see lookfrom|Graham *For people with Graeme… …   Wikipedia

  • Graham — ist unter anderem ein englischsprachiger Vor und Familienname, siehe Graham (Name), bezeichnet aber auch: Orte in den Vereinigten Staaten: Graham (Alabama) Graham (Arizona) Graham (Florida) Graham (Georgia) Graham (Indiana) Graham (Kalifornien)… …   Deutsch Wikipedia

  • Algorithme de Graham — Parcours de Graham Le parcours de Graham est un algorithme déterminant l enveloppe convexe d un ensemble de points. Son principal intérêt est sa complexité algorithmique en O(n log n). Cet algorithme doit son nom à Ronald Graham, qui a publié l… …   Wikipédia en Français

  • Parcours de graham — Le parcours de Graham est un algorithme déterminant l enveloppe convexe d un ensemble de points. Son principal intérêt est sa complexité algorithmique en O(n log n). Cet algorithme doit son nom à Ronald Graham, qui a publié l algorithme original… …   Wikipédia en Français

  • Parcours de Graham — Le parcours de Graham est un algorithme déterminant l enveloppe convexe d un ensemble de points. Son principal intérêt est sa complexité algorithmique en O(n log n). Cet algorithme doit son nom à Ronald Graham, qui a publié l algorithme original… …   Wikipédia en Français

  • Ronald Graham — Ronald Lewis Graham (born October 31, 1935) is a mathematician credited by the American Mathematical Society with being one of the principal architects of the rapid development worldwide of discrete mathematics in recent years [… …   Wikipedia

  • Ronald Graham — Ronald L. Graham (* 31. Oktober 1935 in Taft, Kalifornien) ist ein amerikanischer Mathematiker. Er leistete bahnbrechende Arbeiten auf dem Gebiet der diskreten Mathematik, insbesondere der Ramsey Theorie. Graham erlangte 1962 seinen Doctor of… …   Deutsch Wikipedia

  • Método de Graham — El método de Graham (Graham scan) es un método de cálculo computacional de la envolvente convexa de un grupo finito de puntos en el plano de complejidad O(nlogn). El nombre hace honor a Ronald Graham, quien publicó el algoritmo en 1972.[1] El… …   Wikipedia Español

  • James A. Graham (psychologist) — James A. Graham, Ph.D., is an associate professor at The College of New Jersey (TCNJ), Department of Psychology. He is a developmental psychologist whose work explores the social cognitive aspects of children’s relationships. Currently, he is the …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”