2.6 Chan's Algorithmus
Die Frage
Welche Komplexität haben output-sensitive Algorithmen für die konvexe Hülle?
- Untere Schranke: [Kirkpatrick & Seidel, 1986]. Kirkpatrick und Seidel haben selbst einen Algorithmus mit angegeben („The ultimate planar convex hull algorithm?“), der aber kompliziert ist.
- Einfach erreicht wird die Schranke durch Chan's Algorithmus (Timothy Chan, 1995/96), auch Nielsens Algorithmus genannt (Frank Nielsen hat ihn unabhängig gefunden). Er ist eine Kombination aus Graham's Scan und Jarvis' March.
- Optimierungen stammen von Emo Welzl.
Idee
Jarvis ist langsam, weil jeder Wrapping-Schritt alle Punkte anschaut. Chan beschleunigt diesen Schritt:
- Vorverarbeitung mit Graham: Teile die Punkte in Gruppen zu je höchstens Punkten und berechne für jede Gruppe die Hülle mit Graham. Kosten: .
- Wrapping mit Jarvis über die Gruppenhüllen: Statt alle Punkte zu prüfen, sucht man in jeder Gruppenhülle den besten Kandidaten. Da diese konvex und sortiert ist, geht das per binärer Suche in . Pro Wrapping-Schritt kostet das also statt .
- Problem: Man kennt nicht, also weiß man nicht, wie man wählen soll. Lösung: raten und die Schätzung schnell steigern.
Algorithmus (Folie 23)
1 Polygon ChansAlgorithm(Points P)
2 {
3 for (t = 1, 2, ... bis Hülle gefunden) {
4 H = min(2^(2^t), n); // Schätzung für die Eckenzahl h
5 Partitioniere P in k = n/m Teilmengen P1,...,Pk der Größe ≤ m;
6 Berechne CH(P1),...,CH(Pk) mit Graham's Scan;
7 Finde lexikographisch kleinsten Punkt p1; p0 = (−∞, 0);
8 for (j = 1, ..., H) { // versuche eine Hülle mit ≤ H Ecken
9 for (i = 1, ..., k) // Wrapping von CH(P1),...,CH(Pk)
10 Berechne qi ∈ CH(Pi)\{pj}, das den Winkel ∢ p(j-1) pj qi maximiert,
mit "binärer Suche" auf CH(Pi);
11 p(j+1) = der Punkt aus {q1,...,qk}, der ∢ p(j-1) pj q maximiert;
12 if (p(j+1) == p1) return Hülle gefunden;
13 } // H zu klein, keine Hülle mit H Ecken gefunden
14 } // Schätzung für h verbessern
15 }
Struktur (Folie 24):
| Zeilen | Teil |
|---|---|
| 3–4 | Iteration, um die unbekannte Eckenzahl zu finden |
| 5–6 | Vorverarbeitung: Graham's Scan auf den Gruppen |
| 7–13 | Jarvis' March über die Gruppenhüllen, abgebrochen nach Schritten |
Erläuterungen:
- Mit ist die Gruppengröße gleich der geschätzten Eckenzahl.
- ist ein Hilfspunkt, damit der erste Winkel (wie bei Jarvis zur Horizontalen) dieselbe Formel benutzt.
- Ist nach Schritten die Hülle nicht geschlossen, war die Schätzung zu klein. Man bricht ab und startet mit größerem neu. Dadurch kostet eine Runde nie mehr als Wrapping-Schritte.
Interaktiv durchspielen: Die Farben sind die Gruppen, jede mit ihrer Teilhülle. In jedem Wrapping-Schritt sucht man in jeder Gruppe den besten Kandidaten (gestrichelt) und nimmt davon den besten (Pfeil). Reicht nicht, wird die Runde rot abgebrochen und quadriert.
Laufzeit einer Runde (Folie 25)
| Zeile | Teil | Aufwand |
|---|---|---|
| 5 | Partitionieren | |
| 6 | Hüllen der Gruppen | |
| 7 | Wrapping initialisieren | |
| 8 | Iterationen | |
| 9 | Iterationen | |
| 10 | Wrapping jeder Hülle (binäre Suche) | |
| 11 | Wrapping der Hüllen (bestes ) |
Zusammen für Zeilen 4–13:
Wahl von und (Folie 26)
1. Mit wird eine Runde zu .
Die Zeilen 3–4 laufen, bis ist (oder schlimmstenfalls ):
Gesamtlaufzeit über alle Runden:
Warum (Quadrieren) statt (Verdoppeln)? Eine Runde kostet . Beim Quadrieren verdoppelt sich von Runde zu Runde (). Die Kosten bilden eine geometrische Reihe, die von der letzten Runde dominiert wird, und die kostet . Beim Verdoppeln von würde nur um 1 wachsen, man hätte Runden à bis zu , insgesamt .
2. Heuristisch besser in Zeile 4: , das wächst weniger aggressiv.
3. Gute Balance zwischen und : .
4. In Zeile 10 kann man lineare Suche statt binärer Suche nehmen („Hülle der Hüllen“). Das ist einfacher zu implementieren und ändert die Gesamtlaufzeit nicht [Welzl], denn die Laufzeit für das Wrapping ist ohnehin kleiner.
Einordnung
| Algorithmus | Laufzeit | klein | |
|---|---|---|---|
| Graham | |||
| Jarvis | |||
| Chan |
Chan ist immer mindestens so gut wie der bessere der beiden und erreicht die untere Schranke . Er ist also optimal output-sensitiv.