Chans Algorithmus

Chans Algorithmus (englisch Chan’s algorithm) ist in der algorithmischen Geometrie ein ausgabesensitives Paradigma zur Berechnung der konvexen Hülle einer Menge von Punkten der Euklidischen Ebene oder des Raumes. Er kombiniert in einem Divide-and-conquer-Ansatz verschiedene bekannte Algorithmen, um eine asymptotisch optimale Laufzeit zu erzielen. Der Algorithmus ist benannt nach Timothy M. Chan[1], zeitgleich und unabhängig von ihm hat Frank Nielsen dieselbe Methode in seiner Dissertation entwickelt.[2][3]

Problemstellung

Gegeben sei eine Menge S E 2 {\displaystyle S\subset E^{2}} von n {\displaystyle n} Punkten der Euklidischen Ebene, es ist die konvexe Hülle conv ( S ) {\displaystyle \operatorname {conv} (S)} zu berechnen. Hierbei wird die Hülle mit den Eckpunkten ihres Randes identifiziert, mit dieser Setzung gilt dann conv ( S ) S {\displaystyle \operatorname {conv} (S)\subseteq S} . Üblicherweise bezeichnet man die Mächtigkeit | conv ( S ) | {\displaystyle |\operatorname {conv} (S)|} der Hülle mit h {\displaystyle h} , es ist also h n {\displaystyle h\leq n} . Für das Problem der konvexen Hülle sind verschiedene Lösungen bekannt, diese fallen stets in eine von zwei Kategorien: Bei den ausgabesensitiven Algorithmen beeinflusst sowohl die Eingabe- als auch die Ausgabegröße die Laufzeit; bei den nicht ausgabesensitiven Algorithmen hängt die Laufzeit dagegen ausschließlich von der Eingabegröße ab. Ein bekanntes Beispiel für eine ausgabesensitive Methode ist Jarvis’ March, die in Zeit O ( n h ) {\displaystyle O(nh)} läuft; der bekannteste nicht ausgabesensitive Algorithmus ist Graham’s Scan mit Laufzeit O ( n log n ) {\displaystyle O(n\log n)} (siehe auch Landau-Notation).

Idealerweise würde man also gern für Instanzen mit kleiner Hülle eine ausgabesensitive Lösung wählen, während man für Eingaben mit vielen Punkten auf der Hülle eher einen nicht ausgabesensitiven Algorithmus bevorzugt. Allerdings ist die Größenordnung der Ausgabe üblicherweise unbekannt. Zusätzlich lässt sich im ausgabesensitiven Fall eine untere Laufzeitschranke beweisen, die mit Ω ( n log h ) {\displaystyle \Omega (n\log h)} noch deutlich unter der Laufzeit von Jarvis’ March liegt.[4] Chans Algorithmus gibt nun eine gemeinsame Methode für alle Eingaben an, die außerdem die optimale Laufzeit von O ( n log h ) {\displaystyle O(n\log h)} erreicht.

Algorithmus

Die Funktionsweise von Chans Algorithmus beruht auf der folgenden Beobachtung: Soll per Jarvis’ March die konvexe Hülle einer Menge P E 2 {\displaystyle P\subset E^{2}} bestimmt werden, so wird stets ausgehend von einem bereits bekannten Punkt p i {\displaystyle p_{i}} der konvexen Hülle ein weiterer Punkt p i + 1 P {\displaystyle p_{i+1}\in P} gesucht, so dass ganz P {\displaystyle P} links von der Strecke p i p i + 1 ¯ {\displaystyle {\overline {p_{i}\,p_{i+1}}}} liegt. Normalerweise benötigt dies eine Rechenzeit in O ( | P | ) {\displaystyle O(|P|)} . Ist aber conv ( P ) {\displaystyle \operatorname {conv} (P)} bereits bekannt, reduziert sich der Aufwand durch binäre Suche auf O ( log | P | ) {\displaystyle O(\log |P|)} . Die Definition von links bezieht sich dabei auf die Orientierung der Euklidischen Ebene und muss im dreidimensionalen Fall entsprechend angepasst werden.

Daraus ergibt sich folgende Berechnungsvorschrift:

Es sei eine natürliche Zahl m n {\displaystyle m\leq n} gegeben.

  1. Teile S {\displaystyle S} in (circa) n / m {\displaystyle n/m} Teilmengen S j {\displaystyle S_{j}} mit jeweils höchstens m {\displaystyle m} Punkten auf.
  2. Für jede der Mengen S j {\displaystyle S_{j}} berechne conv ( S j ) {\displaystyle \operatorname {conv} (S_{j})} via Graham’s Scan.
  3. Setze die Teillösungen via Jarvis’ March wie folgt zusammen: Solange i m {\displaystyle i\leq m} gilt,
    1. bestimme für den gerade aktuellen Punkt s i {\displaystyle s_{i}} der konvexen Hülle und jede Teilmenge S j {\displaystyle S_{j}} einen Kandidaten s i + 1 , j {\displaystyle s_{i+1,j}} , so dass S j {\displaystyle S_{j}} vollständig links der Strecke s i s i + 1 , j ¯ {\displaystyle {\overline {s_{i}\,s_{i+1,j}}}} liegt;
    2. bestimme aus den Kandidaten einen Punkt s i + 1 {\displaystyle s_{i+1}} , so dass die Menge { s i + 1 , j 1 j n / m } {\displaystyle \{s_{i+1,j}\mid 1\leq j\leq n/m\}} vollständig links der Strecke s i s i + 1 ¯ {\displaystyle {\overline {s_{i}\,s_{i+1}}}} liegt.

Für m h {\displaystyle m\geq h} erhält man durch diese Berechnung die gesamte konvexe Hülle der ursprünglichen Menge S {\displaystyle S} , andernfalls bricht der Algorithmus zu früh ab. Entscheidend dabei ist, dass das Eintreten dieses Falles detektiert werden kann, ohne h {\displaystyle h} zu kennen. Die Berechnung in Schritt 3 kehrt nämlich nur dann zum fest gewählten Startpunkt s 1 {\displaystyle s_{1}} zurück, wenn die gesamte Hülle gefunden wurde.

Es lässt sich nun eine vorläufige Laufzeitanalyse in Abhängigkeit von m {\displaystyle m} durchführen. Als nicht ausgabesensitiver Algorithmus benötigt Graham’s Scan im 2. Schritt für jedes der S j {\displaystyle S_{j}} Zeit in O ( m log m ) {\displaystyle O(m\log m)} , insgesamt also n / m O ( m log m ) = O ( n log m ) {\displaystyle n/m\cdot O(m\log m)=O(n\log m)} . Da die konvexen Hüllen der Teilmengen bereits vorliegen, beschleunigt sich im Schritt 3.1 die Berechnung aller Kandidaten auf insgesamt O ( ( n / m ) log m ) {\displaystyle O((n/m)\log m)} . Schritt 3.2 benötigt sogar nur Zeit linear in n / m {\displaystyle n/m} und ist daher asymptotisch vernachlässigbar. Beide Teilschritte werden je m {\displaystyle m} Mal ausgeführt, es ergibt sich daher auch für den 3. Schritt eine Laufzeit in O ( n log m ) {\displaystyle O(n\log m)} . Insgesamt benötigt die Berechnung also Zeit O ( n log m ) {\displaystyle O(n\log m)} .

Könnte man nun einfach m = h {\displaystyle m=h} setzen, erhielte man einen optimalen Algorithmus, wie eingangs erwähnt ist die Größe der Ausgabe jedoch unbekannt. Diesem Problem kann man durch iterative Durchläufe mit immer größeren Werten für m {\displaystyle m} begegnen. Sobald das erste Mal m h {\displaystyle m\geq h} gewählt wurde, kann die Berechnung beendet werden. Dabei ist die Geschwindigkeit der Erhöhung relevant für die Gesamtlaufzeit, man möchte weder zu viele Iterationen (durch zu langsames Erhöhen) noch zu lange Iterationen (durch zu schnelles Erhöhen). Chans Algorithmus beginnt dabei mit einem konstanten Wert für m {\displaystyle m} und quadriert diesen in jedem Durchlauf. Entsprechend werden nur (circa) log log h {\displaystyle \log \log h} viele Iterationen benötigt, bis m {\displaystyle m} die Größe der Ausgabe das erste Mal überschreitet. Für die finale Laufzeit ergibt sich nun

t = 1 log log h O ( n log 2 2 t ) = O ( n ) t = 1 log log h O ( 2 t ) = O ( n 2 log log h ) = O ( n log h ) {\displaystyle \sum _{t=1}^{\log \log h}O(n\log 2^{2^{t}})=O(n)\cdot \sum _{t=1}^{\log \log h}O(2^{t})=O(n\cdot 2^{\log \log h})=O(n\log h)} ,

wie gewünscht.

Einzelnachweise

  1. T. M. Chan: Optimal output-sensitive convex hull algorithms in two and three dimensions. In: Discrete & Computational Geometry. 16. Jahrgang, Nr. 4, 1996, S. 361–368. 
  2. F. Nielsen: Algorithmes géométriques adaptatifs. Dissertation (franz.), Université de Nice Sophia-Antipolis, 1996.
  3. F. Nielsen: Grouping and Querying: A Paradigm to Get Output-Sensitive Algorithms. In: Discrete and Computational Geometry Japanese Conference (JCDCG'98). Revised Papers. (= Lecture Notes in Computer Science). Band 1763. Springer, Berlin, Heidelberg 2000, S. 250–257. 
  4. D. Kirkpatrick, R. Seidel: The Ultimate Planar Convex Hull Algorithm? In: SIAM J. Comput. 15. Jahrgang, Nr. 1, 1983, S. 287–299.