Algorithmische Geometrie - Vorlesungsskript
Algorithmische Geometrie - Vorlesungsskript
Algorithmische Geometrie - Vorlesungsskript
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Algorithmische</strong> <strong>Geometrie</strong><br />
Oliver Karch<br />
Entwurf vom 4. Februar 2000<br />
Vorlesung im Wintersemester 1998/99<br />
Lehrstuhl für Informatik I
ii<br />
Dies ist das vorläufige Skript zur Vorlesung »<strong>Algorithmische</strong><br />
<strong>Geometrie</strong>« (10703) im Wintersemester<br />
1998/99. Über Kritik, Verbesserungsvorschläge<br />
oder gefundene Tippfehler würde ich<br />
mich sehr freuen!<br />
¡<br />
Oliver Karch<br />
���������������������������������
Inhaltsverzeichnis<br />
1 Einleitung 1<br />
1.1 Was ist »<strong>Algorithmische</strong> <strong>Geometrie</strong>«? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.2 Beispiele geometrischer Fragestellungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
1.3 Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />
1.4 Informationsquellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
1.5 WWW-Seiten zur Vorlesung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
2 Grundbegriffe 5<br />
2.1 Topologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
2.1.1 Der Abstandsbegriff und innere Punkte . . . . . . . . . . . . . . . . . . . . . . . 5<br />
2.1.2 Stetigkeit, Wege und Zusammenhang . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
2.2 Graphentheorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
2.2.1 Gerichtete Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
2.2.2 Ungerichtete Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
2.2.3 Wege und Kreise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
2.2.4 Geometrische Realisierungen und Planarität . . . . . . . . . . . . . . . . . . . . 14<br />
2.3 Komplexität von Algorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
2.3.1 Größenordnung von Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
2.3.2 Berechnungsmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
2.3.3 Komplexitätsklassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
2.3.4 Das Entscheidungsbaummodell . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
3 Grundlegende <strong>Geometrie</strong> in der Ebene 23<br />
3.1 Elementare geometrische Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
3.2 Elementare Lokationsprobleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
3.2.1 Point-in-half-plane-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
3.2.2 Lage eines Punktes bezüglich eines Strahls . . . . . . . . . . . . . . . . . . . . . 25<br />
3.2.3 Schnitt zweier Strecken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
3.2.4 Die angulare Ordnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />
3.2.5 Sektorbestimmung – Single-shot-Anfrage . . . . . . . . . . . . . . . . . . . . . . 30<br />
3.2.6 Sektorbestimmung – Multiple-shot-Anfrage . . . . . . . . . . . . . . . . . . . . 30
iv<br />
4 Polygone 33<br />
4.1 Spezialfall »Konvexe Polygone« . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />
4.1.1 Test auf Konvexität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
4.1.2 Point-in-polygon-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
4.2 Spezialfall »Sternförmige Polygone« . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
4.2.1 Point-in-polygon-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />
4.2.2 Erzeugen eines (sternförmigen) Polygons mit vorgegebener Eckenmenge . . . 43<br />
4.3 Point-in-polygon-Test bei allgemeinen Polygonen . . . . . . . . . . . . . . . . . . . . . 44<br />
5 Das Plane-sweep-Paradigma 47<br />
5.1 Das Problem des dichtesten Punktepaares . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />
5.2 Schnitt konvexer Polygone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />
5.3 Anwendung »Schnitt von Halbebenen« . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />
5.4 Schnitt von Liniensegmenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55<br />
5.4.1 Schnittest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />
5.4.2 Bestimmen aller Schnittpunkte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />
5.5 Anwendung »Test auf Einfachheit« . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61<br />
5.6 Anwendung »Überlagerung von PSLGs« und »Arrangement-Berechnung« . . . . . . 62<br />
6 Konvexe Hüllen ebener Punktmengen 67<br />
6.1 Eigenschaften und untere Schranke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67<br />
6.2 Inkrementelle Konstruktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
6.3 Jarvis’s march . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />
6.4 Graham’s scan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73<br />
6.5 Konstruktion mittels Divide-and-conquer . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />
6.6 Quickhull . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />
6.7 Dynamische Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />
7 Lokationsprobleme in der Ebene 79<br />
7.1 Die Slab-Methode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />
7.2 Das Verfahren der verfeinerten Triangulationen . . . . . . . . . . . . . . . . . . . . . . 81<br />
7.2.1 Einschub »Die Eulersche Formel« . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
7.2.2 Die Methode von Kirkpatrick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84<br />
7.2.3 Subdivision-Hierarchien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85<br />
8 Nachbarschaftsprobleme 89<br />
8.1 Definition und Eigenschaften des Voronoi-Diagramms . . . . . . . . . . . . . . . . . . 89<br />
8.2 Der Delaunay-Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />
8.3 Verallgemeinerungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96<br />
8.4 Konstruktion des Voronoi-Diagramms . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98<br />
8.4.1 Divide-and-conquer-Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98<br />
8.4.2 Sweep-line-Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100<br />
A Abkürzungen und Symbole 103<br />
Literaturverzeichnis 107
Einleitung<br />
1.1 Was ist »<strong>Algorithmische</strong> <strong>Geometrie</strong>«?<br />
Die <strong>Algorithmische</strong> <strong>Geometrie</strong> (engl. computational geometry) ist ein Teilgebiet<br />
der theoretischen Informatik, welches sich mit geometrischen Objekten<br />
(wie z. B. Punkten, Linien, Kreisen, Ebenen) beschäftigt.<br />
Die Ziele und Aufgabenstellungen hierbei sind<br />
• der Entwurf von effizienten Algorithmen zur Lösung geometrischer<br />
Probleme, bei denen sehr oft große Mengen geometrischer Objekte<br />
involviert sind,<br />
• die Bestimmung der algorithmischen Komplexität geometrischer<br />
Probleme, d. h. die Beantwortung von Fragen wie z. B. »Was sind<br />
untere Schranken für die Laufzeit und den Speicherbedarf eines<br />
Algorithmus?« oder »Gibt es zur Lösung eines Problems überhaupt<br />
einen praktikablen Algorithmus?«.<br />
Hierdurch grenzt sich die <strong>Algorithmische</strong> <strong>Geometrie</strong> von anderen Gebieten<br />
ab, die sich ebenfalls mit geometrischen Objekten beschäftigen<br />
(z. B. die Algebraische <strong>Geometrie</strong> oder die Differentialgeometrie). Als eigenständiges<br />
Gebiet der Informatik hat sich die <strong>Algorithmische</strong> <strong>Geometrie</strong><br />
Ende der 70er Jahre etabliert und spielt mittlerweile in vielen realen Anwendungen<br />
eine große Rolle:<br />
Computergrafik Möglichst realistische Berechnung von Bildern oder<br />
Filmen geometrisch modellierter Szenen, z. B. mittels Ray Tracingund<br />
Radiosity-Verfahren (Schlagwort Virtual Reality)<br />
1<br />
CAD/CAM (engl. computer aided design/manufacturing) Erzeugung<br />
geometrischer Objekte, beispielsweise mittels Vereinigung und<br />
Durchschnitt von Grundobjekten (z. B. Quader, Kugel usw.) oder<br />
mittels interpolierender Flächen durch vorgegebene Stützpunkte.<br />
Bekanntes Beispiel ist die Dresdner Frauenkirche, die im Zweiten Dresdner Frauenkirche<br />
Weltkrieg fast vollständig zerstört und zunächst am Computer<br />
realitätsgetreu rekonstruiert wurde (siehe z. B. ���������������<br />
�������������������). Weitere Schlagworte: Assemblierpla- WWW☞
2 Einleitung<br />
Map Overlay<br />
Industrieroboter<br />
KUKA KR 125/1<br />
konvexe Hülle<br />
nung und Digital Mock-Up bei der Fertigung von aus mehreren<br />
Teilen bestehenden Gütern (z. B. den Motorraum eines Autos), die<br />
in der richtigen Reihenfolge zusammengesetzt werden müssen<br />
Geographische Informationssysteme (GIS) Ein geographisches Informationssystem<br />
speichert geographische Daten (z. B. Länderkonturen,<br />
Flüsse, Bevölkerungsdichten usw.) und dient dazu, Anfragen<br />
zu beantworten, bei denen geometrische Eigenschaften miteinander<br />
kombiniert werden müssen. Beispielsweise könnte man<br />
einen Platz für ein neues Naherholungsgebiet suchen: ein günstiges<br />
Stück Land (Quadratmeterpreis ≤ x DM) einer gewissen Mindestfläche<br />
≥ y km 2 , das außerdem von den zu versorgenden Städten<br />
gut zu erreichen ist (Entfernung ≤ z km). Dies würde drei<br />
Anfragen an verschiedene geographische Datenbanken nach sich<br />
ziehen; die resultierenden Gebiete, welche die Kriterien erfüllen,<br />
müssen dann noch überlagert werden; ihre Schnittmenge (Stichwort<br />
Map Overlay) beantwortet dann die ursprüngliche Anfrage.<br />
Robotik (engl. robotics) Roboter sind meist Fahrzeuge (Fahrerlose<br />
Transportsysteme, FTS) oder mit Manipulatoren ausgestattete<br />
Industrieroboter. Typische Problemstellungen für solche Roboter<br />
sind<br />
• die Bewegungs- bzw. Bahnplanung, d. h. das Finden einer Bewegung<br />
von einer Anfangskonfiguration in eine Endkonfiguration,<br />
die zum einen Kollisionen mit der Umgebung vermeidet<br />
und zum anderen möglichst effizient ist,<br />
• die Lokalisation, d. h. die Bestimmung der eigenen Position anhand<br />
von Sensoren und Karten,<br />
• die Exploration einer unbekannten Umgebung, um z. B. eine<br />
Karte zu generieren.<br />
1.2 Beispiele geometrischer Fragestellungen<br />
Die folgenden realen Probleme lassen sich jeweils als geometrische Fragestellung<br />
modellieren und motivieren eine theoretische Untersuchung<br />
des jeweiligen Gebietes:<br />
Einzäunen von Apfelbäumen Auf einem Feld stehen einige Apfelbäume,<br />
die eingezäunt werden sollen.<br />
Frage: Wieviel Meter Zaun braucht man mindestens, um alle Bäume<br />
einzuzäunen? Wie muß der Zaun verlaufen?<br />
Geometrische Formulierung: Modelliere die Bäume als Punkte in<br />
der Ebene und bestimme die konvexe Hülle (siehe Kapitel 6) dieser<br />
Punktmenge.<br />
Christos Reichstag Gegeben die Pläne des Berliner Reichstages.
1.3 Literatur 3<br />
Frage: Wieviel Stoff wird mindestens benötigt, um den Reichstag<br />
zu verhüllen? Wie muß der Stoff zugeschnitten werden?<br />
Geometrische Formulierung: Bestimme die dreidimensionale konvexe<br />
Hülle des Reichstages.<br />
Nähestes Telefon Sie sind auf dem Unicampus und wollen telefonieren.<br />
Frage: Welches Telefon ist das näheste?<br />
Geometrische Formulierung: Modelliere die Telefone wieder als<br />
Punkte in der Ebene und bestimme eine Einteilung in Regionen<br />
mit gleichem nähesten Telefon. Diese Karte nennt man das Voronoi-Diagramm<br />
(siehe Kapitel 8). Voronoi-Diagramm<br />
Versorgung Mit einem Sender möglichst geringer Leistung wollen Sie<br />
eine Menge von Haushalten erreichen.<br />
Frage: Wo soll der Sender plaziert werden? Welche Leistung muß<br />
der Sender besitzen?<br />
Geometrische Formulierung: Suche die kleinste Kreisscheibe<br />
(engl. smallest enclosing circle), die alle Häuser überdeckt. smallest enclosing circle<br />
1.3 Literatur<br />
Lehrbücher zum Thema sind<br />
Buch Preis<br />
[5] M. de Berg, M. v. Kreveld, M. Overmars,<br />
O. Schwarzkopf. Computational Geometry: Algorithms<br />
and Applications.<br />
[8] H. Edelsbrunner. Algorithms in Combinatorial<br />
Geometry.<br />
54,– DM<br />
102,– DM<br />
[14] R. Klein. <strong>Algorithmische</strong> <strong>Geometrie</strong>. 58,– DM<br />
[19] J. O’Rourke. Computational Geometry in C. ca. 50,– DM<br />
[22] F. P. Preparata, M. I. Shamos. Computational Geometry:<br />
An Introduction.<br />
102,– DM<br />
Das Buch von Preparata und Shamos [22] zählt hierbei sicherlich zu<br />
den „Klassikern“ der <strong>Algorithmische</strong>n <strong>Geometrie</strong> und gibt einen guten<br />
Überblick über das Stoffgebiet. Es ist allerdings schon etwas in die Jahre<br />
gekommen; randomisierte Algorithmen werden dort beispielsweise<br />
überhaupt nicht behandelt.<br />
Einen aktuelleren Querschnitt erhält man in den Büchern von de Berg<br />
et al. [5] (jeweils anhand motivierender Beispiele und Anwendungen)<br />
und Klein [14], die beide sehr empfehlenswert sind. Das Buch von
4 Einleitung<br />
☞ WWW<br />
☞ WWW<br />
☞ WWW<br />
☞ WWW<br />
Edelsbrunner [8] ist ebenfalls ein „Klassiker“, behandelt aber mehr kombinatorische<br />
Aspekte der <strong>Algorithmische</strong>n <strong>Geometrie</strong>.<br />
Im Buch von O’Rourke [19], dessen überarbeitete zweite Auflage gerade<br />
erschienen ist, wird besonders auf die Implementierung geometrischer<br />
Algorithmen in C (und auch in Java) eingegangen.<br />
1.4 Informationsquellen<br />
Nützliche Informationen (z. B. zu Tagungen, Literaturdatenbanken,<br />
Mailinglisten usw.) finden sich auf der Homepage der GI-<br />
Fachgruppe 0. 1. 2 unter<br />
�������������������������������������������������<br />
Darüberhinaus sind die WWW-Seiten von Jeff Erickson (»Computational<br />
Geometry Pages«) unter<br />
�������������������������������������������<br />
und von David Eppstein (»Geometry in Action«) unter<br />
������������������������������������������<br />
sehr empfehlenswert.<br />
1.5 WWW-Seiten zur Vorlesung<br />
Die WWW-Seiten zur Vorlesung sind zu erreichen unter<br />
���������������������������������������������<br />
��������������������������������������
2.1 Topologie<br />
Referenzwerke: [9, 11, 23]<br />
Grundbegriffe<br />
In vielen Bereichen der <strong>Algorithmische</strong>n <strong>Geometrie</strong> spielen Abstände<br />
geometrischer Objekte eine Rolle, deshalb soll dieser Begriff zunächst<br />
formal dargestellt werden, um danach Begriffe wie »Stetigkeit«, »Weg«<br />
usw. ableiten zu können.<br />
2.1.1 Der Abstandsbegriff und innere Punkte<br />
Definition 2.1 (Metrik) Sei X eine Menge und d: X × X → R≥0 eine<br />
Abbildung, die je zwei Elementen x und y aus X einen Abstand d(x, y)<br />
zuordnet.<br />
Die Abbildung d ist eine Metrik, falls für alle x, y, z aus X folgendes gilt: Metrik<br />
d(x, y) = 0 ⇐⇒ x = y<br />
d(x, y) = d(y, x) (Symmetrie)<br />
d(x, z) ≤ d(x, y) + d(y, z) (Dreiecksungleichung)<br />
Das Paar (X, d) heißt dann metrischer Raum. metrischer Raum<br />
Befinden wir uns im d-dimensionalen reellen Raum R d , dann ist für zwei<br />
Punkte x = (x1, . . . , xd) und y = (y1, . . . , yd) die euklidische Metrik euklidische Metrik<br />
�<br />
�<br />
�<br />
|x y| := � d �<br />
(xi − yi) 2 (2.1)<br />
i=1<br />
definiert. Der Einfachheit halber bezeichnet man den R d zusammen<br />
mit der euklidischen Metrik auch als den d-dimensionalen euklidischen<br />
Raum, oder kurz E d . Im Rahmen dieser Vorlesung wird für uns fast ausschließlich<br />
der E 2 oder der E 3 eine Rolle spielen. Hier beschreibt die euklidische<br />
Metrik den gewohnten (euklidischen) Abstand zweier Punkte<br />
in der Ebene bzw. im Raum.<br />
2
6 Grundbegriffe<br />
Skalarprodukt<br />
Minkowski-Metriken<br />
x<br />
ε<br />
U ε(x)<br />
ε-Umgebung<br />
innerer Punkt<br />
Berührpunkt<br />
Randpunkt<br />
Bemerkung 2.2 Eine andere Möglichkeit die euklidische Metrik zu definieren,<br />
ist mittels des kanonischen Skalarprodukts des R d ,<br />
〈x, y〉 :=<br />
d�<br />
i=1<br />
xiyi .<br />
Bekanntlich ist das Skalarprodukt 〈x, y〉 = |x| |y| cos α, wobei |x| die euklidische<br />
Länge des Vektors x bezeichnet und α der Winkel zwischen den<br />
beiden Vektoren x und y ist.<br />
Somit gilt dann für die euklidische Distanz |x y| = |x − y| =<br />
� 〈x − y, x − y〉. ⊳<br />
Die euklidische Metrik ist nur ein spezielles Mitglied aus der Familie der<br />
Minkowski-Metriken Lp(x, y), die folgendermaßen definiert sind:<br />
Lp(x, y) :=<br />
und<br />
� d�<br />
i=1<br />
|xi − yi| p<br />
L∞(x, y) := d<br />
max<br />
i=1 |xi − yi|<br />
�1/p<br />
für 1 ≤ p < ∞<br />
(2.2)<br />
Für p = 2 erhält man also die euklidische Metrik, für p = 1 die sog.<br />
Manhattan-Metrik und für p = ∞ die sog. Maximum-Metrik.<br />
Mittels des Metrikbegriffes können nun auch die üblichen topologischen<br />
Begriffe definiert werden.<br />
Definition 2.3 Sei x ∈ X ein Punkt und A ⊆ X eine Teilmenge eines<br />
metrischen Raumes (X, d).<br />
• Für eine reelle Zahl ε > 0 heißt die Menge<br />
die ε-Umgebung von x.<br />
U ε(x) := { y ∈ X � � d(x, y) < ε } (2.3)<br />
• Ein Punkt x ∈ X heißt innerer Punkt von A, wenn es eine<br />
ε-Umgebung Uε(x) von x gibt, die ganz in A enthalten ist. Die<br />
Menge aller inneren Punkte von A heißt das Innere oder der offene<br />
Kern von A und wird mit A ◦ bezeichnet.<br />
• Ein Punkt x ∈ X heißt Berührpunkt von A, wenn in jeder<br />
ε-Umgebung Uε(x) von x ein Punkt aus A liegt. Die Menge aller<br />
Berührpunkte von A heißt die abgeschlossene Hülle von A und<br />
wird mit A bezeichnet.<br />
• Ein Punkt x ∈ X heißt Randpunkt von A, wenn in jeder<br />
ε-Umgebung Uε(x) von x sowohl ein Punkt aus A als auch ein<br />
Punkt aus dem Komplement A c := X \ A liegt, d. h. wenn x Berührpunkt<br />
von A und von A c ist. Die Menge aller Randpunkte<br />
von A heißt der Rand von A und wird mit ∂A bezeichnet.
2.1 Topologie 7<br />
• Die Menge A heißt offen (in X), falls jeder ihrer Punkte ein innerer offen und abgeschlossen<br />
Punkt ist. Sie heißt abgeschlossen (in X), falls ihr Komplement A c<br />
offen ist. Die Familie aller offenen Teilmengen eines metrischen<br />
Raumes (X, d) bezeichnet man auch als eine Topologie von X.<br />
Für eine Menge A ⊆ X erhalten wir hieraus einige einfache Folgerungen:<br />
• Die Menge A ist genau dann abgeschlossen, wenn sie alle ihre Berührpunkte<br />
enthält. Denn es gilt<br />
A ist abgeschlossen ⇐⇒ A c = X \ A ist offen<br />
⇐⇒ ∀ x∈X\A ∃ε>0 U ε(x) ⊆ X \ A<br />
⇐⇒ ∀ x∈X\A ∃ε>0 U ε(x) ∩ A = ∅<br />
⇐⇒ ∀ x∈X\A x ist kein Berührpunkt von A<br />
⇐⇒ (X \ A) ∩ A = ∅<br />
⇐⇒ A ⊆ A .<br />
• Es gilt immer die Inklusion A ◦ ⊆ A ⊆ A, denn jede<br />
ε-Umgebung U ε(x) für einen Punkt x enthält diesen selbst.<br />
Daraus folgt<br />
A ist offen ⇐⇒ A = A ◦ ∧ A ist abgeschlossen<br />
⇐⇒ A = A .<br />
• Es gelten die beiden Dualitätsbeziehungen<br />
(A ◦ ) c = X \ A ◦ = X \ A = A c , und<br />
(A) c = X \ A = (X \ A) ◦ = (A c ) ◦ , wegen<br />
x ∈ X \ A ◦ ⇐⇒ ∄ε>0 U ε(x) ⊆ A<br />
⇐⇒ ∀ε>0 U ε(x) � A<br />
⇐⇒ ∀ε>0 U ε(x) ∩ X \ A �= ∅<br />
⇐⇒ x ∈ X \ A , und<br />
x ∈ X \ A ⇐⇒ x /∈ A<br />
⇐⇒ ¬∀ε>0 U ε(x) ∩ A �= ∅<br />
⇐⇒ ¬∀ε>0 U ε(x) � X \ A<br />
⇐⇒ ∃ε>0 U ε(x) ⊆ X \ A<br />
⇐⇒ x ∈ (X \ A) ◦ .<br />
Damit erhält man dann für den Rand ∂A einer Menge A<br />
∂A = A ∩ A c = A ∩ (A ◦ ) c = A \ A ◦ .
8 Grundbegriffe<br />
E 2<br />
1<br />
U ε<br />
−1 S 1 E<br />
−1<br />
Relativtopologie<br />
stetig<br />
Weg<br />
einfacher Weg<br />
Beispiel 2.4 Die Strecke S = [−1, 1] ist in E abgeschlossen, ihr Rand ist<br />
die Menge R = {−1, 1} und ihr Inneres die Menge I = (−1, 1). Die punktierte<br />
Strecke S ′ = S \ {0} ist weder abgeschlossen noch offen und ihr<br />
Rand ist die Menge R ′ = {−1, 0, 1}.<br />
Faßt man E als Teilmenge des E 2 auf (in der Form E × {0} ⊆ E 2 ), dann<br />
ist S (genauer, die Menge S × {0}) immer noch abgeschlossen. Im E 2<br />
besitzt S aber keine inneren Punkte mehr, denn eine ε-Umgebung im E 2<br />
ist eine (offene) Kreisfläche, die in S keinen Platz findet. ⊳<br />
Oft möchte man über das Innere einer Menge reden können, auch wenn<br />
diese wie im letzten Beispiel in einen höherdimensionalen Raum eingebettet<br />
ist.<br />
Definition 2.5 (Relativtopologie) Sei R ⊆ X eine Teilmenge eines metrischen<br />
Raumes (X, d), dann ist für einen Punkt x ∈ R dessen ε-Umgebung<br />
in R definiert durch<br />
U R ε (x) := { y ∈ R � � d(x, y) < ε } = U ε(x) ∩ R . (2.4)<br />
Die hierdurch auf R entstehende Topologie heißt die von X induzierte<br />
Topologie oder Relativtopologie.<br />
Die übrigen Definitionen übertragen sich, indem man jeweils U ε(x)<br />
durch U R ε (x) und X durch R ersetzt. Im obigen Beispiel verwenden<br />
wir R = E × {0} und erhalten dann – wie erwartet – für das relative Innere<br />
von S × {0} die Menge (−1, 1) × {0} in Analogie zu Beispiel 2.4.<br />
2.1.2 Stetigkeit, Wege und Zusammenhang<br />
Mit Hilfe des durch die Metrik festgelegten Abstandsmaßes können wir<br />
nun definieren, wann eine Abbildung von einem metrischen Raum in<br />
einen anderen stetig ist und darauf aufbauend den Begriff des Weges<br />
einführen.<br />
Definition 2.6 (Stetigkeit) Seien (X, d) und (Y, e) metrische Räume<br />
und f: X → Y eine Abbildung. f ist genau dann im Punkt ˜x ∈ X stetig,<br />
wenn zu jedem ε > 0 ein δ > 0 existiert, so daß<br />
e(f(x), f(˜x)) < ε für alle x ∈ X mit d(x, ˜x) < δ .<br />
Definition 2.7 (Wege und Zusammenhang)<br />
Unter einem Weg w von a ∈ X nach b ∈ X verstehen wir das Bild einer<br />
stetigen Abbildung<br />
�w: [0, 1] → X mit �w(0) = a und �w(1) = b<br />
und nennen �w eine Parametrisierung des Weges w.<br />
• Der Weg w heißt geschlossen, wenn �w(0) = �w(1) gilt.<br />
• Der Weg w heißt einfach oder doppelpunktfrei, wenn �w auf [0, 1)<br />
injektiv ist.
2.1 Topologie 9<br />
• Eine Menge A ⊆ X heißt wegzusammenhängend, wenn je zwei wegzusammenhängend<br />
Punkte von A durch einen Weg verbunden werden können, der<br />
ganz in A verläuft.<br />
»Wegzusammenhang« ist eine Äquivalenzrelation und induziert<br />
eine Zerlegung von A in disjunkte Zusammenhangskomponenten.<br />
Abbildung 2.1 zeigt einige Beispiele für Wege in der Ebene: Alle vier<br />
Wege mit Ausnahme von w1 sind geschlossen; nur die Wege w1 und w4<br />
sind doppelpunktfrei.<br />
Bemerkung 2.8 Zu jedem Weg w (außer zum trivialen Weg �w([0, 1]) ≡<br />
a) gibt es unendlich viele Parametrisierungen. Wir können uns eine Parametrisierung<br />
vorstellen als die Art und Weise, wie der Weg abgelaufen<br />
wird. Die Ableitung �w ′ entspräche dann der „Geschwindigkeit“ beim<br />
Ablaufen des Weges. ⊳<br />
Zusammenhangskomponenten<br />
Für einen einfachen geschlossenen Weg w im E 2 (wie z. B. der Weg w4<br />
in Abbildung 2.1) besagt der Jordansche Kurvensatz, daß R 2 \ w aus ge- Jordanscher Kurvensatz<br />
nau zwei Gebieten (offene und wegzusammenhängende Mengen) besteht,<br />
deren Rand w ist: einem von w umschlossenen inneren und einem<br />
unbeschränkten äußeren Gebiet. Der Beweis dieser alles andere als<br />
trivialen Aussage findet sich für Interessierte z. B. in [17].<br />
Definition 2.9 (Einfacher Wegzusammenhang) Eine wegzusammenhängende<br />
Menge A ⊆ E2 heißt einfach-wegzusammenhängend, wenn<br />
für jeden in A verlaufenden einfachen geschlossenen Weg sein inneres<br />
Gebiet ebenfalls in A enthalten ist.<br />
Anschaulich bedeutet der einfache Wegzusammenhang einer Menge,<br />
daß sie keine „Löcher“ besitzt. Siehe hierzu das Beispiel in Abbildung<br />
2.2 auf der folgenden Seite.<br />
Beim Umgang mit den oben definierten Wegen interessiert natürlich<br />
auch deren Länge. Diese kann man durch Approximation mit Streckenzügen<br />
definieren: Man wählt n Stützstellen 0 = t1 < . . . < tn = 1<br />
und bildet die Summe �i=n−1 i=1 d( �w(ti), �w(ti+1) über alle Abstände. Der<br />
Limes für n → ∞ des Supremums dieser Summe für alle möglichen<br />
Wahlen von n aufeinanderfolgenden Stützstellen im Intervall [0, 1] bezeichnet<br />
man als die Länge des Weges w. Wenn dieser Wert endlich ist,<br />
nennt man w rektifizierbar.<br />
Für einen Weg w im E 2 , der durch �w(t) = (x(t), y(t)) parametrisiert ist,<br />
kann man die Integralformel für die Weglänge<br />
a<br />
w1<br />
b<br />
a = b<br />
w2<br />
a = b<br />
w3<br />
a = b<br />
w4<br />
einfachwegzusammenhängend<br />
a<br />
Weglänge mittels<br />
Approximation durch<br />
Streckenzüge<br />
Integralformel für die<br />
Weglänge<br />
b<br />
Abbildung 2.1<br />
Die Wege w1 und w4 sind<br />
einfach, w2, w3, w4 sind<br />
geschlossen
10 Grundbegriffe<br />
Abbildung 2.2<br />
Menge A ist einfach<br />
wegzusammenhängend,<br />
Menge B nicht<br />
gerichteter Graph<br />
Schlinge<br />
A<br />
w<br />
Länge(w) =<br />
� 1<br />
0<br />
B<br />
�<br />
x ′ (t) 2 + y ′ (t) 2 dt (2.5)<br />
benutzen, sofern die Koordinatenfunktionen stetig differenzierbar sind.<br />
2.2 Graphentheorie<br />
Referenzwerke: [12, 15, 18]<br />
Für viele Aufgabenstellungen in der <strong>Algorithmische</strong>n <strong>Geometrie</strong> ist eine<br />
Modellierung mittels eines Graphen hilfreich oder die auftretenden Objekte<br />
selbst sind Graphen bzw. durch solche beschreibbar (siehe z. B. das<br />
Voronoi-Diagramm und der dazu duale Delaunay-Graph in Kapitel 8).<br />
2.2.1 Gerichtete Graphen<br />
Definition 2.10 (Gerichteter Graph) Ein Quadrupel G = (V, R, α, ω) ist<br />
ein gerichteter Graph (oder kurz Graph), wenn folgendes gilt:<br />
1. Die Eckenmenge V �= ∅ und die Pfeilmenge R des Graphen sind<br />
disjunkt, V ∩ R = ∅.<br />
2. Die Abbildungen α: R → V und ω: R → V weisen jedem Pfeil r ∈<br />
R eine Anfangsecke α(r) und eine Endecke ω(r) zu.<br />
Der Graph G heißt endlich, wenn |V ∪ R| < ∞ gilt.<br />
Definition 2.11 Sei G = (V, R, α, ω) ein Graph. Ein Pfeil r ∈ R heißt<br />
Schlinge, wenn α(r) = ω(r). Der Graph G heißt schlingenfrei, wenn er<br />
keine Schlingen enthält.<br />
Zwei Pfeile r �= r ′ heißen parallel, wenn α(r) = α(r ′ ) und ω(r) = ω(r ′ ).<br />
Die Pfeile r �= r ′ heißen invers, wenn α(r) = ω(r ′ ) und ω(r) = α(r ′ ).<br />
w
2.2 Graphentheorie 11<br />
α ω<br />
r1 v1 v2<br />
r2 v1 v2<br />
r3 v2 v3<br />
r4 v3 v3<br />
r5 v4 v3<br />
r6 v3 v4 v1 v5<br />
r1<br />
r2<br />
Der Graph G heißt einfach oder schlicht, wenn er schlingenfrei ist und einfach<br />
keine Parallelen enthält. In diesem Fall ist jeder Pfeil r eindeutig durch<br />
das Paar (α(r), ω(r)) charakterisiert. Man kann dann auch einfach G =<br />
(V, R) schreiben, mit R ⊆ V × V.<br />
Beispiel 2.12 Der in Abbildung 2.3 dargestellte Graph besitzt eine<br />
Schlinge (r4), zwei parallele Pfeile (r1 und r2), sowie zwei inverse Pfeile<br />
(r5 und r6). Aufgrund der Schlinge und der beiden Parallelen ist er also<br />
nicht einfach. ⊳<br />
v2<br />
r3<br />
r5<br />
v3<br />
v4<br />
r4<br />
r6<br />
Abbildung 2.3<br />
Ein Graph und seine<br />
geometrische Realisierung<br />
im E 2<br />
Definition 2.13 Sei G = (V, R, α, ω) ein Graph. Zwei Ecken u und v<br />
heißen adjazent oder benachbart, wenn es einen Pfeil r ∈ R gibt mit adjazente Ecken<br />
α(r) = u ∧ ω(r) = v oder α(r) = v ∧ ω(r) = u.<br />
Eine Ecke u und ein Pfeil r heißen inzident, wenn u ∈ {α(r), ω(r)}. Zwei inzident<br />
Pfeile r und r ′ heißen inzident, wenn es eine Ecke v gibt, die mit r und<br />
mit r ′ inzidiert.<br />
Für eine Ecke v ∈ V heißt<br />
B + (v) := { r ∈ R � � α(r) = v }<br />
das von v ausgehende Pfeilbüschel,<br />
B − (v) := { r ∈ R � � ω(r) = v }<br />
das in v mündende Pfeilbüschel,<br />
N(v) := { u ∈ V � � ∃r∈R α(r) = v ∧ ω(r) = u }<br />
die Nachfolgermenge von v,<br />
V(v) := { u ∈ V � � ∃r∈R α(r) = u ∧ ω(r) = v }<br />
die Vorgängermenge von v,<br />
g + (v) := |B + (v)| der Außengrad von v,<br />
g − (v) := |B − (v)| der Innengrad von v,<br />
g(v) := g + (v) + g − (v) der Grad von v.<br />
Beispiel 2.14 Im Graph von Abbildung 2.3 münden in die Ecke v2 zwei<br />
Pfeile (r1 und r2) und ihr Innengrad ist somit gleich 2. Ihre Vorgängermenge<br />
enthält dagegen nur die eine Ecke v1.<br />
Für die isolierte Ecke v5 gilt: B + (v5) = B − (v5) = N(v5) = V(v5) = ∅<br />
und g + (v5) = g − (v5) = g(v5) = 0. ⊳
12 Grundbegriffe<br />
Teilgraph<br />
Obergraph<br />
Partialgraph<br />
Subgraph<br />
ungerichteter Graph<br />
Bemerkung 2.15 Für Graphen mit endlicher Pfeilmenge, d. h. |R| < ∞,<br />
gilt<br />
1. �<br />
v∈V g+ (v) = �<br />
v∈V g− (v) = |R| und<br />
2. �<br />
v∈V g(v) = 2 |R|. ⊳<br />
Definition 2.16 (Teilgraph und Obergraph)<br />
Ein Graph G ′ = (V ′ , R ′ , α ′ , ω ′ ) heißt Teilgraph eines Graphen G =<br />
(V, R, α, ω) (i. Z. G ′ ⊑ G), wenn gilt<br />
1. V ′ ⊆ V und R ′ ⊆ R sowie<br />
2. α|R ′ = α ′ und ω|R ′ = ω ′ .<br />
In diesem Fall heißt G dann Obergraph von G ′ (i. Z. G ⊒ G ′ ).<br />
Bemerkung 2.17 Die Relation „⊑“ ist (ebenso wie „⊒“)<br />
1. reflexiv (G ⊑ G),<br />
2. antisymmetrisch (G ⊑ G ′ ∧ G ′ ⊑ G =⇒ G = G ′ ) und<br />
3. transitiv (G ⊑ G ′ ∧ G ′ ⊑ G ′′ =⇒ G ⊑ G ′′ ). ⊳<br />
Definition 2.18 (Partialgraph und Subgraph)<br />
Sei G = (V, R, α, ω) ein Graph und R ′ ⊆ R eine Kantenteilmenge.<br />
Der durch R ′ induzierte Partialgraph GR ′ ist definiert durch GR ′<br />
(V, R<br />
:=<br />
′ , α|R ′, ωR ′).<br />
Für eine Eckenteilmenge V ′ ⊆ V ist der durch V ′ induzierte Subgraph<br />
definiert durch G[V ′ ] := (V ′ , RV ′, α|R V ′ , ωR V ′ ) mit RV ′ := { r ∈ R � �<br />
α(r) ∈ V ′ ∧ ω(r) ∈ V ′ }.<br />
Ein Graph H heißt Partialgraph (bzw. Subgraph) von G, wenn es eine<br />
Kantenteilmenge R ′ ⊆ R (bzw. Eckenteilmenge V ′ ⊆ V) gibt, so daß<br />
H = GR ′ (bzw. H = G[V ′ ]) gilt.<br />
2.2.2 Ungerichtete Graphen<br />
Definition 2.19 (Ungerichteter Graph) Ein Tripel G = (V, E, γ) ist ein<br />
ungerichteter Graph, wenn folgendes gilt:<br />
1. Die Eckenmenge V �= ∅ und die Kantenmenge E des Graphen<br />
sind disjunkt, V ∩ E = ∅.<br />
2. Die Abbildung γ: E → { X � � X ⊆ V ∧ 1 ≤ |X| ≤ 2 } weist jeder<br />
Kante zwei Endpunkte zu (bzw. einen Endpunkt im Fall einer<br />
Schlinge).<br />
Der Graph G heißt endlich, wenn |V ∪ R| < ∞ gilt.
2.2 Graphentheorie 13<br />
Begriffe wie parallel, einfach, Adjazenz, Inzidenz usw. sind analog zu den<br />
Begriffen in gerichteten Graphen definiert.<br />
Im Falle eines einfachen Graphen G = (V, E, γ), der also weder Schlingen<br />
noch Parallelen enthält, ist jede Kante e ∈ E eindeutig durch die zweielementige<br />
Menge γ(e) = {u, v} ihrer Endpunkte charakterisiert. Man<br />
kann dann auch G = (V, E) für den ungerichteten Graphen schreiben.<br />
Bemerkung 2.20 Oft werden wir unter leichtem Mißbrauch der Notation<br />
auch (u, v) anstelle von {u, v} für eine ungerichtete Kante schreiben.<br />
⊳<br />
2.2.3 Wege und Kreise<br />
Definition 2.21 (Weg und Kreis) Ein Weg w in einem Graphen G = Weg<br />
(V, R, α, ω) ist eine endliche Folge w = (r1, . . . , rn), n ≥ 1, von Pfeilen<br />
ri ∈ R (für i = 1, . . . , n), für die gilt<br />
ω(ri) = α(ri+1) für i = 1, . . . , n − 1.<br />
Die Startecke des Weges ist α(w) := α(r1) und die Endecke ist ω(w) :=<br />
ω(rn). Die Länge |w| des Weges w ist die Anzahl n der durchlaufenen<br />
Pfeile.<br />
Ein Weg w mit α(w) = ω(w) heißt Kreis. Kreis<br />
Die Eckenmenge s(w) := {α(r1), . . . , α(rn), ω(rn)} bezeichnen wir als<br />
die Spur des Weges w. Eine Ecke v wird von w berührt, wenn v ∈ s(w)<br />
gilt.<br />
Ein Weg w heißt einfach, wenn ri �= rj für i �= j, d. h. wenn er keinen<br />
Pfeil mehr als einmal durchläuft.<br />
Ein Weg w heißt elementar, wenn α(ri) �= α(rj) und ω(ri) �= ω(rj)<br />
für i �= j, d. h. wenn er keine Ecke mehr als einmal durchläuft – mit<br />
Ausnahme des Falles, daß Anfangs- und Endecke übereinstimmen.<br />
Beispiel 2.22 In Abbildung 2.3 auf Seite 11 ist der Weg w =<br />
(r1, r3, r6, r5) zwar einfach, aber nicht elementar, da die Ecke v3 zweimal<br />
besucht wird.<br />
Der Weg w = (r5, r6) ist ein elementarer (und damit auch einfacher)<br />
Kreis. ⊳<br />
Definition 2.23 (Weg und Kreis im ungerichteten Graphen)<br />
Ein Weg w in einem ungerichteten Graphen G = (V, E, γ) ist eine endli- Weg<br />
che Folge w = (e1, . . . , en), n ≥ 1, von Kanten ei ∈ E (für i = 1, . . . , n),<br />
für die es Ecken v0, . . . , vn ∈ V gibt, so daß gilt<br />
γ(ei) = {vi−1, vi} für i = 1, . . . , n.<br />
Die Startecke des Weges ist α(w) := v0 und die Endecke ist ω(w) := vn.
14 Grundbegriffe<br />
erreichbar<br />
Zusammenhang<br />
geometrische Realisierung<br />
geometrischer Graph<br />
Die Begriffe Länge, Spur, einfach und elementar sind analog zum gerichteten<br />
Fall definiert.<br />
Definition 2.24 (Erreichbarkeit) Eine Ecke v ′ in einem (gerichteten oder<br />
ungerichteten) Graphen G heißt von einer Ecke v aus erreichbar, wenn<br />
entweder v = v ′ gilt oder es einen Weg w gibt mit α(w) = v und ω(w) =<br />
v ′ . Die (in G) von v aus erreichbaren Ecken werden mit EG(v) bezeichnet,<br />
oder kurz E(v), wenn klar ist, um welchen Graphen es sich handelt.<br />
Beispiel 2.25 In Abbildung 2.3 auf Seite 11 ist die Menge der von v2 erreichbaren<br />
Ecken E(v2) = {v2, v3, v4} und die Menge der von v5 erreichbaren<br />
Ecken E(v5) = {v5}. ⊳<br />
Definition 2.26 (Zusammenhang)<br />
Ein gerichteter Graph G = (V, R, α, ω) heißt (stark) zusammenhängend,<br />
wenn für jede Ecke v ∈ V gilt EG(v) = V.<br />
Ein ungerichteter Graph G = (V, E, γ) heißt zusammenhängend, wenn<br />
für jede Ecke v ∈ V gilt EG(v) = V.<br />
Anschaulich bedeutet also der (starke) Zusammenhang eines Graphen,<br />
daß jede Ecke eines Graphens jede andere Ecke über einen Weg erreichen<br />
kann.<br />
2.2.4 Geometrische Realisierungen und Planarität<br />
Einen Graphen durch Angabe seiner Ecken- und Pfeilmenge sowie der<br />
Abbildungen α und ω zu beschreiben ist meist mühsam, wie Abbildung<br />
2.3 auf Seite 11 (links) zeigt. Intuitiver ist eine geometrische Realisierung<br />
des Graphen, z. B. in der Ebene (rechte Seite der Abbildung).<br />
Definition 2.27 (Geometrischer Graph) Sei G = (V, R, α, ω) ein Graph<br />
und (X, d) ein metrischer Raum. Eine geometrische Realisierung des<br />
Graphen G bildet die Ecken auf paarweise verschiedene Punkte in X ab.<br />
Die Pfeile werden auf einfache Wege abgebildet, welche die Bildpunkte<br />
der entsprechenden Ecken verbinden und sonst keine Bildpunkte anderer<br />
Ecken berühren. Das Ergebnis nennt man einen zu G gehörenden<br />
geometrischen Graphen.<br />
Bemerkung 2.28 Oftmals werden wir unter leichtem Mißbrauch der<br />
Notation die beiden Begriff »(abstrakter) Graph« und »geometrischer<br />
Graph« gleichsetzen und schlicht von einem Graphen sprechen. ⊳<br />
Für uns spielen fast ausschließlich geometrische Realisierungen in der<br />
Ebene E 2 (oder in anderen „flächigen“ Räumen, z. B. auf der Oberfläche<br />
einer Kugel) eine Rolle. Besonders interessant sind hierbei solche<br />
Realisierungen, bei denen sich keine Pfeile kreuzen.
2.3 Komplexität von Algorithmen 15<br />
Definition 2.29 (Planarer Graph) Ein geometrischer Graph, dessen<br />
Pfeile sich ausschließlich in den Endpunkten berühren, heißt<br />
kreuzungsfrei. kreuzungsfrei<br />
Ein Graph, der sich in der Ebene E 2 kreuzungsfrei realisieren läßt, heißt<br />
planar. planar<br />
Beispiel 2.30 In Abbildung 2.4 sehen wir links zwei verschiedende geometrische<br />
Realisierungen desselben planaren Graphen: eine kreuzungsfreie<br />
und eine, bei der der Pfeil r6 den Pfeil r5 schneidet. (Genauer: Das<br />
Bild des Pfeiles r6 schneidet das Bild des Pfeiles r5.)<br />
Der in der Abbildung rechts dargestellte Graph besitzt dagegen keine<br />
geometrische Realisierung in der Ebene (wohl aber auf der Oberfläche<br />
eines Torus) und ist somit nicht planar. ⊳<br />
r1<br />
v2<br />
v1<br />
r6<br />
r5<br />
r2<br />
r4<br />
r3<br />
v3<br />
v4<br />
r1<br />
v2<br />
v1<br />
2.3 Komplexität von Algorithmen<br />
Referenzwerke: [21, 10, 4]<br />
r5<br />
r2<br />
r4<br />
Die Effizienz eines Algorithmus ermittelt man üblicherweise anhand<br />
seines Verbrauchs an Rechenzeit und Speicherplatz. Außer bei ganz einfachen<br />
Problemen hängt dieser Bedarf in irgendeiner Weise von der Problemgröße<br />
ab, z. B. von der Anzahl n der einzuzäunenden Apfelbäume<br />
in unserem Einführungsbeispiel in Abschnitt 1.2 auf Seite 2).<br />
Beim Vergleich zweier Algorithmen interessiert uns hierbei nicht der<br />
exakte Zeit- und Platzbedarf einer Implementation für eine konkrete<br />
Eingabe. Stattdessen wollen wir für einen Algorithmus seine Laufzeit<br />
und seinen Speicherplatzbedarf als Funktion der Eingabegröße darstellen<br />
und diese – größenordnungsmäßig – mit den Zeit- und Speicheranforderungen<br />
anderer Algorithmen vergleichen.<br />
2.3.1 Größenordnung von Funktionen<br />
Sei M die Menge aller reellwertigen Funktionen f: N → R auf den natürlichen<br />
Zahlen.<br />
r3<br />
v3<br />
v4<br />
r6<br />
Abbildung 2.4<br />
Zwei geometrische<br />
Realisierungen eines<br />
planaren Graphen sowie<br />
ein nicht-planarer Graph<br />
Rechenzeit und<br />
Speicherplatz
16 Grundbegriffe<br />
O-Notation<br />
Ω-Notation<br />
Θ-Notation<br />
o-Notation<br />
anonyme Funktion<br />
insertion sort<br />
Definition 2.31 Für eine Funktion g ∈ M definieren wir die folgenden<br />
Klassen von Funktionen:<br />
• O(g) := { f ∈ M � � ∃c∈R≥0 ∃n0∈N ∀n≥n0 |f(n)| ≤ c · |g(n)| },<br />
alle Funktionen höchstens von der Größenordnung von g<br />
• Ω(g) := { f ∈ M � � ∃c∈R≥0 ∃n0∈N ∀n≥n0 |f(n)| ≥ c · |g(n)| },<br />
alle Funktionen mindestens von der Größenordnung von g<br />
• Θ(g) := O(g) ∩ Ω(g),<br />
alle Funktionen genau von der Größenordnung von g<br />
• o(g) := { f ∈ M � � ∀c∈R>0 ∃n0∈N ∀n≥n0 |f(n)| < c · |g(n)| },<br />
alle Funktionen von geringerer Größenordnung als g<br />
Am häufigsten wird uns die O-Notation zur Angabe von oberen Schranken<br />
und die Ω-Notation zur Angabe von unteren Schranken (z. B. für die<br />
Laufzeit eines Algorithmus) begegnen.<br />
Bemerkung 2.32 Die oben definierten Klassen sind Mengen von Funktionen.<br />
Deshalb sollte man korrekterweise für eine Funktion f(n) von<br />
genau quadratischer Größenordnung auch schreiben f(n) ∈ Θ(n 2 ) und<br />
nicht f(n) = Θ(n 2 ).<br />
Manchmal möchte man aber auch mit dem Klassensymbol rechnen können,<br />
z. B. um eine untere Schranke für die Funktion h(n) zu definieren:<br />
h(n) = g(n) + Ω(f(n)). Das Symbol Ω(f(n)) spielt dann die Rolle ei-<br />
ner anonymen Funktion mindestens von der Größenordnung von f(n),<br />
die wir aber nicht genau spezifieren wollen (oder können). Beim Rechnen<br />
mit solchen anonymen Funktionen, sollte man sich immer an die<br />
zugrundeliegende Definition erinnern! ⊳<br />
Beispiel 2.33 Der Ausdruck �n i=1 O(i) beschreibt eine obere Laufzeitschranke<br />
für das naive Sortieren von n Zahlen durch Einfügen (engl. insertion<br />
sort). Hier ist es nicht zulässig, die anonyme Funktion O(i) in der<br />
Summe in n verschiedene anonyme Funktionen aufzuteilen. Dies würde<br />
zum falschen Ergebnis �n i=1 O(i) = O(1) + O(2) + · · · + O(n) = O(n)<br />
führen.<br />
Denn in �n i=1 O(i) gibt es nur eine einzige anonyme Funktion, die von i<br />
(und nicht von n) abhängt, nämlich i ↦→ i. Richtig ist deshalb<br />
n�<br />
n�<br />
O(i) = { f ∈ M � � ∃c∈R≥0 ∃i0∈N ∀i≥i0 |f(i)| ≤ c · |i| }<br />
i=1<br />
i=1<br />
= { f ∈ M � � ∃c∈R≥0 ∃n0∈N<br />
n�<br />
∀n≥n0 |f(n)| ≤ c · |i| }<br />
i=1<br />
= { f ∈ M � � ∃c∈R≥0 ∃n0∈N<br />
� �<br />
�<br />
∀n≥n0 |f(n)| ≤ c · �<br />
n(n + 1) �<br />
�<br />
� 2 � }<br />
= O(n 2 ) .<br />
Die Summation muß also in den O-Ausdruck „hineingezogen“ werden!<br />
⊳
2.3 Komplexität von Algorithmen 17<br />
2.3.2 Berechnungsmodell<br />
Bei Laufzeitanalysen verwenden wir das Maschinenmodell der Unit-<br />
Cost Real RAM (Random Access Machine), siehe [22,21]. Diese Maschine Unit-Cost Real RAM<br />
verfügt über abzählbar unendlich viele Speicherzellen, die jeweils eine<br />
beliebige reelle Zahl aufnehmen können. Folgende Operationen können<br />
jeweils in einem Maschinentakt ausgeführt werden:<br />
Ein- oder Ausgabe eines Registers, Vergleich zweier Register E/A, �, (+, −, ·, /),<br />
und bedingte Verzweigung sowie die arithmetischen Operationen<br />
Addition, Subtraktion, Multiplikation und Division.<br />
if . . . then . . .<br />
Die Speicherzellen können dabei jeweils direkt oder indirekt adressiert<br />
werden.<br />
Für bestimmte Fälle wird manchmal die Menge der erlaubten arithmetischen<br />
Grundoperationen noch erweitert, so daß auch analytische Funktionen<br />
(also z. B. das Ziehen der k-ten Wurzel, trigonometrische Funktionen<br />
usw.) in einem Takt berechnet werden können. Hierauf wird dann<br />
aber gesondert hingwiesen.<br />
Obwohl die Arbeitsweise der Unit-Cost Real RAM derjenigen realer<br />
Rechner sehr ähnlich ist, muß man beachten, daß sie in einem Takt Zah- reale Rechner<br />
len beliebiger Größe verarbeiten kann. Auf diese Weise können ausgedehnte<br />
Berechnungen durch eine geeignete Codierung in einem einzigen<br />
Takt „versteckt“ werden. Damit ist dieses Modell echt mächtiger als<br />
das der Turing-Maschine.<br />
Um dieses Problem auszuschließen, kann man fordern, daß alle auftretenden<br />
Zahlen eine nach oben beschränkte Codierungslänge besitzen,<br />
d. h. rational sind in der Form p<br />
q mit p, q ∈ Q und |p| , |q| ≤ C für eine<br />
Konstante C. Dann kann die Real RAM mit polynomiellem Mehraufwand<br />
auch auf einem realen Rechner simuliert werden. Der Einfachheit<br />
halber bleiben wir aber beim Modell der Unit-Cost Real RAM.<br />
2.3.3 Komplexitätsklassen<br />
Sei Π ein Problem, welches ein Algorithmus1 A lösen kann (z. B. das<br />
Sortieren einer Menge von Zahlen). Um die Komplexität des Algorith-<br />
mus A zu beschreiben, sei die Funktion TA : Π → N definiert als die Zahl<br />
der Taktzyklen, die zur Lösung einer konkreten Probleminstanz P ∈ Π<br />
(z. B. das Sortieren der Zahlen {8.1, 24, −3.4, 56}) benötigt werden. Die<br />
Funktion SA : Π → N sei hierbei die maximale Anzahl belegter Speicherzellen<br />
während der Ausführung des Algorithmus. Die Größe der<br />
Probleminstanz (d. h. die Anzahl der zu sortierenden Zahlen in obigem<br />
Beispiel) bezeichnen wir mit |P|.<br />
1 Ein solcher Algorithmus kann auch nichtdeterministisch sein, d. h. er kann seine Berechnung<br />
in mehrere parallele Wege aufspalten, von denen nur einer das gewünschte Resultat<br />
liefern muß. Bei einem deterministischen Algorithmus gibt es solche Verzweigungen nicht.<br />
beschränkte<br />
Codierungslänge<br />
Instanz<br />
Problem Π<br />
Lösung<br />
Algorithmus<br />
A
18 Grundbegriffe<br />
Worst-case-Laufzeit<br />
Worst-case-Speicherbedarf<br />
Average-case-Analyse<br />
randomisierter<br />
Algorithmus<br />
Definition 2.34 (Worst-case-Laufzeit und -Speicherbedarf)<br />
Sei A ein Algorithmus für ein Problem Π, dann bezeichnen<br />
die Worst-case-Laufzeit und<br />
tA(n) := max<br />
P∈Π,|P|=n TA(P)<br />
sA(n) := max<br />
P∈Π,|P|=n SA(P)<br />
den Worst-case-Speicherbedarf des Algorithmus A.<br />
Bemerkung 2.35 Wir betrachten hier ausschließlich den Worst case, der<br />
sich für die schlimmstmögliche Probleminstanz der Größe n ergibt und<br />
unter Umständen nur in ganz wenigen Fällen auftritt. Hat man für die<br />
auftretenden Probleminstanzen eine Wahrscheinlichkeitsverteilung zur<br />
Hand, kann in obiger Definition anstelle des Maximums auch der Erwartungswert<br />
der Laufzeit bzw. des Speicherbedarfs verwendet werden<br />
und man erhält eine Average-case-Analyse.<br />
Schließlich kann auch der Algorithmus selbst Zufallsentscheidungen<br />
treffen, die seine weitere Ausführung bestimmen (z. B. die Reihenfolge,<br />
in der die Zahlen beim Sortieren abgearbeitet werden). Für einen sol-<br />
chen randomisierten Algorithmus gibt es nicht nur eine Möglichkeit die<br />
korrekte Lösung des Problems zu berechnen (wie beim deterministischen<br />
Algorithmus), sondern mehrere. Die Zahlen TA(P) und SA(P) ergeben<br />
sich dann als Erwartungswert der entsprechenden Zahlen über alle<br />
verschiedenen Möglichkeiten des Algorithmus ans Ziel zu gelangen.<br />
Hierbei ist wichtig, daß diese Zahlen nicht von der Wahrscheinlichkeitsverteilung<br />
der zu bearbeitenden Probleminstanzen abhängen. ⊳<br />
Probleme mit vergleichbarer Komplexität können zu Komplexitätsklassen<br />
zusammengefaßt werden. Einige wichtige Klassen (für Entscheidungsprobleme<br />
2 ) sind<br />
• P := { Π � � Π kann von einem deterministischen Algorithmus A<br />
gelöst werden mit tA(n) ∈ O(n k ) für ein k ∈ N },<br />
• NP := { Π � � Π kann von einem nichtdeterministischen Algorithmus<br />
A gelöst werden mit tA(n) ∈ O(n k ) für ein k ∈ N } und<br />
• PSPACE := { Π � � Π kann von einem deterministischen Algorithmus<br />
A gelöst werden mit sA(n) ∈ O(n k ) für ein k ∈ N }.<br />
Zwischen diesen Klassen gelten die Inklusionsbeziehungen<br />
P ⊆ NP ⊆ PSPACE<br />
und die Frage, ob diese Inklusionen echt sind (d. h., ob P = NP oder<br />
P �= NP gilt), ist ein zentrales Problem der Theoretischen Informatik<br />
und noch immer unbeantwortet, obwohl vieles auf P �= NP hindeutet.<br />
Man vergleiche hierzu auch [21, 10].<br />
2 Bei einem Entscheidungsproblem muß der Algorithmus nur eine Ja/Nein-Antwort<br />
zurückliefern.
2.3 Komplexität von Algorithmen 19<br />
Definition 2.36 (Reduktion) Seien Π1 und Π2 zwei Probleme. Wir sagen,<br />
Problem Π1 ist auf Problem Π2 τ(n)-reduzierbar (i. Z. Π1 �τ(n) Π2)<br />
für eine Funktion τ: N → R, wenn es Algorithmen A1→2 und A2→1<br />
gibt mit tA1→2 (n), tA2→1 (n) ∈ O(τ(n)), so daß für alle Probleminstanzen<br />
P1 ∈ Π1 folgendes gilt:<br />
1. Algorithmus A1→2 transformiert die Probleminstanz P1 ∈ Π1 in<br />
eine Instanz P2 des Problems Π2.<br />
2. Algorithmus A2→1 transformiert die Lösung für die Probleminstanz<br />
P2 ∈ Π2 zurück in eine korrekte Lösung der ursprünglichen<br />
Instanz P1.<br />
Die Idee einer solchen Reduktion besteht darin, ein Problem auf ein anderes<br />
Problem zu reduzieren, um damit untere oder obere Schranken für<br />
die Laufzeit eines der beiden Probleme zu erhalten:<br />
Untere Schranken Falls wir wissen, daß jeder Algorithmus für ein Problem<br />
Π1 mindestens einen Zeitbedarf von Ω(t1(n)) besitzt und Π1<br />
auf das Problem Π2 τ(n)-reduziert werden kann, dann hat jeder<br />
Algorithmus zur Lösung von Π2 mindestens einen Zeitbedarf<br />
von Ω(t1(n) − τ(n)). Hierbei wird natürlich vorausgesetzt, daß<br />
τ(n) ∈ O(t1(n)). Sonst wäre die Reduktion nämlich völlig nutzlos,<br />
da der Zeitbedarf zum Transformieren des Problems Π1 größer<br />
wäre als der zu seiner Lösung.<br />
Π1<br />
Π1<br />
A1→2<br />
τ(n)-Reduktion<br />
A2→1<br />
untere Schranke<br />
τ(n)-Reduktion<br />
obere Schranke<br />
Durch die Reduktion von Π1 auf Π2 haben wir also aus einer unteren<br />
Schranke für Π1 eine untere Schranke für Π2 erhalten. untere Laufzeitschranke<br />
Obere Schranke Falls wir ein Problem Π2 mit einem Zeitbedarf<br />
von O(t2(n)) lösen können und ein Problem Π1 auf Π2<br />
τ(n)-reduziert werden kann, dann kann das Problem Π1 mit<br />
einem Zeitbedarf von O(t2(n) + τ(n)) gelöst werden.<br />
Durch die Reduktion von Π1 auf Π2 haben wir also aus einer oberen<br />
Schranke für Π2 eine obere Schranke für Π1 erhalten. obere Laufzeitschranke<br />
Beispiel 2.37 Das Problem des dichtesten Paares (engl. closest pair) closest pair<br />
im E 1 besteht darin, für n reelle Zahlen x1, . . . , xn zwei Zahlen xi und xj<br />
mit minimalem Abstand |xi − xj| (unter allen Zahlenpaaren) zu bestimmen.<br />
Da wir hierzu nur solche Paare betrachten müssen, die der Größe<br />
nach benachbart sind, können wir dieses Problem in linearer Zeit auf<br />
das Sortierproblem reduzieren: Sortierproblem<br />
1. Algorithmus A1→2 bleibt leer, da wir die n Zahlen direkt als Eingabe<br />
für das Sortierproblem benutzen können.<br />
2. Das Sortieren der n Zahlen hat einen Zeitbedarf von O(n log n),<br />
indem wir beispielsweise Heapsort verwenden.<br />
3. Algorithmus A2→1 durchläuft die sortierte Folge x ′ 1 ≤ . . . x ′ n in<br />
einem Sweep vom kleinsten zum größten Element und bestimmt in Sweep<br />
linearer Zeit das Paar (x ′ i , x ′ i+1 ) aufeinanderfolgender Zahlen mit<br />
kleinstem Abstand.<br />
Π2<br />
Π2
20 Grundbegriffe<br />
Entscheidungsbaum<br />
algebraisches<br />
Entscheidungsbaummodell<br />
Somit haben wir auch für das Closest-pair-Problem eine obere Laufzeitschranke<br />
von O(n log n) + O(n) = O(n log n) gewonnen. ⊳<br />
2.3.4 Das Entscheidungsbaummodell<br />
Die Ausführung eines (deterministischen) Algorithmus A auf unserem<br />
Maschinenmodell der Unit-Cost Real RAM können wir uns vorstellen<br />
als das Durchlaufen eines Baums von höchstens dem Grad 2, ausgehend<br />
von der Wurzel bis zu einem Blatt. Die inneren Knoten entsprechen<br />
dabei den durchzuführenden Aktionen:<br />
• In Knoten der Ordnung 1 werden Ein-/Ausgabe- sowie arithmetische<br />
Operationen durchgeführt.<br />
• An einem Knoten der Ordnung 2 erfolgt eine bedingte Verzweigung<br />
zu einem seiner beiden Söhne.<br />
Jeder Eingabe P entspricht also einem Weg von der Wurzel des Baums<br />
zu einem seiner Blätter, wobei die Länge des Weges der Zahl der benötigten<br />
Taktzyklen TA(P) entspricht. Einen solchen Baum nennen wir<br />
einen Entscheidungsbaum.<br />
Bemerkung 2.38 Man kann den Entscheidungsbaum auch als reinen<br />
Binärbaum, der ausschließlich aus Entscheidungsknoten besteht, definieren.<br />
Die übrigen (Rechen-) Operationen werden denn vernachlässigt.<br />
Ebenso kann man auch mächtigere Entscheidungsbaumkonzepte<br />
betrachten, bei denen in den Entscheidungsknoten nicht nur<br />
zwei Zahlen miteinander verglichen werden können, sondern beispielsweise<br />
das Vorzeichen linearer oder algebraischer Ausdrücke ermittelt<br />
werden kann. Dies führt dann zum linearen bzw. algebraischen<br />
Entscheidungsbaummodell. Allerdings würde diesen Modellen auch ein<br />
mächtigeres Maschinenmodell als das unsrige entsprechen. ⊳<br />
Mit dem Konzept des Entscheidungsbaums können wir nun eine untere<br />
Schranke für das Sortierproblem bestimmen:<br />
Satz 2.39 Das Sortieren von n Zahlen durch Vergleichen hat im Entscheidungsbaummodell<br />
die Komplexität Ω(n log n).<br />
Beweis: Sei A ein Algorithmus, der das Sortierproblem löst. Für jede der<br />
n! Permutationen der n Zahlen muß mindestens ein Blatt im Entscheidungsbaum<br />
zu A vorhanden sein. Denn sonst gäbe es zwei verschiedene<br />
Permutationen, die von dem Sortieralgorithmus nicht unterschieden<br />
werden könnten, und der Algorithmus A wäre nicht korrekt. Somit können<br />
wir die Höhe des Entscheidungsbaums folgendermaßen ganz grob
2.3 Komplexität von Algorithmen 21<br />
nach unten abschätzen: 3<br />
Höhe ≥ log2 (n!)<br />
�<br />
n<br />
� n<br />
2<br />
≥ log2 2<br />
≥ n<br />
2 log �<br />
n<br />
�<br />
2 2<br />
∈ Ω(n log n)<br />
Somit gibt es mindestens eine Permutation, für die der Algorithmus A<br />
mindestens Ω(n log n) Vergleiche ausführen muß. ✷<br />
3 Die Knoten der Ordnung 1 brauchen wir hier gar nicht zu betrachten, denn sie ver-<br />
größern die Höhe ja nur.
Grundlegende <strong>Geometrie</strong><br />
in der Ebene<br />
3.1 Elementare geometrische Objekte<br />
Wir definieren zunächst einige wichtige geometrische Grundobjekte<br />
im R d . 1<br />
Definition 3.1 Seien p und q zwei verschiedene Punkte im R d .<br />
• Das Liniensegment oder die Strecke zwischen den beiden Punk-<br />
ten ist die Menge<br />
[p q] := { p + λ(q − p) � � λ ∈ R mit 0 ≤ λ ≤ 1 } . (3.1)<br />
• Der Halbstrahl (oder kurz Strahl) von p aus in Richtung q ist de-<br />
finiert durch<br />
[p q} := { p + λ(q − p) � � λ ∈ R mit λ ≥ 0 } . (3.2)<br />
Analog ist der Strahl {p q] definiert, obwohl man dafür auch [q p}<br />
schreiben kann.<br />
• Die Gerade durch die beiden Punkte ist die Menge<br />
p q := { p + λ(q − p) � � λ ∈ R } . (3.3)<br />
Bemerkung 3.2 Neben der parametrisierten Zwei-Punkte-Darstellung in<br />
obiger Definition läßt sich insbesondere die Gerade noch auf viele andere<br />
Arten beschreiben. Eine wichtige Darstellung einer Geraden g im R 2<br />
ist die Normalenform,<br />
g(n, a) := { x ∈ R 2 � � n T x − a = 0 }<br />
= { x ∈ R 2 � � 〈n, x〉 = a } .<br />
(3.4)<br />
1 Obwohl wir in diesem Kapitel und im Rahmen fast der gesamten Vorlesung nur zweidimensionale<br />
Objekte benötigen, werden wir – wo dies ohne Mehraufwand möglich ist –<br />
die Definitionen so allgemein wie möglich halten.<br />
q<br />
[p q]<br />
p<br />
Liniensegment<br />
[p q}<br />
p<br />
Halbstrahl<br />
p q<br />
p<br />
Gerade<br />
3<br />
q<br />
q
24 Grundlegende <strong>Geometrie</strong> in der Ebene<br />
Normalenvektor<br />
n<br />
g(n, a)<br />
a<br />
0<br />
Hesseform einer Geraden<br />
Abstand eines Punktes von<br />
einer Geraden<br />
H +<br />
H −<br />
positive und negative<br />
Halbebene<br />
Hierbei ist n ∈ R2 \ (0, 0) ein Normalenvektor der Geraden (d. h. n steht<br />
senkrecht auf g) und a eine reelle Zahl.<br />
Hat der Vektor n außerdem die Länge 1 und ist a ∈ R≥0 (d. h. der Vektor<br />
n muß „vom Ursprung weg zeigen“), dann spricht man von der Hes-<br />
seform der Geraden g. Die Zahl a gibt in diesem Fall den (euklidischen)<br />
Abstand der Geraden zum Ursprung an. Eine einfache Merkregel für<br />
die Richtung des Normalenvektors bei der Hesseform: Für jeden Vektor<br />
x auf der Geraden muß das Skalarprodukt 〈n, x〉 = n T x positiv sein.<br />
Mit Hilfe der Hesseform läßt sich sehr einfach der Abstand eines Punktes<br />
p von einer Geraden g(n, a) bestimmen. Es gilt nämlich<br />
dist(p, g) = � � n T p − a � � , (3.5)<br />
wobei das Vorzeichen des Ausdrucks n T p − a darüber entscheidet, auf<br />
welcher Seite der Geraden der Punkt p liegt:<br />
positives Vorzeichen p liegt auf der Seite von g(n, a), in die auch der<br />
Normalenvektor n zeigt; somit liegen p und der Koordinatenursprung<br />
auf verschiedenen Seiten von g(n, a).<br />
negatives Vorzeichen p liegt auf der dem Normalenvektor abgewandten<br />
Seite von g; somit liegen p und der Koordinatenursprung auf<br />
derselben Seite von g(n, a).<br />
Ganz analog definiert man im R 3 die Normalenform einer Ebene<br />
bzw. allgemein im R d die Normalenform einer (d − 1)-dimensionalen<br />
Hyperebene (d. h. eines (d − 1)-dimensionalen affinen Unterraums<br />
des R d ). ⊳<br />
Definition 3.3 (Halbebene/Halbraum) Sei g(n, a) die Normalenform<br />
einer Geraden im R 2 . Dann nennt man<br />
• H + (n, a) := { x ∈ R 2 � � n T x − a ≥ 0 } = { x ∈ R 2 � � 〈n, x〉 ≥ a }<br />
die (abgeschlossene) positive Halbebene (engl. positive halfplane)<br />
zu g(n, a),<br />
• H − (n, a) := { x ∈ R 2 � � n T x − a ≤ 0 } = { x ∈ R 2 � � 〈n, x〉 ≤ a }<br />
die (abgeschlossene) negative Halbebene (engl. negative halfplane)<br />
zu g(n, a).<br />
Die offenen Halbebenen H + (n, a) ◦ und H − (n, a) ◦ erhält man, indem<br />
man in obiger Definition anstelle von »≥« (bzw. »≤«) jeweils »>«<br />
(bzw. »
3.2 Elementare Lokationsprobleme 25<br />
3.2 Elementare Lokationsprobleme<br />
3.2.1 Point-in-half-plane-Test<br />
Gegeben eine (abgeschlossene positive) Halbebene H + (n, a) = { x ∈<br />
R d � � n T x − a ≥ 0 } und ein Punkt p ∈ R d . Dann kann der Test<br />
„p ∈ H + (n, a)?“ mit einem Zeitbedarf von O(d) beantwortet werden.<br />
Denn aus der Definition von H + (n, a) folgt sofort „p ∈ H + (n, a) ⇐⇒<br />
n T p − a ≥ 0“ und die Berechnung dieses Ausdrucks erfordert O(d)<br />
Additionen und Multiplikationen. Da die Komplexität der Eingabe<br />
»(n, a, p)« schon aus Ω(d) ist, ist diese Schranke scharf und der Zeitbedarf<br />
ist aus Θ(d).<br />
Ist die Dimension d fest, dann kann der Point-in-half-plane-Test also in<br />
konstanter Zeit entschieden werden.<br />
3.2.2 Lage eines Punktes bezüglich eines Strahls<br />
Gegeben ein Strahl [p q} ⊂ R 2 (bzw. eine orientierte Strecke [p q] oder<br />
eine orientierte Gerade p q) und ein Punkt r ∈ R 2 , dann interessiert uns,<br />
ob r links oder rechts vom Strahl [p q} liegt (oder auf der vom Strahl induzierten<br />
Geraden).<br />
Ein naheliegender Ansatz ist, dieses Problem auf einen Point-in-halfplane-Test<br />
zurückzuführen. Hierzu muß aber zunächst eine Normalenform<br />
g(n, a) der durch den Strahl induzierten Geraden bestimmt werden,<br />
und zwar so, daß der Normalenvektor n z. B. immer in die linke<br />
Halbebene zeigt. Denn andernfalls wäre nicht sofort klar, ob auf eine<br />
positive oder auf eine negative Halbebene hin getestet werden muß und<br />
es wären Fallunterscheidungen nötig, um dies zu unterscheiden.<br />
� � � �<br />
p1<br />
q1<br />
Sei nun p = und q =<br />
gegen den<br />
p2<br />
q2<br />
, dann ist z. B. der um π<br />
2<br />
Uhrzeigersinn gedrehte Richtungsvektor des Strahls [p q},<br />
� �<br />
p2 − q2<br />
n =<br />
,<br />
q1 − p1<br />
ein Normalenvektor zu p q, der immer in die linke Halbebene zeigt.<br />
Durch Auflösen der Normalenform nach a und Einsetzen eines Punktes,<br />
der auf dem Strahl liegt (z. B. p), erhält man dann den passenden<br />
Wert für a,<br />
a = n T p<br />
= (p2 − q2)p1 + (q1 − p1)p2<br />
= p2q1 − p1q2 .<br />
Nun kann man den im letzten Abschnitt beschriebenen Point-in-halfplane-Test<br />
auf den Punkt r und die (offene) Halbebene H + (n, a) ◦ an-<br />
konstanter Zeitbedarf bei<br />
fester Dimension<br />
p<br />
links<br />
rechts<br />
q<br />
Reduktion auf<br />
Point-in-half-plane-Test
26 Grundlegende <strong>Geometrie</strong> in der Ebene<br />
p<br />
a × b<br />
b<br />
r1<br />
a<br />
r2<br />
q<br />
Vektorprodukt<br />
wenden und erhält die Äquivalenz:<br />
mit<br />
„r liegt (echt) links von [p q}“<br />
⇐⇒<br />
r ∈ H + (n, a) ◦<br />
⇐⇒<br />
n T r − a > 0<br />
n T r − a = (p2 − q2)r1 + (q1 − p1)r2 − p2q1 + p1q2<br />
= p2r1 − q2r1 + q1r2 − p1r2 − p2q1 + p1q2 .<br />
Bemerkung 3.4 Obige Formel zum Testen der Lage eines Punktes läßt<br />
sich auch noch auf andere Weise herleiten, nämlich unter Verwendung<br />
des Vektorprodukts:<br />
Denn offensichtlich gilt folgender Zusammenhang:<br />
„r liegt (echt) links von [p q}“<br />
⇐⇒<br />
„Die drei Punkte (p, q, r) sind im Gegenuhrzeigersinn orientiert“<br />
Dies läßt sich mittels des Vektorprodukts auf einfache Weise testen. Für<br />
zwei Vektoren a, b ∈ R3 ergibt nämlich das Vektorprodukt<br />
⎛<br />
a × b := ⎝<br />
a2b3 − a3b2<br />
a3b1 − a1b3<br />
a1b2 − a2b1<br />
⎞<br />
(∗)<br />
⎠ (3.6)<br />
einen zu a und b senkrecht stehenden Vektor, dessen Länge dem Flächeninhalt<br />
des von a und b aufgespannten Parallelogramms entspricht<br />
und der so orientiert ist, daß (a, b, a × b) ein Rechtssystem 2 bilden.<br />
Für zwei Vektoren a, b ∈ R 2 ergibt sich dann für das Vektorprodukt der<br />
in die x1-x2-Ebene eingebetteten Vektoren<br />
⎛<br />
⎝ a1<br />
a2<br />
⎞<br />
⎛<br />
b1<br />
⎞<br />
⎛<br />
⎠ × ⎝b2⎠<br />
= ⎝<br />
0 0<br />
0<br />
0<br />
a1b2 − a2b1<br />
und für die dritte Komponente des Vektorprodukts gilt die Äquivalenz:<br />
„Die drei Punkte (0, a, b) sind im Gegenuhrzeigersinn orientiert“<br />
⇐⇒<br />
a1b2 − a2b1 > 0<br />
2 Drei Vektoren bilden ein Rechtssystem, wenn sie die gleiche Orientierung zueinander<br />
besitzen wie Daumen, Zeigefinger und Mittelfinger der rechten Hand.<br />
⎞<br />
⎠
3.2 Elementare Lokationsprobleme 27<br />
Setzt man jetzt a = q − p und b = r − p, dann erhält man für diese dritte<br />
Komponente des Vektorprodukts<br />
a1b2 − a2b1 = (q1 − p1)(r2 − p2) − (q2 − p2)(r1 − p1)<br />
= q1r2 − p2q1 − p1r2 + p1p2<br />
− q2r1 + p1q2 + p2r1 − p1p2<br />
= (p1q2 − p2q1) + (q1r2 − q2r1) + (p2r1 − p1r2)<br />
(∗∗)<br />
und kann damit die Orientierung der drei Punkte p, q und r bestimmen.<br />
⊳<br />
Die beiden identischen Ausdrücke (∗) und (∗∗) lassen sich auch als<br />
Determinante einer 3×3-Matrix schreiben. Wir definieren deshalb die<br />
Funktion ccw: R2 × R2 × R2 → R (von engl. counter clockwise)<br />
� �<br />
�p1<br />
p2 � 1�<br />
�<br />
ccw(p, q, r) := �q1<br />
q2 � 1�<br />
� . (3.7)<br />
� �<br />
Somit gilt<br />
ccw(p, q, r)<br />
⎧<br />
⎪⎨<br />
⎪⎩<br />
r1 r2 1<br />
< 0 falls r (echt) rechts von [p q} liegt,<br />
= 0 falls r auf p q liegt,<br />
> 0 falls r (echt) links von [p q} liegt.<br />
Der Zeitbedarf für diesen Test ist wiederum aus Θ(1).<br />
(3.8)<br />
Bemerkung 3.5 Aufgrund der Eigenschaft des Vektorprodukts hat<br />
das Dreieck mit den Eckpunkten a, b und c gerade den Flächenin-<br />
|ccw(a, b, c)|. ⊳<br />
halt 1<br />
2<br />
3.2.3 Schnitt zweier Strecken<br />
Gegeben zwei Strecken p := [p1 p2] und q := [q1 q2] im R2 , dann möch- p2<br />
ten wir wissen, ob die beiden Strecken sich schneiden (und gegebenenfalls<br />
die Schnittmenge p ∩ q bestimmen).<br />
Offensichtlich ist „p und q schneiden sich“ äquivalent zu<br />
1. Die Strecken p und q sind kollinear und überlappen sich, oder<br />
2. die Strecken p und q sind nicht kollinear und es gilt<br />
die Endpunkte von q liegen auf verschiedenen<br />
Seiten von p<br />
und<br />
die Endpunkte von p liegen auf verschiedenen<br />
Seiten von q.<br />
(3.9)<br />
Flächeninhalt eines<br />
Dreiecks<br />
q1<br />
p1<br />
q2
28 Grundlegende <strong>Geometrie</strong> in der Ebene<br />
Abbildung 3.1<br />
Sonderfälle beim Schnitt<br />
zweier Strecken<br />
Fall „p und q sind<br />
kollinear“<br />
Die verschiedenen Fälle können jeweils durch Verwendung der ccw-<br />
Funktion getestet werden:<br />
1. „p und q sind kollinear“ ⇐⇒<br />
ccw(p1, p2, q1) = ccw(p1, p2, q2) = 0<br />
(bzw. ccw(q1, q2, p1) = ccw(q1, q2, p2) = 0, aber es muß nur eine<br />
der beiden Aussagen überprüft werden)<br />
Der Test auf Überlappung (bzw. Inklusion, siehe Abbildung 3.1<br />
links) soll hier nicht weiter ausgeführt werden, ist jedoch nicht<br />
schwierig, z. B. indem man für die Punkte q1 und q2 die entsprechenden<br />
λ-Werte in<br />
q1 = p1 + λ1(p2 − p1) q2 = p1 + λ2(p2 − p1)<br />
ausrechnet und das sich so ergebende [λ1, λ2]- bzw.<br />
[λ2, λ1]-Intervall mit dem Intervall [0, 1] schneidet.<br />
Fall „p und q sind nicht 2. Falls p und q nicht kollinear sind, ist Eigenschaft (3.9) auf der<br />
kollinear“ vorhergehenden Seite äquivalent zu<br />
konstanter Zeitbedarf für<br />
Streckenschnitt<br />
ccw(p1, p2, q1) · ccw(p1, p2, q2) ≤ 0<br />
∧<br />
ccw(q1, q2, p1) · ccw(q1, q2, p2) ≤ 0 .<br />
(3.10)<br />
Hierbei werden auch gleich die Sonderfälle berücksichtigt (durch<br />
Verwendung von »≤« anstelle von »
3.2 Elementare Lokationsprobleme 29<br />
welche Punkte gleichen Winkels zu Äquivalenzklassen („Richtungen“)<br />
[a]R := { b ∈ R 2 \ (0, 0) � � a ∼R b }<br />
zusammenfaßt und bezeichnen mit<br />
�<br />
W := { [a]R � a ∈ R 2 \ (0, 0) }<br />
die Menge aller Äquivalenzklassen (bez. der Relation R).<br />
Nun wählen wir eine beliebige Richtung [z] ∈ W als „minimales Element“<br />
und definieren die Relation »� [z]« wie folgt:<br />
[a] � [z] [b]<br />
def<br />
⇐⇒<br />
ccw(a, z) ≤ 0 ∧ ccw(b, z) > 0 ∨<br />
ccw(a, z) · ccw(b, z) > 0 ∧ ccw(a, b) ≥ 0 ∨<br />
ccw(a, z) ≤ 0 ∧ ccw(b, z) = 0 ∧ 〈b, z〉 ≤ 0 ∨<br />
ccw(a, z) = 0 ∧ ccw(b, z) ≤ 0 ∧ 〈a, z〉 ≥ 0 .<br />
(3.12)<br />
0<br />
Die Menge W der<br />
Äquivalenzklassen<br />
Diese etwas längliche Definition ist notwendig, um auch alle Sonderfälle<br />
(z. B. »a, b, z sind kollinear«) zu berücksichtigen: Vorsicht bei Sonderfällen!<br />
• Die erste Zeile behandelt den Fall, daß a links von z und b (echt)<br />
rechts von z liegt;<br />
• die zweite Zeile ermittelt die Relation von a und b zueinander,<br />
wenn beide Punkte auf derselben Seite von z liegen;<br />
• die letzten beiden Zeilen behandeln die Sonderfälle, wenn (mindestens)<br />
einer der beiden Punkte kollinear zu z liegt.<br />
Die Relation »�« besitzt die folgenden Eigenschaften:<br />
∀ [a] [a] � [a] (Reflexivität)<br />
∀ [a],[b] [a] � [b] ∧ [b] � [a] =⇒ [a] = [b] (Antisymmetrie)<br />
∀ [a],[b] [a] � [b] ∨ [b] � [a] (Linearität)<br />
∀ [a],[b],[c] [a] � [b] ∧ [b] � [c] =⇒ [a] � [c] (Transitivität)<br />
Somit ist »� [z]« eine Ordnungsrelation auf der Menge W der Richtungen,<br />
die angulare Ordnung (bez. des Strahls [0 z}), und wir können »� [z]« angulare Ordnung<br />
verwenden, um z. B. Punkte nach ihrem Winkel zu sortieren.<br />
Bemerkung 3.6 Die Wahl des „minimalen Elements“ [z] hat keinen Wahl des „minimalen<br />
Elements“ [z]<br />
großen Einfluß auf die angulare Ordnung. Denn sei<br />
[p1] � [z1] [p2] � [z1] · · · � [z1] [pn] ,<br />
dann gibt es für jedes andere „minimale Element“ [z2] ein k ∈ {1, . . . , n−<br />
1}, so daß gilt<br />
[p1+k] � [z2] [p2+k] � [z2] · · · � [z2] [pn+k] ,<br />
wobei [pn+1] = [p1], . . . , [p2n−1] = [pn−1] ist (siehe Abbildung 3.2 auf<br />
der nächsten Seite; hier ist k = 8 beim Wechsel von [z1] zu [z2]). ⊳
30 Grundlegende <strong>Geometrie</strong> in der Ebene<br />
Abbildung 3.2<br />
Einfluß des „minimalen<br />
Elements“ auf die angulare<br />
Ordnung<br />
0<br />
pl<br />
q<br />
pr<br />
Linearer Zeitbedarf bei<br />
Single-shot-Anfrage<br />
4<br />
5<br />
3<br />
6<br />
2<br />
1<br />
10<br />
z1<br />
0<br />
9 7<br />
0<br />
7<br />
8<br />
Bemerkung 3.7 Im folgenden benutzen wir der Einfachheit halber beim<br />
Vergleichen von Punkten anstelle der etwas umständlichen Notation<br />
[a] � [z] [b] die intuitivere Schreibweise a �z b, sind uns dabei jedoch<br />
im klaren, daß anstelle der Punkte eigentlich deren Äquivalenzklassen<br />
gemeint sind. ⊳<br />
Bemerkung 3.8 Oft ist es gar nicht notwendig, die Richtung [z] bezüglich<br />
derer die angulare Ordnung bestimmt wird, besonders auszuzeichnen.<br />
Deshalb verwenden wir im folgenden – wenn nicht anders angegeben<br />
– die positive x-Achse als Referenzstrahl für die angulare Ordnung<br />
und schreiben dafür kurz »�«. ⊳<br />
3.2.5 Sektorbestimmung – Single-shot-Anfrage<br />
Gegeben n Punkte p1, . . . , pn ∈ R 2 , die n Sektoren induzieren, sowie<br />
ein weiterer Anfragepunkt q ∈ R 2 . In welchem Sektor befindet sich q?<br />
Bei einer Single-shot-Anfrage wird für die gegebene Datenmenge (hier,<br />
die n Punkte) nur eine einzige Anfrage gestellt, im Gegensatz zu einer<br />
Multiple-shot-Anfrage, bei der für dieselbe Datenmenge mehrere Anfragen<br />
bearbeitet werden müssen (z. B. hier, m Anfragepunkte q1, . . . , qm).<br />
Eine evtl. aufwendige Vorverarbeitung (engl. preprocessing) lohnt sich also<br />
in der Regel nicht.<br />
Zur Lösung des Problems betrachten wir die angulare Ordnung »�q«<br />
der Punkte bez. des Strahl [0 q}. Dann wird offensichtlich der gesuchte<br />
Sektor von denjenigen Punkten pl und pr begrenzt, für die gilt<br />
∀1≤i≤n pl �q pi und ∀1≤i≤n pi �q pr .<br />
Diese beiden Punkte werden von Algorithmus 3.1 auf der folgenden Seite<br />
mit einem Zeitaufwand von O(n) bestimmt.<br />
3.2.6 Sektorbestimmung – Multiple-shot-Anfrage<br />
Gegeben wiederum n Punkte p1, . . . , pn ∈ R 2 wie in Abschnitt 3.2.5.<br />
Dieses Mal ist es uns jedoch erlaubt, einen gewissen Preprocessing-Aufwand<br />
zu investieren, damit eine Folge von Anfragen schneller beantwortet<br />
werden kann als in Abschnitt 3.2.5, d. h. schneller als in Ω(n) pro<br />
Anfrage.<br />
6<br />
5<br />
8<br />
4<br />
9<br />
3<br />
10<br />
2<br />
1<br />
z2
3.2 Elementare Lokationsprobleme 31<br />
Algorithmus 3.1 Sektorbestimmung – Single-shot-Anfrage<br />
SEKTORSS(q)<br />
Input: n Punkte p1, . . . , pn ∈ R 2<br />
Anfragepunkt q<br />
1 r ← 1 {pr ist der rechte Randpunkt des gesuchten Sektors}<br />
2 l ← 1 {pl ist der linke Randpunkt des gesuchten Sektors}<br />
3 for i ← 2, . . . , n do<br />
4 if pi �q pl then<br />
5 l ← i<br />
6 end if<br />
7 if pr �q pi then<br />
8 r ← i<br />
9 end if<br />
10 end for<br />
Output: q befindet sich im Sektor der beiden Punkte pl und pr<br />
Hierzu sortieren wir in der Preprocessing-Phase die Punkte p1, . . . , pn Preprocessing<br />
bez. ihrer angularen Ordnung »�«. Dies erfordert einen einmaligen Preprocessing-Zeitbedarf<br />
von O(n log n).<br />
Für einen Anfragepunkt q können wir dann denjenigen Sektor, der q<br />
enthält, mittels binärer Suche gemäß Algorithmus 3.2 auf der folgenden binäre Suche<br />
Seite bestimmen. Somit erhalten wir folgenden Satz:<br />
Satz 3.9 Für n Punkte p1, . . . , pn ∈ R 2 , die gemäß ihrer angularen<br />
Ordnung sortiert sind (d. h. p1 � · · · � pn), und einen Anfragepunkt<br />
q ∈ R 2 kann der Sektor, in dem sich q befindet, mit einem Zeitbedarf<br />
von O(log n) bestimmt werden.<br />
logarithmischer Zeitbedarf<br />
bei Multiple-shot-Anfrage
32 Grundlegende <strong>Geometrie</strong> in der Ebene<br />
Algorithmus 3.2 Sektorbestimmung – Multiple-shot-Anfrage<br />
SEKTORMS(q)<br />
Input: n Punkte p1 � · · · � pn ∈ R 2<br />
Anfragepunkt q<br />
1 r ← 0 {pr ist der rechte Randpunkt des gesuchten Sektors}<br />
2 l ← n + 1 {pl ist der linke Randpunkt des gesuchten Sektors}<br />
3 while l − r > 1 do<br />
4 m ← ⌊ l+r<br />
2 ⌋<br />
5 if q � pm then<br />
6 l ← m {q ist „rechts“ von pm, also streiche linke Hälfte}<br />
7 else<br />
8 r ← m {q ist „links“ von pm, also streiche rechte Hälfte}<br />
9 end if<br />
10 end while<br />
11 if r = 0 then<br />
12 r ← n<br />
13 end if<br />
14 if l = n + 1 then<br />
15 l ← 1<br />
16 end if<br />
Output: q befindet sich im Sektor der beiden Punkte pl und pr
Polygone<br />
Definition 4.1 (Polygon) Ein Weg w ⊆ E d , der aus einer endlichen Folge<br />
von Liniensegmenten [p1 p2], [p2 p3], . . . , [pn−1 pn] besteht, heißt eine<br />
polygonale Kette. polygonale Kette<br />
Für eine einfache, geschlossene polygonale Kette w ⊆ E 2 in der Ebene,<br />
nennt man das von w umschlossene innere Gebiet zusammen mit w<br />
selbst ein (einfaches) Polygon P. 1<br />
Polygon<br />
Die Liniensegmente s1 = [p1 p2], s2 = [p2 p3], . . . , sn = [pn p1] heißen<br />
Kanten, ihre Endpunkte p1, . . . , pn Ecken des Polygons. Kanten und Ecken<br />
O. B. d. A. gehen wir dabei davon aus, daß das Polygon entgegen dem<br />
Uhrzeigersinn orientiert ist, d. h. das Polygoninnere liegt immer links<br />
der (orientierten) Liniensegmente [p1 p2], . . . , [pn−1 pn].<br />
Abbildung 4.1 auf der nächsten Seite zeigt links zwei polygonale Ketten,<br />
die beide keine Polygone sind, weil sie entweder nicht geschlossen oder<br />
nicht einfach sind.<br />
Bemerkung 4.2 Ein Polygon speichern wir – wenn nicht ausdrücklich<br />
anders angegeben – durch seine Kantenfolge (s1, s2, . . . , sn) oder seine<br />
Eckenfolge (p1, p2, . . . , pn). Im Gegensatz zu einer Speicherung als Kan-<br />
tenmenge hat dies z. B. den Vorteil, daß beim Zugriff auf das Polygon die<br />
einzelnen Kanten nicht erst wieder einander zugeordnet werden müssen.<br />
Eine Speicherung als Eckenmenge ist sowieso indiskutabel, da dann<br />
das Polygon nur in wenigen Fällen eindeutig bestimmt wäre.<br />
Offenbar sind i. allg. Kanten- und Eckenfolgen nicht ohne weiteres dazu<br />
geeignet, um zu entscheiden, ob zwei Polygone identisch sind, denn<br />
1. können die Folgen zyklisch permutiert sein, und<br />
2. kann ein Polygon auch mehrere strukturell verschiedene Kantenund<br />
Eckenfolgen besitzen, nämlich genau dann, wenn diese aufeinanderfolgende<br />
kollineare Ecken enthalten.<br />
1 Manchmal läßt man die Forderung, daß der Rand ∂P (also w) einfach sein muß, auch<br />
fallen oder erlaubt sogar, daß ∂P unzusammenhängend ist, das Polygon also Löcher besitzen<br />
darf. Um solche Fälle explizit auszuschließen, nennt man P oft ein einfaches Polygon.<br />
4<br />
Speicherung als Kantenoder<br />
Eckenfolge<br />
Nichteindeutige Kantenund<br />
Eckenfolgen aufgrund<br />
kollinearer Ecken
34 Polygone<br />
Abbildung 4.1<br />
Zwei polygonale Ketten<br />
(links) und zwei einfache<br />
Polygone (rechts)<br />
< 0<br />
> 0<br />
Knickwinkel<br />
konvex<br />
konvexe Hülle<br />
Solche Fälle müssen also gesondert behandelt werden, z. B. durch Eliminieren<br />
kollinearer Ecken. ⊳<br />
Um beim Aufzählen von Kanten- und Eckenfolgen nicht immer unnötige<br />
Fallunterscheidungen machen zu müssen, numerieren wir in einem<br />
Polygon mit n Ecken und Kanten diese immer „modulo n“, d. h. sn+1 =<br />
s1, sn+2 = s2, . . . und s0 = sn, s−1 = sn−1, . . . sowie analog für die<br />
Ecken.<br />
Definition 4.3 (Knickwinkel) Für zwei aufeinanderfolgende Segmente<br />
si = [pi pi+1] und si+1 = [pi+1 pi+2] einer polygonalen Kette ist de-<br />
ren Knickwinkel α(si, si+1) ∈ (−π, π) definiert als der Drehwinkel, der<br />
nötig ist, um den Strahl [0 (pi+1 − pi)} in den Strahl [0 (pi+2 − pi+1)} zu<br />
überführen. Linksdrehungen werden hierbei positiv und Rechtsdrehungen<br />
negativ gezählt.<br />
Für j > i ist α(si, sj) := � j−1<br />
k=i α(sk, sk+1) die Summe der Knickwinkel<br />
vom i-ten bis zum j-ten Segment.<br />
Für die Summe α(s1, sn+1) aller Knickwinkel in einem Polygon kann<br />
nun folgendes bewiesen werden:<br />
Satz 4.4 Sei P ein beliebiges Polygon mit n Ecken, dann gilt für die Gesamtsumme<br />
aller Knickwinkel<br />
α(s1, sn+1) = 2π . (4.1)<br />
4.1 Spezialfall »Konvexe Polygone«<br />
Definition 4.5 (Konvexität) Eine Menge A ⊆ Rd heißt konvex, wenn<br />
für je zwei verschiedene Punkte a, b ∈ A auch die Strecke [a b] in A liegt<br />
(siehe Abbildung 4.2 auf der folgenden Seite).<br />
Für eine Menge A ⊆ R d heißt<br />
CH(A) := �<br />
K⊇A<br />
K konvex<br />
K (4.2)<br />
die konvexe Hülle von A (engl. convex hull) und ist die kleinste konve-<br />
xe Menge, die A enthält.
4.1 Spezialfall »Konvexe Polygone« 35<br />
a<br />
b<br />
Bemerkung 4.6 Für konvexe Mengen und Polygone kann man folgendes<br />
zeigen:<br />
1. Der gemeinsame Schnitt endlich vieler konvexer Mengen ist wieder<br />
konvex.<br />
2. Eine Menge A ⊆ E d ist genau dann konvex, wenn es für jeden<br />
Punkt p ∈ ∂A auf dem Rand von A eine (d − 1)-dimensionale<br />
Hyperebene H(n, a) mit p ∈ H(n, a) gibt, so daß A ganz im Halbraum<br />
H + (n, a) liegt.<br />
3. Ein konvexes Polygon P = (p1, . . . , pn) ist gleich der konvexen<br />
Hülle seiner Eckpunkte,<br />
b<br />
P = CH({p1, . . . , pn}) .<br />
Umgekehrt ist die konvexe Hülle einer n-elementigen Punktmenge<br />
(die nicht alle auf einer Geraden liegen) ein konvexes Polygon<br />
mit höchstens n Ecken.<br />
4. Ein konvexes Polygon P = (s1, . . . , sn) ist gleich dem Schnitt von<br />
n Halbebenen,<br />
P =<br />
n�<br />
H + (ni, ai) ,<br />
i=1<br />
wobei die Geraden g(ni, ai) von den Polygonkanten si induziert<br />
werden; die Normalenvektoren ni zeigen dabei in Richtung des<br />
Polygoninneren.<br />
Umgekehrt ist der Schnitt von n Halbebenen – sofern dieser zweidimensional<br />
(d. h. im E 2 innere Punkte besitzt) und beschränkt<br />
(d. h. keinen Halbstrahl enthält) ist – ein konvexes Polygon mit<br />
höchstens n Ecken.<br />
5. Ein konvexes Polygon P = (p1, . . . , pn) ist das einzige Polygon, das<br />
genau {p1, . . . , pn} als Eckenmenge besitzt.<br />
Denn jede Kante [pi pi+k], die nicht zwei benachbarte Ecken verbindet<br />
(d. h. k /∈ {1, n − 1}), trennt die Punkte pi+1, . . . , pi+k−1<br />
von den übrigen Punkten pi+k+1, . . . , pi+n−1 ab, d. h. die Punkte<br />
liegen jeweils auf verschieden Seiten der durch [pi pi+k] induzierten<br />
Geraden. (Sonst wäre P entweder nicht konvex oder – im Fall<br />
a<br />
Abbildung 4.2<br />
Eine konvexe (links) und<br />
eine nicht-konvexe Menge<br />
(rechts) im E 2<br />
si<br />
H + (ni, ai)<br />
P
36 Polygone<br />
a<br />
b<br />
notw. Voraussetzung:<br />
positiver Knickwinkel<br />
pi+2<br />
pi+1<br />
ccw(pi, pi+1,<br />
pi+2) ≥ 0<br />
pi<br />
kollinearer Strecken – nicht einfach.) In jeder der beiden Eckenmengen<br />
muß es jeweils genau eine Ecke geben, die mit [pi pi+k]<br />
verbunden wird, und eine Ecke p, die mit einer Ecke q der anderen<br />
Menge verbunden wird, sonst ergäbe sich keine geschlossene<br />
Kette. Das Segment [p q] schneidet pi pi+k, da p und q auf verschiedenen<br />
Seiten der Geraden liegen. Da aufgrund der Konvexität<br />
von P gilt P ∩ pi pi+k = [pi pi+k], schneidet [p q] auch das<br />
Segment [pi pi+k], denn andernfalls würde [p q] teilweise im Äußeren<br />
von P verlaufen und P wäre nicht konvex.<br />
Somit kann es nur eine einfache polygonale Kette geben, die alle<br />
Punkte p1, . . . , pn verbindet, nämlich P. ⊳<br />
4.1.1 Test auf Konvexität<br />
Wenn wir ein beliebiges Polygon P (in Kanten- oder Eckendarstellung)<br />
gegeben haben, auf welche Weise (und mit welchem Zeitaufwand) können<br />
wir entscheiden, ob das Polygon konvex ist?<br />
Eine notwendige Voraussetzung für die Konvexität ist offenbar, daß al-<br />
le Knickwinkel des Polygons positiv sind (d. h. der Innenwinkel an der<br />
betreffenden Ecke ist kleiner oder gleich π), 2 denn sonst findet man<br />
leicht in der Umgebung der fraglichen Ecke zwei Punkte a und b, so<br />
daß [a b] � P gilt. Mittels der ccw-Funktion (siehe Gleichung (3.7)) können<br />
wir diese Eigenschaft leicht testen, denn für die n Ecken des Polygons<br />
muß in diesem Fall gelten<br />
∀1≤i≤n pi+2 liegt links vom Strahl [pi pi+1}<br />
⇐⇒<br />
∀1≤i≤n ccw(pi, pi+1, pi+2) ≥ 0 ,<br />
wobei wieder pn+1 = p1 und pn+2 = p2 ist.<br />
(4.3)<br />
Es stellt sich nun die Frage, ob diese Eigenschaft auch hinreichend für<br />
die Konvexität ist, d. h. ob jedes Polygon mit ausschließlich positiven<br />
Knickwinkeln konvex ist. Folgendes Lemma beantwortet diese Frage:<br />
Lemma 4.7 Sei P = (p1, . . . , pn) ein Polygon (in Eckendarstellung) mit<br />
ausschließlich positiven Knickwinkeln, d. h. mit ccw(pi, pi+1, pi+2) ≥ 0<br />
für i = 1, . . . , n. Dann ist P konvex.<br />
Beweis: Wir zeigen, daß das gesamte Polygon P links von der Kante<br />
s1 = [p1 p2] liegen muß. Angenommen, dem wäre nicht so, dann<br />
müßte es einen Punkt p ′ ∈ p1 p2 geben, wo die polygonale Kette<br />
[p1 p2], [p2 p3], . . . zum ersten Mal die von der Geraden p1 p2 induzierte<br />
positive Halbebene H + verläßt (siehe Abbildung 4.3 links).<br />
Zwei Fälle für die Lage von p ′ sind möglich: p ′ liegt entweder auf dem<br />
Strahl [p1 p2} oder auf dem Strahl {p1 p2]. O. B. d. A. genügt es, den ersten<br />
Fall zu betrachten, denn im anderen Fall können wir das Polygon<br />
2 Solche Winkel nennt man auch konvex, im Gegensatz zu negativen Knickwinkeln (d. h.<br />
der Innenwinkel ist größer als π), die reflex oder konkav heißen.
4.1 Spezialfall »Konvexe Polygone« 37<br />
an der Normalen zu p1 p2 spiegeln und durch Umkehren des Durchlaufsinns<br />
erhalten wir ein Polygon, auf welches der erste Fall zutrifft.<br />
Sei dann si = [pi pi+1] diejenige Polygonkante, die p ′ enthält. Es kann<br />
nicht sein, daß p ′ = pi = p2 gilt, da beide Knickwinkel (an p2 und an pi)<br />
positiv sind und pi+1 echt rechts von der Geraden p1 p2 liegt.<br />
Wir betrachten jetzt das Polygon P ′ = (p1, p2, p ′ , pi+1, . . . , pn), siehe<br />
Abbildung 4.3 rechts. Da die Summe aller Knickwinkel in P und P ′ nach<br />
Satz 4.4 auf Seite 34 gleich 2π ist, andererseits aber auch die Knickwinkelsummen<br />
α(si, sn+1) (in P) bzw. α([p ′ pi+1], [p1 p2]) (in P ′ ) aufgrund<br />
der Übereinstimmung der beiden Polygone gleich sind, muß gelten<br />
α(s1, si) = α([p1 p2], [p ′ pi+1]) < 0 ,<br />
da p ′ auf dem Strahl [p1 p2} und pi+1 echt rechts vom Strahl [p1 p2} liegt.<br />
Somit muß das Polygon P zwischen den Kanten s1 und si mindestens<br />
einen konkaven Winkel besitzen, im Widerspruch zur Annahme. Folglich<br />
kann ein solcher Punkt p ′ nicht existieren und das Polygon P liegt<br />
links von der Kante s1 = [p1 p2].<br />
Dieselbe Argumentation können wir jetzt bei allen Kanten si (für i =<br />
1, . . . , n) anwenden. Somit können wir zu jedem Punkt p ∈ ∂P auf dem<br />
Rand des Polygons eine Gerade g(n, a) angeben (nämlich die von derjenigen<br />
Kante si induzierte Gerade, auf der p liegt), mit p ∈ g(n, a)<br />
und P ⊆ H + (n, a). Laut Bemerkung 4.6 (2) auf Seite 35 ist P also konvex.<br />
✷<br />
Zusammenfassend erhalten wir also den folgenden Satz:<br />
Satz 4.8 Die Konvexität eines Polygons (mit n Ecken) kann mittels Beziehung<br />
(4.3) auf der gegenüberliegenden Seite mit einem Zeitbedarf<br />
von O(n) getestet werden.<br />
P<br />
H + H +<br />
p1<br />
pi<br />
p2<br />
p ′<br />
pi+1<br />
P ′<br />
p1<br />
p2<br />
p ′<br />
pi+1<br />
linearer Zeitbedarf für<br />
Konvexitätstest<br />
Abbildung 4.3<br />
Zwischen p2 und p ′ hat P<br />
mindestens einen<br />
konkaven Winkel
38 Polygone<br />
linearer Zeitbedarf für<br />
Point-in-polygon-Test<br />
132<br />
132<br />
zyklische angulare<br />
Ordnung<br />
2<br />
1<br />
123<br />
132<br />
Abbildung 4.4<br />
Gebiete gleicher zyklischer<br />
angularer Ordnung<br />
3<br />
4.1.2 Point-in-polygon-Test<br />
Für ein gegebenes konvexes Polygon P – z. B. in Eckendarstellung P =<br />
(p1, . . . , pn) – und einen Anfragepunkt q ∈ E 2 möchten wir wissen, ob<br />
sich q innerhalb oder außerhalb des Polygons befindet.<br />
Aus Bemerkung 4.6 (4) auf Seite 35 folgen sofort die Äquivalenzen<br />
q ∈ P<br />
⇐⇒<br />
∀1≤i≤n q ∈ H + (ni, ai) bzw. ∀1≤i≤n ccw(pi, pi+1, q) ≥ 0 ,<br />
wobei die Geraden g(ni, ai) von den Polygonkanten si induziert werden.<br />
Somit können wir mit einem Zeitbedarf von O(n) testen, ob q im<br />
Polygon P liegt.<br />
Diese Schranke kann jedoch noch unterboten werden, wenn – wie oben<br />
angenommen – das Polygon in Ecken- (oder Kantendarstellung) gegeben<br />
ist. Hierzu betrachten wir die angulare Ordnung der Polygonecken;<br />
allerdings nicht – wie bisher – mit dem Koordinatenursprung als Bezugspunkt,<br />
sondern mit einem variablen Bezugspunkt x. (Natürlich<br />
muß gelten x /∈ {p1, . . . , pn}.) Außerdem verzichten wir aufgrund der<br />
„Zyklizität“ (siehe Bemerkung 3.6 auf Seite 29) auf eine Referenzrichtung,<br />
d. h. es kommt uns nur auf die zyklische angulare Ordnung der<br />
Punkte an.<br />
Auf diese Weise erhalten wir für jeden Bezugspunkt x eine zyklische<br />
Ordnung der Polygonecken und wir können überlegen, welche Punkte<br />
x identische Ordnungen induzieren (und auf diese Weise eine Äquivalenzrelation<br />
auf der Menge R 2 \{p1, . . . , pn} definieren). Die zyklische<br />
angulare Ordnung der Punkte ändert sich offensichtlich genau dann,<br />
wenn der Punkt x einen Strahl [pi (2pi − pj)} (für i �= j) überschreitet,<br />
d. h. einen Strahl der in einem Punkt pi startet und in die zu einem anderen<br />
Punkt pj entgegengesetzte Richtung verläuft.<br />
Abbildung 4.4 zeigt links eine Zerlegung der Ebene in Gebiete gleicher<br />
zyklischer angularer Ordnung für eine sechselementige Punktmenge.<br />
Falls die Punkte Ecken eines konvexen Polygons P sind (wie z. B. rechts<br />
in der Abbildung), dann ist P offensichtlich immer eine Teilmenge des<br />
in der Abbildung farbig markierten Gebietes, denn keiner der die Gebiete<br />
begrenzenden Halbstrahlen schneidet P. Somit folgt für die angulare<br />
Ordnung:
4.2 Spezialfall »Sternförmige Polygone« 39<br />
Beobachtung 4.9 Für ein konvexes Polygon P induzieren alle Punkte<br />
aus P ◦ dieselbe zyklische angulare Ordnung.<br />
Somit können wir für das als Eckenfolge gegebene Polygon P =<br />
(p1, . . . , pn) sofort eine angulare Ordnung »�z« angeben, so daß p1 �z<br />
· · · �z pn gilt: Als Bezugspunkt x wählen wir einen beliebigen Punkt<br />
aus dem Innern von P, z. B. den Schwerpunkt dreier Polygonecken,<br />
pi+pj+pk<br />
3 , und als Referenzrichtung z wählen wir einen beliebigen<br />
Strahl, der rechts von [x p1} und links von [x pn} liegt, z. B. z = [x y}<br />
mit y = p1+pn<br />
2 .<br />
Die durch den Punkt x und zwei jeweils aufeinanderfolgende Polygonecken<br />
pi und pi+1 induzierte Zerlegung der Ebene in Sektoren zerlegt<br />
auch das Polygon P. Aufgrund der angularen Ordnung der Polygonecken<br />
(mit x als Bezugspunkt) ist der Schnitt eines Sektors mit P<br />
jeweils ein Dreieck mit den Eckpunkten x, pi, pi+1. Für den Test, ob<br />
der Anfragepunkt q im Polygon P liegt, genügt es somit, das Dreieck<br />
desjenigen Sektors zu betrachten, in dem sich der Punkt q befindet. Diesen<br />
Sektor können wir (bei angular sortierten Punkten p1 �z · · · �z pn)<br />
nach Satz 3.9 auf Seite 31 mit einem Zeitbedarf von O(log n) bestimmen.<br />
Der Test, ob q innerhalb des entsprechenden Dreiecks liegt, kann wieder<br />
mittels der ccw-Funktion erfolgen (bei konstantem Zeitbedarf). Den für<br />
die angulare Ordnung »�z« benötigten Strahl z können wir ebenfalls<br />
mittels der oben beschriebenen Idee in konstanter Zeit bestimmen. Somit<br />
erhalten wir zusammenfassend den folgenden Satz:<br />
Satz 4.10 Für ein konvexes Polygon P = (p1, . . . , pn) in Eckendarstellung<br />
und einen Anfragepunkt q ∈ E 2 kann der Point-in-polygon-Test<br />
mit einem Zeitbedarf von O(log n) beantwortet werden.<br />
Ist lediglich eine Darstellung des Polygons als Kantenmenge vorhanden,<br />
so kann der Test mit einem Zeitbedarf von O(n) erfolgen.<br />
4.2 Spezialfall »Sternförmige Polygone«<br />
Definition 4.11 (Sichtbarkeitspolygon) Sei P ein Polygon und p, q ∈ P.<br />
Die beiden Punkte p und q heißen füreinander sichtbar (in P), wenn das sichtbar<br />
Liniensegment [p q] komplett im Polygon P enthalten ist, d. h. [p q] ⊂ P<br />
gilt.<br />
Für einen Punkt p ∈ P heißt die Menge<br />
vis(p) := { q ∈ P � � q ist für p sichtbar }<br />
z<br />
p1<br />
p7<br />
y<br />
p6<br />
p2<br />
x<br />
x<br />
pi<br />
p5<br />
p3<br />
pi+1<br />
q<br />
p4<br />
logarithmischer Zeitbedarf<br />
für Point-in-polygon-Test<br />
das Sichtbarkeitspolygon von p in P. Sichtbarkeitspolygon<br />
Zum Experimentieren empfiehlt sich das Java-Applet »VIP 2.0« von<br />
Th. Wolf, welches das Sichtbarkeitspolygon (in linearer Zeit) berechnet<br />
und darstellt (��������������������������������������������������<br />
������������������������� ). WWW☞
40 Polygone<br />
sternförmig<br />
Kern<br />
Kern als Schnitt von<br />
Halbebenen<br />
Definition 4.12 (Sternförmigkeit und Kern eines Polygons)<br />
Ein Polygon P heißt sternförmig, wenn es einen Punkt p ∈ P gibt mit<br />
vis(p) = P .<br />
Die Gesamtheit aller dieser Punkte heißt der Kern von P, d. h.<br />
ker(P) := { p ∈ P � � vis(p) = P } .<br />
Bemerkung 4.13 Offensichtlich gelten folgende Beziehungen:<br />
1. Jedes Sichtbarkeitspolygon vis(p) ist sternförmig und es gilt immer<br />
p ∈ ker(vis(p)).<br />
2. Das Sichtbarkeitspolygon eines Polygon der Komplexität n (d. h. P<br />
besitzt n Ecken) ist von der Komplexität O(n).<br />
3. Jedes konvexe Polygon ist auch sternförmig und es gilt<br />
P ist konvex ⇐⇒ ker(P) = P . ⊳<br />
Der Kern eines Polygons kann auch noch anders charakterisiert werden<br />
als in Definition 4.12, nämlich als Schnitt von Halbebenen:<br />
Lemma 4.14 Sei P mit Kantenfolge (s1, . . . , sn) und g(ni, ai), die von<br />
den Kanten si induzierten Geraden. O. B. d. A. zeigen die Normalenvektoren<br />
ni wieder in das Polygoninnere. Dann gilt<br />
ker(P) =<br />
n�<br />
H + (ni, ai) .<br />
i=1<br />
Beweis: Die »⊆«-Richtung des Beweises ist einfach, denn wäre ein<br />
Punkt p ∈ ker(P) in irgendeiner positiven Halbebene H + (ni, ai) nicht<br />
enthalten, dann würde jede Strecke, die p mit einem Punkt auf si (ausgenommen<br />
deren Endpunkte) verbindet, zumindest teilweise im Äußeren<br />
des Polygons P verlaufen.<br />
Sei umgekehrt p in jeder positiven Halbebene enthalten, dann liegt p<br />
im Polygon P, weil es im anderen Fall mindestens eine Strecke si geben<br />
müßte, die p „von außen“ sieht. Dann müßte aber p in H − (ni, ai) liegen,<br />
im Widerspruch zur Annahme. Läge jetzt p nicht im Kern von P, wäre<br />
vis(p) eine echte Teilmenge von P und es müßte einen Punkt v ∈ P geben,<br />
der von p nicht gesehen wird, d. h. die Strecke [p v] muß mindestens<br />
eine Kante von P schneiden. Sei si die erste Kante, die der Strahl [v p} auf<br />
dem Weg von v zu p schneidet. Dann liegt offensichtlich v in H + (ni, ai)<br />
und p muß sich demnach in H − (ni, ai) befinden, im Widerspruch zu<br />
unserer Annahme. ✷<br />
Sofern ein Polygon also einen zweidimensionalen Kern besitzt, ist dieser<br />
(unter Verwendung von Bemerkung 4.6 (4) auf Seite 35) ein konvexes<br />
Polygon mit O(n) Ecken.
4.2 Spezialfall »Sternförmige Polygone« 41<br />
Lemma 4.15 Für jeden Punkt p eines Polygons P gilt<br />
ker(P) ⊆ ker(vis(p)) .<br />
Beweis: Das Sichtbarkeitspolygon vis(p) besteht zum einen aus Polygonkanten<br />
von P (bzw. Teilen davon) und zum anderen aus künstlichen<br />
Kanten, die durch reflexe Ecken entstehen. Sei HP die Menge der von<br />
Kanten des ersten Typs induzierten positiven Halbebenen und HR die<br />
Menge der von den restlichen Kanten des Sichtbarkeitspolygons induzierten<br />
Halbebenen. Dann gilt nach Lemma 4.14 auf der gegenüberliegenden<br />
Seite für den Kern des Sichtbarkeitspolygons vis(p)<br />
ker(vis(p)) = �<br />
und für den Kern des Polygon P<br />
H + ∈HP<br />
ker(P) = �<br />
H + ∈H<br />
H + ∩ �<br />
H + ,<br />
H + ∈HR<br />
wobei H die Menge aller durch Polygonkanten von P induzierten Halbebenen<br />
darstellt.<br />
Wegen HP ⊆ H folgt sofort ker(P) ⊆ �<br />
H + . Sei nun [r q] irgendeine<br />
∈HP<br />
der künstlichen Kanten von einer reflexen Ecke r zu einem Punkt q auf<br />
dem Polygonrand. Da eine solche Kante kollinear zu p liegen muß, kann<br />
ein Punkt, der sich nicht in der zu dieser Kante gehörenden positiven<br />
Halbebene H + befindet, nicht zugleich p und q sehen. Demzufolge kann<br />
ein solcher Punkt auch nicht aus dem Kern ker(P) sein. Damit gilt also<br />
auch ker(P) ⊆ �<br />
H + und durch beide Inklusionen zusammen folgt<br />
∈HR<br />
die Behauptung. ✷<br />
4.2.1 Point-in-polygon-Test<br />
Wie beim Point-in-polygon-Test für konvexe Polygone (siehe Abschnitt<br />
4.1.2 auf Seite 38) ist wieder ein – diesmal sternförmiges –<br />
Polygon P = (p1, . . . , pn) in Eckendarstellung gegeben. Für einen Anfragepunkt<br />
q soll dann wie zuvor getestet werden, ob sich q innerhalb<br />
oder außerhalb des Polygons befindet.<br />
Wenn wir zusätzlich annehmen, daß wir einen Punkt x ∈ ker(P) kennen,<br />
dann kann der Point-in-polygon-Test ganz analog zum »konvexen<br />
Fall« durchgeführt werden. Betrachten wir wieder die zyklische angulare<br />
Ordnung der Polygonecken und die Zerlegung der Ebene in Gebiete<br />
gleicher angularer Ordnung, dann können wir Beobachtung 4.9 auf<br />
sternförmige Polygone erweitern:<br />
Lemma 4.16 Für ein sternförmiges Polygon P induzieren alle Punkte<br />
aus ker(P) ◦ dieselbe zyklische angulare Ordnung.<br />
H +<br />
q<br />
r<br />
p<br />
H +<br />
Gebiete gleicher zyklischer<br />
angularer Ordnung
42 Polygone<br />
logarithmischer Zeitbedarf<br />
für Point-in-polygon-Test<br />
linearer Zeitbedarf für<br />
Bestimmung des Kerns<br />
Abbildung 4.5<br />
Ein Halbstrahl schneidet<br />
das Innere des<br />
Kerns ker(P)<br />
Beweis: Würden nicht alle Punkte aus ker(P) ◦ dieselbe Ordnung induzieren,<br />
müßte einer der die Gebiete gleicher Ordnung begrenzenden<br />
Halbstrahlen das Innere von ker(P) schneiden (siehe Abbildung 4.5).<br />
Sei p der Startpunkt dieses Halbstrahls und q der die Richtung bestimmende<br />
Punkt. Aufgrund der Sternförmigkeit von P muß q vom Kern<br />
aus sichtbar sein. Deshalb können die beiden mit p inzidenten Polygonkanten<br />
nicht auf verschiedenen Seiten von [q p} liegen, da sonst die Sicht<br />
auf q verdeckt wäre. Somit muß p also eine reflexe Ecke sein und der<br />
in der Abbildung farbig markierte Bereich („zwischen“ p und q) kann<br />
nicht vom ganzen Kern aus eingesehen werden, im Widerspruch zur<br />
Sternförmigkeit von P. ✷<br />
Somit können wir wiederum mit Hilfe des Punktes x (von dem wir jetzt<br />
o. B. d. A. annehmen, daß er sogar im Innern des Kerns von P liegt) für<br />
das als Eckenfolge gegebene Polygon P = (p1, . . . , pn) eine angulare<br />
Ordnung »�z« angeben, so daß p1 �z · · · �z pn gilt: Als Referenzrichtung<br />
z wählen wir wieder einen beliebigen Strahl, der rechts von [x p1}<br />
und links von [x pn} liegt.<br />
Für den Test, ob der Anfragepunkt q im sternförmigen Polygon P liegt,<br />
genügt es jetzt wieder, das Dreieck desjenigen Sektors zu betrachten,<br />
in dem sich der Punkt q befindet. Und dieser Sektor kann bekanntlich<br />
nach Satz 3.9 auf Seite 31 mit einem Zeitbedarf von O(log n) bestimmt<br />
werden. Zusammenfassend erhalten wir somit den folgenden Satz:<br />
Satz 4.17 Für ein sternförmiges Polygon P = (p1, . . . , pn) in Eckendarstellung,<br />
für das ein Punkt x ∈ ker(P) bekannt ist, und einen Anfragepunkt<br />
q ∈ E 2 kann der Point-in-polygon-Test mit einem Zeitbedarf<br />
von O(log n) beantwortet werden.<br />
Für den Fall, daß kein Punkt aus dem Kern von P bekannt ist, sondern<br />
dieser erst bestimmt werden muß, sei der folgende Satz – ohne Beweis –<br />
zitiert:<br />
Satz 4.18 Der Kern eines Polygons mit n Ecken kann mit einem Zeitbedarf<br />
von O(n) berechnet werden.<br />
Ein Beweis und ein Algorithmus zur Berechnung des Kerns finden sich<br />
z. B. in [14, S. 204]. Mit Hilfe von Satz 4.18 können wir jetzt für jedes<br />
sternförmige Polygon, das wir erhalten, in linearer Zeit (also in der Größenordnung<br />
der Eingabekomplexität) einen Kernpunkt bestimmen und<br />
ker(P) p<br />
q<br />
P
4.2 Spezialfall »Sternförmige Polygone« 43<br />
Algorithmus 4.1 Erzeugen eines (sternförmigen) Polygons<br />
STERNPOL(p1, . . . , pn)<br />
Input: n Punkte p1, . . . , pn ∈ E 2<br />
1 Bestimme den Punkt pmin mit minimaler y-Koordinate (bei Punkten<br />
gleicher y-Koordinate, denjenigen mit maximaler x-Koordinate)<br />
2 Sortiere die Punkte {p1, . . . , pn} \ {pmin} nach ihrer angularen Ordnung<br />
»�« mit pmin als Bezugspunkt und der positiven x-Achse als<br />
Referenzrichtung (bei Punkten gleichen Winkels, nach wachsendem<br />
Abstand zu pmin)<br />
(pi1 , . . . , pin−1 ) sei die sortierte Folge<br />
3 P ← (pmin, pi1 , . . . , pin−1 )<br />
Output: P ist ein sternförmiges Polygon mit der<br />
Eckenmenge {p1, . . . , pn}<br />
diesen zusammen mit dem Polygon abspeichern, so daß dann jeder<br />
Point-in-polygon-Test mit logarithmischem Zeitbedarf beantwortet werden<br />
kann.<br />
4.2.2 Erzeugen eines (sternförmigen) Polygons mit vorgegebener<br />
Eckenmenge<br />
Angenommen, wir sollen für eine vorgegebene Punktmenge<br />
{p1, . . . , pn} ⊂ E 2 ein Polygon P bestimmen, das genau diese<br />
Menge als Eckenmenge besitzt. Ist dies immer möglich und – falls ja –<br />
wie schnell können wir das Polygon erzeugen?<br />
Offenbar leistet Algorithmus 4.1 das Gewünschte: Durch die angulare<br />
Sortierung der Punkte bezüglich des extremalen Punktes pmin wird<br />
ausgeschlossen, daß sich zwei nicht inzidente Polygonkanten schneiden<br />
und wir erhalten ein sternförmiges Polygon P mit pmin ∈ ker(P).<br />
Die Laufzeit des Algorithmus wird offensichtlich vom Zeitbedarf für das<br />
Sortieren der n Punkte dominiert und ist aus O(n log n). Es stellt sich<br />
nun die Frage, ob wir mit einem anderen Ansatz diese Schranke noch<br />
unterbieten können. Der folgende Satz zeigt, daß dies nicht möglich ist:<br />
Satz 4.19 Der Zeitbedarf, um zu einer gegebenen Menge von n Punkten<br />
{p1, . . . , pn} ⊂ E 2 ein Polygon zu bestimmen, das genau diese Punkte<br />
als Ecken besitzt, ist aus Θ(n log n).<br />
Beweis: Es genügt, noch zu zeigen, daß die Lösung des Problems im<br />
Worst case einen Zeitbedarf von Ω(n log n) besitzt.<br />
Hierzu reduzieren wir das Sortierproblem, welches nach Satz 2.39 auf<br />
Seite 20 in unserem Berechnungsmodell die Komplexität Ω(n log n) besitzt,<br />
auf unser Problem: Gegeben also n Zahlen, x1, . . . , xn ∈ R, dann<br />
pmin<br />
Zeitbedarf von Θ(n log n)<br />
zur Polygonbestimmung
44 Polygone<br />
Vorsicht! Sonderfälle!<br />
linearer Zeitbedarf für<br />
Point-in-polygon-Test<br />
betrachten wir die Punktmenge<br />
S := {(x1, x 2 1), . . . , (xn, x 2 n)} ,<br />
die wir in linearer Zeit bestimmen können.<br />
Weil alle Punkte von S auf der konvexen Funktion x ↦→ x 2 liegen, gibt<br />
es nach Bemerkung 4.6 (5) auf Seite 35 nur genau ein Polygon, welches<br />
diese Punkte als Eckenmenge besitzt. Zudem liefert uns ein Durchlaufen<br />
der Eckenfolge dieses Polygons in linearer Zeit eine Sortierung der<br />
Zahlen x1, . . . , xn.<br />
Somit haben wir das Sortierproblem in linearer Zeit auf das Problem<br />
der Polygonbestimmung reduziert und erhalten für dieses eine untere<br />
Schranke von Ω(n log n − n) = Ω(n log n). ✷<br />
4.3 Point-in-polygon-Test bei allgemeinen Polygonen<br />
Für beliebige einfache Polygone läßt sich der Point-in-polygon-Test<br />
nicht so elegant lösen wie im Fall konvexer oder sternförmiger Polygone,<br />
da es i. allg. keine Zerlegung der Ebene in Sektoren gibt, so daß der<br />
Schnitt jedes Sektors mit dem Polygon genau ein Dreieck ergibt (sonst<br />
wäre das Polygon ja auch sternförmig).<br />
Allerdings können wir uns den Jordanschen Kurvensatz zunutze machen<br />
und die Anzahl der Schnitte des Polygonrandes mit einem Strahl<br />
vom Anfragepunkt q aus ins „Unendliche“ zählen. Ist diese nämlich<br />
ungerade, dann liegt q offensichtlich innerhalb von P, sonst außerhalb<br />
(Sonderfälle, in denen q auf dem Rand von P liegt, sollen hier unberücksichtigt<br />
bleiben; diese können aber z. B. separat in linearer Zeit ausgeschlossen<br />
werden). Algorithmus 4.2 auf der folgenden Seite bestimmt<br />
genau diese Anzahl an Schnitten. Der Punkt ˜p liegt dabei in jedem Fall<br />
außerhalb von P.<br />
Beim Zählen der Schnitte treten allerdings leicht Sonderfälle auf (wenn<br />
z. B. Polygonecken oder -kanten auf dem Segment liegen), die geeignet<br />
berücksichtigt werden müssen, so daß keine Schnitte übersehen oder<br />
doppelt gezählt werden. Algorithmus 4.2 berücksichtigt dies, indem<br />
nicht alle Schnitte von Polygonkanten mit dem Strahl gezählt werden,<br />
sondern nur solche, bei denen beim Durchlauf der Eckenfolge ein Wechsel<br />
des Eckpunktes auf die andere Seite des Strahls erfolgt. Hierzu wird<br />
wieder die ccw-Funktion aus Abschnitt 3.2.2 verwendet.<br />
Der Zeitbedarf von Algorithmus 4.2 ist offensichtlich linear in der Zahl<br />
der Polygonecken, so daß wir folgenden Satz erhalten:<br />
Satz 4.20 Für ein beliebiges Polygon P = (p1, . . . , pn) in Eckendarstellung<br />
und einen Anfragepunkt q ∈ E 2 kann der Point-in-polygon-Test<br />
mit einem Zeitbedarf von O(n) beantwortet werden.
4.3 Point-in-polygon-Test bei allgemeinen Polygonen 45<br />
Algorithmus 4.2 Point-in-polygon-Test<br />
POINTINPOLYGON(q)<br />
Input: Beliebiges Polygon P = (p1, . . . , pn) ⊂ E 2<br />
Anfragepunkt q<br />
1 Bestimme einen Punkt ˜p außerhalb von P (z. B. anhand der maximalen<br />
Koordinatenwerte der Eckpunkte)<br />
{Suche einen Eckpunkt, der nicht auf ˜p q liegt}<br />
2 i ← 1<br />
3 while ccw( ˜p, q, pi ) = 0 do<br />
4 i ← i + 1<br />
5 end while<br />
6 s ← 0 {s zählt die Anzahl der Schnitte von [ ˜p q] mit ∂P}<br />
7 lr ← sgn(ccw( ˜p, q, pi )) {lr ∈ {−1, 0, 1}}<br />
8 for j ← i + 1, . . . , n do<br />
9 lrnew ← sgn(ccw( ˜p, q, pj ))<br />
10 if |lrnew − lr| = 2 then<br />
11 lr ← lrnew<br />
12 if ccw(pj−1, pj , ˜p) · ccw(pj−1, pj , q) ≤ 0 then<br />
13 s ← s + 1 { ˜p und q liegen auf versch. Seiten von [pj−1 pj ]}<br />
14 end if<br />
15 end if<br />
16 end for<br />
Output: Ist s ungerade, befindet sich q innerhalb von P, sonst<br />
außerhalb
Das<br />
Plane-sweep-Paradigma<br />
Das Sweep-Paradigma ist eine algorithmische Technik, die zur Lösung<br />
einer Vielzahl von geometrischen Problemen verwendet werden kann.<br />
Das Gemeinsame an allen Sweep-Verfahren ist, daß aus einem statischen<br />
d-dimensionalen Problem ein dynamisches (d − 1)-dimensionales Problem<br />
wird, indem eine der räumlichen Dimensionen in eine zeitliche Dimension<br />
verwandelt wird. Bezogen auf die zweidimensionalen Probleme,<br />
mit denen wir uns beschäftigen, heißt das, daß ein solches Problem in<br />
eine Folge eindimensionaler Probleme transformiert wird.<br />
Dieses Verwandeln geschieht in der Regel dadurch, daß eine eindimensionale<br />
Struktur – z. B. eine Gerade (die Sweep line) – horizontal über die Sweep line<br />
Problemanordnung hinwegwandert. Die Problemanordnung selbst (die<br />
sich u. U. während die Sweep line sie überquert auch noch ändern kann)<br />
wird hierbei in der sog. Horizontalstruktur verwaltet. Horizontalstruktur<br />
An einigen diskreten Stellen hält die Sweep line dann an, um jeweils ein<br />
eindimensionales Problem zu bearbeiten. Die für die Bearbeitung dieses<br />
Problems nötige Informationsmenge ist in der Regel sehr viel kleiner<br />
als das zu lösende Gesamtproblem und wird in der sog. Vertikalstruktur Vertikalstruktur<br />
verwaltet. Diese kann – z. B. bei sehr einfachen Problemen – an jedem<br />
Haltepunkt der Sweep line neu erzeugt werden, wird aber in der Regel<br />
nur von einem Haltepunkt zum nächsten Haltepunkt geeignet fortgeführt.<br />
Die Gesamtlösung des zweidimensionalen Problems ergibt sich dann<br />
durch eine geeignete Verknüpfung der Folge von Teillösungen der eindimensionalen<br />
Probleme.<br />
5.1 Das Problem des dichtesten Punktepaares<br />
Gegeben n Punkte p1, . . . , pn ∈ E 2 , dann besteht das Closest-pair-<br />
Problem darin, zwei Punkte pi, pj (i �= j) mit minimalem euklidischen Closest-pair-Problem<br />
Abstand zu finden, d. h.<br />
|pi pj| = min<br />
1≤k
48 Das Plane-sweep-Paradigma<br />
MinDist<br />
Ein naiver Algorithmus zur Bestimmung des dichtesten Punktepaares<br />
berechnet alle Θ(n 2 ) Abstandspaare zwischen je zwei Punkten und<br />
wählt hiervon den kleinsten aus. Die Laufzeit dieses Algorithmus ist<br />
also aus O(n 2 ). Diese Schranke wollen wir mittels eines Plane-sweep-<br />
Ansatzes unterbieten.<br />
Problem im Das analoge Problem im Eindimensionalen, zu einer Menge von Zah-<br />
Eindimensionalen len x1, . . . , xn ∈ R das dichteste Paar zu finden, ist uns schon in Beispiel<br />
2.37 auf Seite 19 begegnet. Wir lösen es (mit einem Zeitbedarf<br />
von O(n log n)), indem wir die Zahlen zunächst sortieren. Dann können<br />
wir die Tatsache ausnutzen, daß zwei Zahlen, die ein dichtestes Paar<br />
bilden, in der Sortierung direkt aufeinander folgen müssen. Somit können<br />
wir dieses Paar mit einem eindimensionalen Sweep über alle Zahlen<br />
bestimmen, wobei unser Sweep point an jeder Zahl Halt macht und wir<br />
ein nulldimensionales Problem lösen müssen: Wir müssen die Differenz<br />
der aktuellen und der vorhergehenden Zahl bestimmen und diese mit<br />
der bisher kleinsten Differenz vergleichen.<br />
MinDist<br />
Im Zweidimensionalen wollen wir jetzt so ähnlich vorgehen. Die Kernpunkte<br />
unserer Idee sind hierbei die folgenden:<br />
Horizontalstruktur Wir sortieren zunächst alle Punkte nach ihrer<br />
x-Koordinate, d. h. die Horizontalstruktur, die sich in diesem Fall<br />
während der gesamten Algorithmenausführung nicht ändert,<br />
wird in einem Preprocessing-Schritt als sortierte Liste initialisiert.<br />
Der Zeitaufwand hierfür ist aus O(n log n).<br />
Sweep line Die Sweep line lassen wir von links nach rechts über die<br />
Punkte gleiten, wobei wir an jedem Punkt Halt machen.<br />
Sei MinDist der minimale Abstand unter allen bereits abgearbeiteten<br />
Punkten, d. h. der Abstand zweier Punkte, die links der aktuellen<br />
Sweep line liegen. Um zu testen, ob der aktuelle Punkt (auf<br />
der Sweep line) diesen Abstand noch unterbieten kann, genügt es<br />
offensichtlich, alle Punkte zu betrachten, die sich in einem Streifen<br />
der Breite MinDist links der Sweep line befinden.<br />
Vertikalstruktur Dieser Streifen (bzw. die Punkte, die er enthält) muß<br />
also mittels unserer Vertikalstruktur (möglichst effizient) verwaltet<br />
werden. Wir verwenden hierfür einen balancierten Suchbaum<br />
(z. B. einen AVL-Baum), der für alle drei Operationen »Suchen«,<br />
»Einfügen« und »Löschen« eine logarithmische Zugriffszeit garantiert.<br />
Außerdem sind Bereichsanfragen mit einem Zeitbedarf<br />
von O(log n + k) möglich, wobei k die Größe der Antwort beschreibt.<br />
Die Punkte werden dabei bezüglich ihrer y-Koordinate im AVL-<br />
Baum verwaltet.<br />
Es müssen jetzt nur noch die folgenden Fragen geklärt werden:<br />
• Zu welchen Zeitpunkten muß die Vertikalstruktur aktualisiert<br />
werden.
5.1 Das Problem des dichtesten Punktepaares 49<br />
• Welche Aktionen müssen bei einer Aktualisierung jeweils durchgeführt<br />
werden?<br />
• Wie hoch ist der Gesamtzeitaufwand des Plane-sweep-Algorithmus?<br />
Dieser Aufwand sollte in jedem Fall geringer sein als Ω(n 2 ),<br />
denn sonst hätten wir keinen Vorteil gegenüber dem naiven Verfahren<br />
erreicht.<br />
Offenbar gibt es zwei Typen von Ereignissen, die eine Aktualisierung<br />
der Vertikalstruktur erfordern:<br />
1. Der linke Rand des Streifens, der im Abstand MinDist der Sweep<br />
line „folgt“, wandert über einen Punkt hinweg.<br />
2. Die Sweep line stößt auf einen neuen Punkt.<br />
Im ersten Fall, muß der betreffende Punkt aus der Vertikalstruktur entfernt<br />
werden (mit einem Zeitbedarf von O(log n)). Im zweiten Fall,<br />
wenn die Sweep line auf einen neuen Punkt stößt, muß der Punkt in die<br />
Vertikalstruktur aufgenommen werden. Außerdem muß getestet werden,<br />
ob der neu aufgenommene Punkt zu irgendeinem anderen Punkt<br />
im Streifen einen geringeren Abstand als den momentan minimalen Abstand<br />
MinDist besitzt. Falls dies der Fall ist, muß der Wert von MinDist<br />
und damit auch die Streifenbreite aktualisiert werden. Hierdurch können<br />
in der Folge auch wieder Ereignisse des ersten Typs ausgelöst werden<br />
– ohne daß die Sweep line weiterwandert.<br />
Zwei Typen von<br />
Ereignissen<br />
Diese Vorgehensweise wird in Algorithmus 5.1 auf der folgenden Seite<br />
realisiert. Hierbei bedarf Schritt 12 – die Bestimmung des minimalen<br />
Abstands des aktuellen Punktes zu allen Punkten aus dem Streifen –<br />
einer genaueren Erläuterung: Zur Bestimmung dieses Abstands müssen<br />
nämlich nicht alle Punkte in dem Streifen der Breite MinDist betrachtet<br />
werden (dies können u. U. immer noch sehr viele sein, z. B. bei einer<br />
vertikalen Anordnung der Punkte), sondern nur diejenigen, die sich in<br />
einem Rechteck der Breite MinDist und der Höhe 2 · MinDist um den<br />
aktuellen Punkt herum befinden. MinDist<br />
Dieses Rechteck kann man sich nun in acht rechtwinklige gleichseitige<br />
Dreiecke unterteilt vorstellen, deren längste Seite jeweils gleich MinDist<br />
ist. Da nach Voraussetzung der minimale Abstand aller Punkte links<br />
der Sweep line gleich MinDist ist, kann jedes dieser Dreiecke maximal<br />
einen Punkt enthalten – das gesamte Rechteck also maximal acht Punkte.<br />
Diese Punkte entsprechen demnach im AVL-Baum einem Teilbaum,<br />
der aus maximal acht Knoten besteht, und können durch zwei Suchanfragen<br />
(nach »HS rechts.y − MinDist« bzw. »HS rechts.y + MinDist«) und<br />
Enumeration der dazwischen liegenden Knoten bestimmt werden. Der<br />
Zeitbedarf hierfür ist aus O(log n + 8) = O(log n).<br />
Folgender Satz faßt unsere Überlegungen noch einmal zusammen:<br />
Satz 5.1 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 können zwei<br />
Punkte pi, pj (i �= j) mit minimalem euklidischen Abstand, d. h.<br />
|pi pj| = min<br />
1≤k
50 Das Plane-sweep-Paradigma<br />
Zeitbedarf von Θ(n log n)<br />
für dichtestes Punktepaar<br />
Algorithmus 5.1 Bestimmung des dichtesten Punktepaares in der Ebene<br />
CLOSESTPAIR(p1, . . . , pn)<br />
Input: n Punkte p1, . . . , pn ∈ E 2<br />
{Initialisierungsschritt}<br />
1 Sortiere die Punkte p1, . . . , pn nach aufsteigenden x-Koordinaten<br />
und füge sie ins Feld HS ein<br />
2 VS ← AVL-Baum, initialisiert mit HS 1 und HS 2<br />
3 MinDist ← |HS 1 HS 2|<br />
4 MinPair ← (1, 2)<br />
5 links ← 1 {HS links ist der am weitesten links liegende Punkt im<br />
Streifen}<br />
6 rechts ← 3 {HS rechts ist der aktuelle Punkt auf der Sweep line}<br />
{Sweep}<br />
7 while rechts ≤ n do<br />
8 if HS links.x + MinDist ≤ HS rechts.x then<br />
9 Entferne HS links aus VS<br />
10 links ← links + 1<br />
11 else<br />
12 Bestimme den minimalen Abstand D = |HS rechts HS min|<br />
von HS rechts zu allen Punkten in VS<br />
13 if D < MinDist then<br />
14 MinDist ← D<br />
15 MinPair ← (rechts, min)<br />
16 end if<br />
17 Füge HS rechts in VS ein<br />
18 rechts ← rechts + 1<br />
19 end if<br />
20 end while<br />
Output: Dichtestes Punktepaar MinPair mit minimalem<br />
Abstand MinDist<br />
mit einem optimalen Zeitbedarf von Θ(n log n) gefunden werden. Der<br />
Speicherbedarf ist dabei aus Θ(n).<br />
Beweis: Die Initialisierung der Horizontalstruktur hat einen Zeitbedarf<br />
von O(n log n) für das Sortieren der Punkte.<br />
Die while-Schleife des Algorithmus wird O(n)-mal durchlaufen, da jeder<br />
Punkt höchstens einmal in die Vertikalstruktur aufgenommen und<br />
höchstens einmal daraus entfernt wird. Sowohl das Entfernen aus der<br />
Vertikalstruktur als auch das Einfügen in diese erfordern O(log n) Zeit.<br />
Da nach obigen Überlegungen auch Schritt 12 des Algorithmus in logarithmischer<br />
Zeit zu bewerkstelligen ist, erhält man einen Zeitbedarf<br />
von O(log n) für einen Schleifendurchlauf.<br />
Insgesamt erhalten wir also eine Gesamtlaufzeit von O(n log n) für Algorithmus<br />
5.1.<br />
Die Optimalität folgt dann aus einer unteren Schranke von Ω(n log n)
5.2 Schnitt konvexer Polygone 51<br />
für das Problem des dichtesten Paares (selbst im eindimensionalen Fall).<br />
Auf den Beweis dieser Schranke wollen wir hier verzichten; er ähnelt<br />
jedoch dem Beweis von Satz 2.39 auf Seite 20 für die untere Schranke<br />
von O(n log n) für das Sortierproblem.<br />
Der Speicherbedarf der Horizontal- und der Vertikalstruktur ist dabei<br />
jeweils linear in der Zahl der gespeicherten Punkte und somit, da jeweils<br />
maximal O(n) Punkte darin enthalten sind, aus Θ(n). ✷<br />
5.2 Schnitt konvexer Polygone<br />
Gegeben zwei Polygone P = (p1, . . . , pm) und Q = (q1, . . . , qn), dann<br />
interessiert uns zum einen, ob die beiden Polygone sich schneiden, und<br />
zum anderen eine Beschreibung der Schnittmenge. Offensichtlich gilt:<br />
Beobachtung 5.2 Der Schnitt zweier beliebiger Polygone P =<br />
(p1, . . . , pm) und Q = (q1, . . . , qn) kann im Worst case aus Ω(mn) Polygonen<br />
bestehen und somit eine Gesamtkomplexität von Ω(mn)<br />
besitzen.<br />
Der Schnitt zweier konvexer Polygone P = (p1, . . . , pm) und Q =<br />
(q1, . . . , qn) ist entweder leer, niederdimensional (d. h. ein Punkt oder<br />
eine Strecke) oder ein konvexes Polygon der Komplexität O(m + n).<br />
(Dies folgt sofort aus Bemerkung 4.6 (4) auf Seite 35.) Im Worst case kann<br />
diese Schranke auch angenommen werden, z. B. beim Schnitt zweier regelmäßiger<br />
n-Ecke, die um den Winkel π<br />
n gegeneinander verdreht sind.<br />
Da also der Schnitt konvexer Polygone – schon strukturell – beträchtlich<br />
einfacher ist, beschränken wir uns in diesem Abschnitt zunächst auf die<br />
Schnittbestimmung konvexer Polygone – wiederum mittels eines Planesweep-Verfahrens.<br />
Die Grundidee hierbei ist, die Ebene in eine Menge vertikaler Streifen<br />
zu zerlegen und die Streifen von links nach rechts zu bearbeiten. Jede<br />
Ecke eines der beiden Polygone induziert dabei eine vertikale Gerade<br />
und die Menge aller auf diese Weise entstehenden Geraden unterteilt<br />
die Ebene in O(n + m) Streifen. Innerhalb eines Streifens Si kann dann<br />
der Schnitt (P ∩ Si) ∩ (Q ∩ Si) sehr einfach berechnet werden, da jedes<br />
„Bruchstück“ P ∩ Si bzw. Q ∩ Si maximal vier Ecken besitzt.<br />
Horizontalstruktur Die Liste der Halteereignisse für die Sweep line besteht<br />
genau aus der Menge aller Polygonecken von P und Q – sortiert<br />
bez. ihrer x-Koordinate.<br />
Um diese Liste zu erzeugen, müssen wir die Polygonecken nicht<br />
explizit sortieren, sondern können uns wieder zunutze machen, daß<br />
die Polygone in Eckendarstellung (also bereits angular sortiert) gegeben<br />
sind. Denn unabhängig von der Wahl der Anfangsecke p1<br />
eines konvexen Polygons P = (p1, . . . , pm), besteht die Folge<br />
der x-Koordinaten p1.x, . . . , pm.x aus maximal drei x-monotonen<br />
im Worst case Ω(mn)<br />
Schnittpolygone<br />
im Worst case Ω(m + n)<br />
Schnittpolygone
52 Das Plane-sweep-Paradigma<br />
p1<br />
linearer Zeitbedarf für<br />
Schnitt konvexer Polygone<br />
Teilfolgen. Diese können (zusammen mit den maximal drei Teilfolgen<br />
des Polygons Q) mittels Mergesort in linearer Zeit zu einer<br />
sortierten Folge verschmolzen werden.<br />
Vertikalstruktur Während die Sweep line die Haltepunkte der Horizontalstruktur<br />
von links nach rechts abarbeitet, müssen wir uns<br />
in der Vertikalstruktur lediglich für jedes der beiden Polygone P<br />
und Q die zwei aktiven Kanten merken, die momentan von der<br />
Sweep line geschnitten werden. Die Aktualisierung dieser Kanten<br />
von einem Streifen zum nächsten entspricht gerade einem Durchlauf<br />
der Kantenfolgen – entweder im oder gegen den Uhrzeigersinn,<br />
je nachdem, ob die Kante das Polygon von oben oder von<br />
unten begrenzt.<br />
Sweep line An jedem Haltepunkt der Sweep line bestimmen wir die<br />
Schnittmenge (P ∩ Si) ∩ (Q ∩ Si) im aktuellen Streifen Si mit Hilfe<br />
der momentan aktiven Kanten der beiden Polygone. Da die<br />
„Bruchstücke“ nur Trapeze oder Dreiecke sein können, erfordert<br />
dies nur einen konstanten Zeitbedarf. Im Falle eines Schnitts im<br />
aktuellen Streifen müssen wir nur noch dafür sorgen, daß die Gesamtschnittmenge<br />
entsprechend aktualisiert wird.<br />
Zusammenfassend erhalten wir dann den folgenden Satz:<br />
Satz 5.3 Der Schnitt zweier konvexer Polygone P = (p1, . . . , pm)<br />
und Q = (q1, . . . qn) kann mit einem optimalen Zeitbedarf von Θ(m+n)<br />
ermittelt werden, wobei im Falle eines (zweidimensionalen) Schnitts ein<br />
Polygon in Ecken- oder Kantendarstellung zurückgeliefert wird. Der<br />
Speicherbedarf ist dabei aus Θ(m + n).<br />
Beweis: Die Initialisierung der Horizontalstruktur hat – wie oben beschrieben<br />
– einen Zeitbedarf von O(m + n). Jedes der m + n Halteereignisse<br />
der Sweep line kann in konstanter Zeit bearbeitet werden und ein<br />
eventuelles Postprocessing (z. B. zum Erzeugen der Eckenfolge) erfordert<br />
auch nur lineare Zeit.<br />
Die Optimalität, d. h. eine untere Schranke von O(m + n), folgt aus dem<br />
eingangs erwähnten Beispiel der beiden n-Ecke. Der lineare Speicherbedarf<br />
folgt wieder aus den Eigenschaften der verwendeten Datenstrukturen.<br />
✷<br />
5.3 Anwendung »Schnitt von Halbebenen«<br />
Den zeitoptimalen Algorithmus aus dem letzten Abschnitt zur Schnittberechnung<br />
zweier konvexer Polygone können wir (leicht modifiziert)<br />
auch dazu verwenden, für n Halbebenen H +<br />
1 , . . . , H+ n im E2 deren<br />
Schnittmenge<br />
P = H +<br />
1 ∩ · · · ∩ H+ n
5.3 Anwendung »Schnitt von Halbebenen« 53<br />
zu bestimmen.<br />
Hierzu erweitern wir zunächst den Polygonbegriff, um auch unbeschränkte,<br />
geradlinig begrenzte Gebiete beschreiben zu können:<br />
Definition 5.4 (Unbeschränktes Polygon)<br />
Sei eine einfache polygonale Kette w = [p2 p3], . . . , [pn−2 pn−1] ⊂ E 2<br />
gegeben (wobei auch die „leere Kette“ zugelassen ist), sowie zwei sich<br />
nicht schneidende Halbstrahlen {p1 p2] und [pn−1 pn}, so daß w weder<br />
von {p1 p2] noch von [pn−1 pn} geschnitten wird.<br />
Dann nennt man dasjenige von<br />
{p1 p2], [p2 p3], . . . , [pn−2 pn−1], [pn−1 pn}<br />
berandete Gebiet (inklusive seines Randes), welches links von [p2 p3]<br />
liegt, ein (einfaches) unbeschränktes Polygon, i. Z.<br />
P = ({p1 p2], p2, . . . , pn−1, [pn−1 pn}) .<br />
Die Begriffe »Knickwinkel«, »konvex«, »sternförmig« usw., sowie viele<br />
der im letzten Kapitel gezeigten Eigenschaften können jetzt auch auf den<br />
Fall unbeschränkter Polygone übertragen werden.<br />
Somit ist es ist nicht schwer, den Algorithmus zum Schnitt konvexer Polygone<br />
aus Abschnitt 5.2 so zu verallgemeinern, daß sowohl (konvexe)<br />
beschränkte Polygone P und Q als auch unbeschränkte Polygone<br />
P = ({p1 p2], p2, . . . , pm−1, [pm−1 pm}) und<br />
Q = ({q1 q2], q2, . . . , qn−1, [qn−1 qn})<br />
verarbeitet werden können. Ein konvexes unbeschränktes Polygon P<br />
kann nämlich immer als Vereinigung eines konvexen beschränkten<br />
Polygons Pb und eines konvexen unbeschränkten Polygons Pu der<br />
Form {p1 p2], [p2 p3], [p3 p4} geschrieben werden.<br />
Dann gilt offensichtlich<br />
P ∩ Q = (Pb ∩ Qb) ∪ (Pb ∩ Qu) ∪ (Pu ∩ Qb) ∪ (Pu ∩ Qu)<br />
und wir können die Teilprobleme separat lösen, nämlich<br />
• die erste Schnittmenge mittels des Algorithmus aus Abschnitt 5.2<br />
mit einem Zeitbedarf O(m + n),<br />
• die zweite und dritte Schnittmenge durch Schnitt eines Polygons<br />
der Komplexität O(m) bzw. O(n) mit drei Halbebenen mit einem<br />
Zeitbedarf von O(m) bzw. O(n),<br />
• die letzte Schnittmenge durch Schnitt von sechs Halbebenen in<br />
konstanter Zeit.<br />
Wir erhalten also das folgende Korollar zu Satz 5.3:<br />
p1<br />
p2<br />
pn−1<br />
pn<br />
p3<br />
unbeschränktes Polygon<br />
Pu<br />
Pb
54 Das Plane-sweep-Paradigma<br />
linearer Zeitbedarf für<br />
Schnitt konvexer<br />
unbeschränkter Polygone<br />
Divide-and-conquer-Ansatz<br />
Zeitbedarf von Θ(n log n)<br />
für den Halbebenenschnitt<br />
untere Schranke mittels<br />
Reduktion des<br />
Sortierproblems<br />
Korollar 5.5 Der Schnitt zweier konvexer unbeschränkter Polygone<br />
P = ({p1 p2], p2, . . . , pm−1, [pm−1 pm}) und<br />
Q = ({q1 q2], q2, . . . , qn−1, [qn−1 qn})<br />
kann mit einem optimalen Zeitbedarf von Θ(m+n) sowie Θ(m+n) Speicher<br />
ermittelt werden.<br />
Zum Lösen des eigentlichen Problems, den Schnitt von n Halbebenen<br />
zu bestimmen, führen wir dieses zurück auf die Schnittbestimmung für<br />
konvexe unbeschränkte Polygone. Denn der Schnitt einer Menge von<br />
Halbebenen ist entweder leer, niederdimensional (d. h. Punkt, Gerade,<br />
Halbstrahl oder Segment), ein beschränktes oder ein unbeschränktes<br />
konvexes Polygon.<br />
Wir können also jetzt mittels eines Divide-and-conquer-Ansatzes die Menge<br />
der n Halbebenen in zwei ungefähr gleichmächtige Mengen<br />
H +<br />
1 , . . . H+<br />
⌊n/2⌋<br />
und H+<br />
⌊n/2⌋+1 , . . . , H+ n<br />
zerlegen, deren Schnittmengen (rekursiv) berechnen und dann (sofern<br />
beide Mengen nicht leer oder niederdimensional sind) deren gemeinsamen<br />
Schnitt nach Korollar 5.5 in linearer Zeit berechnen.<br />
Für den Gesamtzeitbedarf t(n) erhalten wir dann die Rekursionsgleichung<br />
t(n) = 2 · t(n/2) + O(n) ,<br />
die zu t(n) ∈ O(n log n) führt. Wir fassen dies in folgendem Satz zusammen:<br />
Satz 5.6 Der Schnitt von n beliebigen Halbebenen im E 2 kann mit einem<br />
optimalen Zeitbedarf von Θ(n log n) und O(n) Speicher bestimmt<br />
werden.<br />
Beweis: Wir müssen nur noch die (asymptotische) Worst-case-Optimalität<br />
zeigen. Hierzu reduzieren wir wieder – ähnlich wie im Beweis zu<br />
Satz 4.19 auf Seite 43 – das Sortierproblem auf unser Problem: Aus ei-<br />
ner Menge von n Zahlen, x1, . . . , xn ∈ R, erzeugen wir eine Menge von<br />
n Halbebenen, H +<br />
1 , . . . , H+ n, so daß für xi<br />
1. die zugehörige Begrenzungsgerade durch den Punkt (xi, x2 i ) verläuft,<br />
2. die Begrenzungsgerade eine Tangente an die Funktion x ↦→ x 2 ist,<br />
3. die Funktion x ↦→ x 2 in der positiven Halbebene H +<br />
i verläuft.<br />
Ein Durchlaufen der Schnittmenge dieser Halbebenen liefert uns dann<br />
wieder eine Sortierung der Zahlen x1, . . . , xn. ✷
5.4 Schnitt von Liniensegmenten 55<br />
Bemerkung 5.7 Die untere Schranke des obigen Satzes ist kein Widerspruch<br />
zu Satz 4.18 auf Seite 42 (über die Bestimmung eines Kernpunktes<br />
in linearer Zeit), denn bei der Bestimmung des Kerns eines Polygons<br />
besitzt man mehr Information als hier in unserem Fall – nämlich die<br />
Durchlaufordnung des Polygons.<br />
Deshalb kann man den Kern eines Polygons, der sich ja auch als Schnitt<br />
von Halbebenen darstellen läßt, in linearer Zeit ermitteln, obwohl im<br />
allgemeinen Fall beliebiger Halbebenen ein Zeitbedarf von Ω(n log n)<br />
erforderlich ist. ⊳<br />
Bemerkung 5.8 Aus obigem Satz folgt sofort, daß jedes lineare Programm<br />
1 im R 2 mit n Restriktionen mit einem Zeitbedarf von O(n log n)<br />
gelöst werden kann.<br />
Allerdings ist es bei einem linearen Programm im R 2 gar nicht nötig, alle<br />
berandenden Strecken des erlaubten Bereiches zu kennen, um dieses zu<br />
lösen! Megiddo [16] und Dyer [7] haben bereits 1983 bzw. 1984 gezeigt,<br />
daß lineare Programme im R 2 und im R 3 in linearer Zeit gelöst werden<br />
können. ⊳<br />
5.4 Schnitt von Liniensegmenten<br />
Gegeben n Liniensegmente s1 = [p1 q1], . . . , sn = [pn qn] ⊂ E 2 , dann<br />
interessieren wir uns für die folgenden zwei Probleme:<br />
1. Schneiden sich (mindestens) zwei der n Segmente?<br />
2. Bestimme alle Schnittpunkte der n Segmente.<br />
Offenbar lassen sich beide Probleme wieder mittels eines naiven Algorithmus<br />
lösen, der schlicht alle Θ(n 2 ) Paare von Segmenten auf Schnitt<br />
testet und ggf. deren Schnittpunkt ausgibt. Außerdem ist auch klar, daß<br />
im Worst case tatsächlich Θ(n 2 ) Schnittpunkte existieren können, z. B.<br />
beim Schnitt von n horizontalen mit n vertikalen Segmenten.<br />
Oft wird diese maximal möglich Schnittpunktzahl jedoch gar nicht erreicht;<br />
der naive Algorithmus besitzt jedoch trotzdem in jedem Fall eine<br />
quadratische Laufzeit. Deshalb ist es sinnvoll, zur Beurteilung eines<br />
Algorithmus, dessen Laufzeit nicht nur in Abhängigkeit der Eingabegröße<br />
n, sondern auch in Abhängigkeit der Größe der Ausgabe k (bei unserem<br />
zweiten Problem von oben also die Anzahl der Schnittpunkte) anzugeben.<br />
Von einem „guten“ Algorithmus erwarten wir dann, daß er nur<br />
dann eine hohe Laufzeit besitzt, wenn die Ausgabe ebenfalls umfangreich<br />
ist.<br />
linearer Zeitbedarf für<br />
lineare Programme im R 2/3<br />
im Worst case Θ(n 2 )<br />
Schnittpunkte<br />
Einen Algorithmus, dessen Laufzeit nicht nur von der Größe der Eingabe<br />
n sondern auch von der Größe der Ausgabe k abhängt, nennen<br />
wir output-sensitiv. Der naive Algorithmus von oben ist offenbar nicht output-sensitiv<br />
1 Ein lineares Programm ist ein System von (linearen) Restriktionen Ax ≤ b, die die<br />
erlaubten Werte für x einschränken, und einer Zielfunktion c T x, die minimiert werden<br />
soll.
56 Das Plane-sweep-Paradigma<br />
Abbildung 5.1<br />
Die Sweep line definiert<br />
eine Ordnung auf den<br />
Segmenten<br />
zunächst keine Sonderfälle<br />
y<br />
x1<br />
s2<br />
s4<br />
s5<br />
output-sensitiv, denn er benötigt immer Θ(n 2 ) Zeit – unabhängig von k.<br />
Mittels einer Reduktion des ε-closeness-Problems auf das Segmentschnittproblem<br />
können wir die folgenden unteren Schranken angeben:<br />
Lemma 5.9 Für n Liniensegmente im E 2 hat der Test, ob sich (mindestens)<br />
zwei Segmente schneiden, die Zeitkomplexität Ω(n log n). Alle<br />
k Schnittpunkte zu bestimmen hat die Zeitkomplexität Ω(n log n + k).<br />
Ein Beweis findet sich z. B. in [14, S. 65].<br />
Im folgenden wollen wir jetzt also für die beiden obigen Probleme output-sensitive<br />
Plane-sweep-Algorithmen angeben (basierend auf den Arbeiten<br />
von Bentley und Ottmann [2] aus dem Jahre 1979), die für k ∈<br />
o(n 2 ) eine geringere Laufzeit haben als der naive Ansatz. Um die Überlegungen<br />
etwas zu vereinfachen, nehmen wir dabei an, daß sich nie<br />
mehr als zwei Segmente im selben Punkt schneiden und daß sich keine<br />
zwei Segmente überlappen.<br />
5.4.1 Schnittest<br />
Wir lassen die Sweep line wieder – wie üblich – von links nach rechts<br />
über die Liniensegmente wandern. An jeder Stelle definiert dann die<br />
Sweep line auf den Segmenten, die sie schneidet, eine Ordnung gemäß<br />
den y-Koordinaten der Schnittpunkte. Beispielsweise ist in Abbildung<br />
5.1 an der Stelle x1 die Ordnung s4 < s2 < s5.<br />
Für zwei Segmente, die sich in einem Punkt (x, y) schneiden, gilt offensichtlich:<br />
x2<br />
s6<br />
s1<br />
s7<br />
s3<br />
x
5.4 Schnitt von Liniensegmenten 57<br />
Beobachtung 5.10 Besitzen (genau) zwei Segmente in einem<br />
Punkt (x, y) einen (echten) Schnittpunkt, dann gibt es immer eine<br />
Stelle x − ε, an der sie in der durch die Sweep line definierten Ordnung<br />
direkte Nachbarn sind. An der Stelle x kehrt sich ihre Ordnung dann<br />
um.<br />
In Abbildung 5.1 auf der vorherigen Seite trifft dies z. B. auf die beiden<br />
Segmente s4 und s5 zu, für die unmittelbar links der Stelle x2 die Beziehung<br />
s4 < s5 und unmittelbar rechts von x2 die Beziehung s5 < s4 gilt.<br />
Um alle (echten) Schnittpunkte zu finden, genügt es also, an allen Stellen,<br />
an denen sich die durch die Sweep line definierte Ordnung ändert,<br />
jeweils die neu benachbarten Segmente auf Schnitt zu testen. Dies ist die<br />
grobe Idee unseres Algorithmus.<br />
Vertikalstruktur Um jeweils benachbarte Segmente auf einen gemeinsamen<br />
Schnittpunkt testen zu können, speichern wir in der Vertikalstruktur<br />
jeweils die Ordnung der momentan von der Sweep<br />
line geschnittenen Segmente.<br />
Idee: Testen direkter<br />
Nachbarn<br />
Die Haltepunkte der Sweep line sind dann all diejenigen Stellen,<br />
an denen sich die Ordnung ändert, nämlich die x-Koordinaten der<br />
folgenden Ereignisse: Drei Halteereignisse<br />
1. Die Sweep line stößt auf den linken Endpunkt eines Liniensegments,<br />
d. h. dieses Segment muß mit in die Vertikalstruktur<br />
aufgenommen werden.<br />
2. Die Sweep line stößt auf den rechten Endpunkt eines Liniensegments,<br />
d. h. dieses Segment muß aus der Vertikalstruktur<br />
entfernt werden.<br />
3. Die Sweep line erreicht einen (echten) Schnittpunkt zweier<br />
Segmente, an dem sich deren Ordnung umkehrt.<br />
Das dritte Ereignis – das Erreichen eines Schnittpunkts – können<br />
wir hier außer Acht lassen, da wir ja nur nach dem ersten Schnittpunkt<br />
suchen und den Algorithmus sofort beenden können, wenn<br />
wir ihn gefunden haben. D. h., ein Ereignis des dritten Typs werden<br />
wir nie erreichen, da der Schnittpunkt schon (spätestens) beim<br />
letzten Halt der Sweep line entdeckt worden sein muß.<br />
Horizontalstruktur Um die Ereignisse, an denen wir die Vertikalstruktur<br />
aktualisieren müssen, in der richtigen Reihenfolge abzuarbeiten,<br />
genügt es wieder, die Endpunkte pi, qi aller Segmente nach<br />
ihren x-Koordinaten zu sortieren.<br />
Die Vertikalstruktur können wir wieder als balancierten Baum implementieren,<br />
wobei beim „Vergleich“ zweier Segmente bez. ihrer<br />
von der Sweep line definierten Ordnung natürlich immer die aktuelle<br />
x-Koordinate der Sweep line mitherangezogen werden muß. Für die Horizontalstruktur<br />
genügt wieder eine sortierte Liste der Endpunkte. Damit<br />
jedoch auch senkrechte Liniensegmente und Segmente, die sich in<br />
Endpunkten schneiden, richtig verarbeitet werden, müssen wir die Sortierreihenfolge<br />
etwas modifizieren:<br />
Modifizierte<br />
Sortierreihenfolge
58 Das Plane-sweep-Paradigma<br />
Zeitbedarf von Θ(n log n)<br />
für den Segmentschnittest<br />
Halteereignisse zur<br />
Laufzeit<br />
Erstes Sortierkriterium ist die x-Koordinate des betreffenden Punktes.<br />
Zweites Sortierkriterium (bei Gleichheit der x-Koordinaten) ist der Typ<br />
des Ereignisses: Einfügeereignisse (also linke Endpunkte) sollen<br />
vor Löschereignissen (also rechten Endpunkten) behandelt werden.<br />
Drittes Sortierkriterium (bei Gleichheit der beiden ersten Kriterien) ist<br />
die y-Koordinate des Punktes. Die Punkte sollen dann nach aufsteigenden<br />
y-Koordinaten sortiert werden.<br />
Beim Einfügen von Punkten mit gleicher x- und y-Koordinate (wie z. B. die<br />
Segmente s3 und s6 in Abbildung 5.1 auf Seite 56) muß zusätzlich noch<br />
die Ordnung direkt rechts der Sweep line (also die angulare Ordnung der<br />
Segmente) als viertes Kriterium herangezogen werden.<br />
Bemerkung 5.11 Das dritte Sortierkriterium – also das Hinzuziehen der<br />
y-Koordinate bei Gleichheit – ist ein oft verwendetes Hilfmittel um Sonderfälle<br />
wie z. B. senkrechte Segmente, o. ä. zu behandeln. Diese Vorgehensweise<br />
entspricht anschaulich einem infinitesimalen Kippen der<br />
Sweep line und hat zur Folge, daß keine zwei verschiedenen Punkte zur<br />
selben Zeit von der Sweep line getroffen werden können. ⊳<br />
Die oben beschriebene Vorgehensweise wurde in Algorithmus 5.2 auf<br />
der folgenden Seite umgesetzt und wir erhalten den folgenden Satz:<br />
Satz 5.12 Man kann in optimaler Zeit Θ(n log n) und Θ(n) Speicher<br />
n Liniensegmente in der Ebene auf Schnitt testen.<br />
Beweis: Der Initialisierungsschritt kostet uns wieder O(n log n) Zeit.<br />
Die while-Schleife wird maximal 2n-mal durchlaufen und jeder Durchlauf<br />
hat einen Zeitbedarf von O(log n). Zusammen mit der unteren<br />
Schranke aus Lemma 5.9 auf Seite 56 folgt dann der Zeitbedarf<br />
von Θ(n log n). ✷<br />
5.4.2 Bestimmen aller Schnittpunkte<br />
Alle Schnittpunkte zu bestimmen ist ein schwierigeres Problem als nur<br />
zu testen, ob mindestens ein Schnitt existiert. Denn jetzt müssen wir<br />
auch das im letzten Abschnitt außer Acht gelassene dritte Halteereignis<br />
auf der vorherigen Seite – das Erreichen des Schnittpunkts zweier Segmente<br />
– berücksichtigen, damit die Vertikalstruktur korrekt aktualisiert<br />
wird. Diese Ereignisse entstehen aber erst während der Algorithmus bereits<br />
ausgeführt wird und sind zu Beginn noch gar nicht bekannt.<br />
Aus diesem Grund müssen wir immer, wenn wir einen Schnittpunkt<br />
gefunden haben, diesen als zusätzliches Halteereignis in unsere Horizontalstruktur<br />
einsortieren und, wenn wir dann auf ein solches Ereignis<br />
treffen, geeignet bearbeiten. Eine sortierte Liste der x-Koordinaten reicht<br />
deshalb nun (aus Effizienzgründen) als Horizontalstruktur nicht mehr<br />
aus.
5.4 Schnitt von Liniensegmenten 59<br />
Algorithmus 5.2 Schnittest für Liniensegmente<br />
TESTINTERSECTION(s1, . . . , sn)<br />
Input: n Liniensegmente s1 = [p1 q1], . . . , sn = [pn qn] ⊂ E 2<br />
{Initialisierungsschritt}<br />
1 Sortiere die Punkte p1, q1, . . . , pn, qn gemäß den vier Sortierkriterien<br />
und füge sie in die Liste HS ein<br />
2 VS ← leerer AVL-Baum<br />
3 schnitt ← false<br />
{Sweep}<br />
4 while HS �= ∅ ∧ ¬schnitt do<br />
5 Punkt ← NächsterPunkt(HS)<br />
6 if Punkt = linker Endpunkt (von Segment s) then<br />
7 Füge s in VS ein<br />
8 Vorg ← der Vorgänger von s in VS<br />
9 Nachf ← der Nachfolger von s in VS<br />
10 if (s schneidet Vorg) ∨ (s schneidet Nachf) then<br />
11 schnitt ← true<br />
12 end if<br />
13 else if Punkt = rechter Endpunkt (von Segment s) then<br />
14 Vorg ← der Vorgänger von s in VS<br />
15 Nachf ← der Nachfolger von s in VS<br />
16 if Vorg schneidet Nachf then<br />
17 schnitt ← true<br />
18 end if<br />
19 Entferne s aus VS<br />
20 end if<br />
21 end while<br />
Output: Es gibt genau dann (mindestens) einen Schnittpunkt,<br />
wenn schnitt gleich true ist<br />
Wir verwenden stattdessen als Horizontalstruktur eine Prioritätswarteschlange<br />
(engl. priority queue), z. B. einen Fibonacci heap, der u. a. das<br />
Einfügen eines Elements und das Ermitteln und Entfernen des minimalen<br />
Elements in O(log n) Zeit bewerkstelligt und das Reduzieren eines<br />
Schlüsselwerts sogar mit konstantem Zeitbedarf. In unserem speziellen<br />
Fall wird diese letzte Eigenschaft allerdings gar nicht benötigt und wir<br />
können auch einen AVL-Baum zur Verwaltung der Horizontalstruktur<br />
verwenden.<br />
Außerdem müssen wir noch folgende Punkte berücksichtigen:<br />
• Es kann passieren, daß ein Schnittpunkt mehrere Male entdeckt<br />
wird. Trotzdem darf er natürlich nur einmal in die Horizontalstruktur<br />
eingefügt werden.<br />
Es kann sogar passieren, daß ein Schnittpunkt entdeckt wird, nachdem<br />
ihn die Sweep line schon passiert hat. Zum Beispiel wird in<br />
Abbildung 5.1 auf Seite 56 der Schnittpunkt zwischen den Segmenten<br />
s4 und s5 erneut entdeckt, wenn der rechte Endpunkt<br />
priority queue als<br />
Horizontalstruktur
60 Das Plane-sweep-Paradigma<br />
Zeitbedarf von<br />
O((n + k) log n) für die<br />
Schnittpunktbestimmung<br />
von s7 abgearbeitet wird. In so einem Fall – wenn also der Schnittpunkt<br />
links der aktuellen Sweep line liegt – darf der Punkt überhaupt<br />
nicht mehr in die Horizontalstruktur eingefügt werden.<br />
• Bei dem zweiten Sortierkriterium auf Seite 58 erhalten wir einen<br />
weiteren Ereignistyp (»Schnittpunktereignis«), der nach den Einfügeereignissen<br />
und vor den Löschereignissen abgearbeitet werden<br />
muß.<br />
Unter Beachtung der oben aufgeführten Besonderheiten kann Algorithmus<br />
5.2 nun daraufhin angepaßt werden, alle Schnittpunkte zu finden.<br />
Hierzu müssen im wesentlichen die folgenden Punkte geändert werden:<br />
• Die Horizontalstruktur wird durch eine Prioritätswarteschlange<br />
ersetzt.<br />
• Die Variable schnitt fällt weg, da jetzt immer die ganze Ebene abgearbeitet<br />
wird.<br />
• Es kommt ein neues Schnittpunktereignis hinzu, an dem<br />
– die Koordinaten des Schnittpunktes ausgegeben werden,<br />
– die beiden beteiligten Segmente ihre Ordnung tauschen,<br />
– das neue untere Segment mit seinem Vorgänger und das neue<br />
obere Segment mit seinem Nachfolger in der Vertikalstruktur<br />
auf Schnitt getestet wird.<br />
Somit erhalten wir den folgenden Satz für unseren output-sensitiven<br />
Plane-sweep-Algorithmus:<br />
Satz 5.13 Die k Schnittpunkte von n Liniensegmenten in der Ebene können<br />
mit einem Zeitaufwand von O((n + k) log n) und einem Speicherbedarf<br />
von O(n + k) bestimmt werden.<br />
Beweis: Insgesamt gibt es O(n+k) Haltepunkte für die Sweep line, d. h.<br />
die while-Schleife wird O(n + k)-mal durchlaufen. Da keines der Ereignisse<br />
mehrfach in der Horizontalstruktur gespeichert wird, kann jeder<br />
Zugriff darauf in O(log(n + k)) = O(log(n 2 )) = O(log n) Zeit erfolgen.<br />
Außerdem erfordert jeder Zugriff auf die Vertikalstruktur ebenfalls nur<br />
logarithmischen Aufwand.<br />
Insgesamt erhalten wir also einen Zeitbedarf von O((n + k) log n)<br />
und einen Speicherbedarf (hauptsächlich für die Horizontalstruktur)<br />
von O(n + k). ✷<br />
Die etwas grobe Analyse des Speicherbedarfs von O(n+k) ist hierbei ein<br />
bißchen unbefriedigend, da k ja bekanntermaßen aus Ω(n 2 ) sein kann.<br />
Mit einer feineren Analyse kann man zeigen [20], daß die Größe der Horizontalstruktur<br />
(und damit der Gesamtspeicherbedarf) tatsächlich nur<br />
aus O(n(log n) 2 ) ist. Auf der anderen Seite kann man aber auch Worstcase-Beispiele<br />
angeben [20], für die an mindestens einer Position der
5.5 Anwendung »Test auf Einfachheit« 61<br />
Sweep line die Größe der Horizontalstruktur aus Ω(n log n) ist (siehe<br />
z. B. auch [14, S. 72]).<br />
Mittels eines einfachen Tricks läßt sich allerdings der Speicherbedarf sogar<br />
auf O(n) drücken: Wir merken uns in der Horizontalstruktur nur Trick zur Speicherersparnis<br />
Schnittpunkte von solchen Segmenten, die auch aktuell benachbart sind,<br />
alle anderen entfernen wir wieder aus der Horizontalstruktur, sobald<br />
die beteiligten Segmente nicht mehr benachbart sind. Denn aufgrund<br />
der Beobachtung 5.10 auf Seite 57 wissen wir, daß bevor sich die Segmente<br />
schneiden, diese wieder benachbart sein müssen.<br />
Beispielsweise würden wir in Abbildung 5.1 auf Seite 56, wenn wir den<br />
linken Endpunkt von Segment s2 bearbeiten, den Schnittpunkt von s4<br />
und s5 wieder aus der Horizontalstruktur löschen und erst bei Erreichen<br />
des rechten Endpunkts von s2 wieder einfügen. Auf diese Weise<br />
bleibt die Zahl der in der Horizontalstruktur gespeicherten Schnittpunktereignisse<br />
immer aus O(n) und wir erhalten folgende Verbesserung von<br />
Satz 5.13:<br />
Satz 5.14 Die k Schnittpunkte von n Liniensegmenten in der Ebene können<br />
mit einem Zeitaufwand von O((n + k) log n) und einem Speicherbedarf<br />
von O(n) bestimmt werden.<br />
Bemerkung 5.15 Die einzigen beiden Einschränkungen an die n Liniensegmente,<br />
die wir gemacht hatten, waren, daß sich nie mehr als zwei<br />
Segmente in demselben Punkt schneiden und daß sich keine zwei Segmente<br />
überlappen.<br />
Im ersten Fall würde dann nämlich Beobachtung 5.10 auf Seite 57 nicht<br />
mehr zutreffen. Durch eine etwas genauere Analyse dieser Problematik<br />
ist es jedoch trotzdem – ohne allzu großen Mehraufwand – möglich,<br />
auch solche Fälle zuzulassen. Dies wird beispielsweise in [5, S. 26] beschrieben.<br />
Auch die zweite Einschränkung – sich überlappende Segmente – kann<br />
durch eine verfeinerte Analyse und geeignete Fallunterscheidungen vermieden<br />
werden und stellt kein schwerwiegendes Problem dar. ⊳<br />
5.5 Anwendung »Test auf Einfachheit«<br />
Durch eine leichte Modifikation können wir Algorithmus 5.2 auf Seite 59<br />
dazu verwenden, die Einfachheit einer polygonalen Kette zu testen: Wir<br />
müssen nur dafür sorgen, daß beim Schnittest zweier Strecken, die sich<br />
in ihren Endpunkten berührenden adjazenten Kanten nicht berücksichtigt<br />
werden. Wir erhalten damit folgendes Korollar zu Satz 5.12 auf Seite<br />
58:<br />
Korollar 5.16 Eine aus n Segmenten bestehende polygonale Kette (in<br />
der Ebene) kann mit einem Zeitaufwand von O(n log n) auf ihre Einfachheit<br />
hin getestet werden.<br />
linearer Speicherbedarf zur<br />
Schnittpunktbestimmung<br />
Zeitbedarf von O(n log n)<br />
für den Test auf Einfachheit
62 Das Plane-sweep-Paradigma<br />
Abbildung 5.2<br />
Der Graph links ist ein<br />
PSLG, die beiden anderen<br />
nicht<br />
planar subdivision<br />
Planar straight line graph<br />
vertices, edges und faces<br />
5.6 Anwendung »Überlagerung von PSLGs«<br />
und »Arrangement-Berechnung«<br />
Planar straight line graphs können verwendet werden, um den Spezialfall<br />
einer Unterteilung der Ebene (engl. planar subdivision), bei dem Gebiete<br />
ausschließlich durch Liniensegmente begrenzt werden, zu modellieren<br />
und sind ein wichtiges Hilfsmittel in der <strong>Algorithmische</strong>n <strong>Geometrie</strong>.<br />
Definition 5.17 (Planar straight line graph)<br />
Eine kreuzungsfreie Realisierung (in die Ebene) eines ungerichteten zusammenhängenden<br />
Graphen G = (V, E, γ) heißt Planar straight line<br />
graph (kurz: PSLG), wenn<br />
1. jede Kante bei der geometrischen Realisierung auf ein Liniensegment<br />
abgebildet wird und<br />
2. jede Ecke v ∈ V einen Grad g(v) ≥ 2 besitzt.<br />
Abbildung 5.2 zeigt links einen PSLG, der mittlere Graph verletzt die<br />
PSLG-Eigenschaft, weil er nicht zusammenhängend ist und der rechte,<br />
weil er Knoten mit einem Grad kleiner als zwei besitzt.<br />
Die Knoten (oder Ecken) eines PSLGs werden in der englischsprachigen<br />
Literatur auch als vertices, die Kanten als edges und die Flächen als faces<br />
bezeichnet.<br />
Bemerkung 5.18 Manchmal verzichtet man zur Definition des PSLGs<br />
auch auf den Zusammenhang des Graphen oder auf die Forderung eines<br />
Eckengrades ≥ 2. Wir wollen uns aber auf diesen einfacheren Fall<br />
beschränken. ⊳<br />
Beobachtung 5.19 Ein PSLG zerlegt die Ebene in eine Menge aneinander<br />
grenzender Polygone, deren Vereinigung jedoch – wie Abbildung<br />
5.2 zeigt – im allgemeinen kein einfaches Polygon ergibt, weil die<br />
Polygone auch „über Eck“ benachbart sein können.<br />
Die folgende „Beobachtung“ ist eigentlich eine Folgerung aus der Eulerschen<br />
Formel, die wir allerdings erst in Kapitel 7 zeigen werden:
5.6 Anwendung »Überlagerung von PSLGs« und »Arrangement-Berechnung« 63<br />
e3<br />
v2<br />
v1<br />
e4<br />
f1<br />
e1<br />
v3<br />
e2<br />
f2<br />
v4<br />
Koord. IncEdge<br />
v1 (x1, y1) e3,2<br />
v2 (x2, y2) e4,1<br />
v3 (x3, y3) e4,2<br />
v4 (x4, y4) e2,1<br />
e3,1<br />
f1<br />
f2<br />
v2<br />
v1<br />
e3,2<br />
e1,2<br />
f1<br />
e4,1<br />
e4,2<br />
e1,1<br />
e2,2<br />
BoundEdge<br />
e2,2<br />
e1,1<br />
Origin Twin IncFace Prev Next<br />
e1,1 v1 e1,2 f2 e3,1 e2,1<br />
e1,2 v4 e1,1 f1 e2,2 e3,2<br />
e2,1 v4 e2,2 f2 e1,1 e4,2<br />
e2,2 v3 e2,1 f1 e4,1 e1,2<br />
e3,1 v2 e3,2 f2 e4,2 e1,1<br />
e3,2 v1 e3,1 f1 e1,2 e4,1<br />
e4,1 v2 e4,2 f1 e3,2 e2,2<br />
e4,2 v3 e4,1 f2 e2,1 e3,1<br />
v3<br />
f2<br />
v4<br />
e2,1<br />
Beobachtung 5.20 Sei n die Anzahl der Ecken eines PSLGs. Dann ist<br />
die Gesamtkomplexität des PSLGs, d. h. die Summe der Eckenzahlen,<br />
Kantenzahlen und Flächenzahlen, ebenfalls nur aus O(n).<br />
Abbildung 5.3<br />
Darstellung eines PSLGs<br />
als Doubly connected edge<br />
list<br />
Zur Repräsentation eines PSLGs verwenden wir die Doubly connected<br />
edge list (kurz: DCEL), die eine speicherplatzoptimale und auch zeit- Doubly connected edge list<br />
optimale Möglichkeit darstellt (z. B. beim Zugriff auf einzelne Kanten,<br />
Flächen usw.), einen PSLG zu speichern:<br />
Die Doubly connected edge list besteht aus drei Tabellen, je eine für die Tabellen für die Ecken,<br />
Kanten und Flächen<br />
Ecken, Kanten und Flächen des PSLGs. Zusätzlich kann in den Tabellen<br />
natürlich auch noch weitere (Nutz-)Information zu den Objekten<br />
abgespeichert werden, beispielsweise Namen für die Kanten oder die<br />
Flächen, z. B. wenn es sich bei dem PSLG um die Repräsentation einer<br />
Straßen- oder einer Landkarte handelt.<br />
Um aus dem PSLG eine Doubly connected edge list zu erzeugen, ersetzen<br />
wir zunächst jede Kante durch ein Paar entgegengesetzt gerichteter<br />
sog. Halbkanten (siehe hierzu Abbildung 5.3). Die beiden entgegengesetzt<br />
gerichteten Halbkanten, die wir aus einer Kante des PSLGs er-
64 Das Plane-sweep-Paradigma<br />
zeugen, nennen wir Zwillinge. Jetzt können wir die drei Tabellen für<br />
die Ecken, Flächen und Halbkanten des PSLGs definieren (siehe Abbildung<br />
5.3 auf der vorhergehenden Seite):<br />
Ecken Für jede Ecke v speichern wir ihre Koordinaten (x, y) und einen<br />
Zeiger auf eine beliebige Halbkante IncEdge(v), die in v startet.<br />
Flächen Für jede Fläche f speichern wir einen Zeiger auf eine beliebige<br />
Halbkante BoundEdge(f) auf dem Rand von f, so daß f links dieser<br />
Halbkante liegt.<br />
Halbkanten Für jede Halbkante e speichern wir einen Zeiger auf ihre<br />
Startecke Origin(e), einen Zeiger auf ihre Zwillingskante Twin(e)<br />
und einen Zeiger auf diejenige Fläche IncFace(e), die links von ihr<br />
liegt. Die Endecke der Halbkante müssen wir nicht speichern, da<br />
sie die Startecke der Zwillingskante ist.<br />
Zusätzlich speichern wir noch jeweils einen Zeiger auf die eindeutig<br />
bestimmte Halbkante Prev(e), die in der Startecke Origin(e)<br />
endet und ebenfalls die Fläche IncFace(e) berandet (die Vorgängerkante<br />
von e) und auf die Halbkante Next(e), die in der Endecke<br />
von e startet und ebenfalls IncFace(e) berandet (die Nachfolgerkante<br />
von e).<br />
Durch diese Art der Speicherung können wir auf effiziente Art und Weise<br />
(nämlich immer mit einer Zeitkomplexität, die linear in der Größe der<br />
Ausgabe ist)<br />
• zu einer Ecke alle inzidenten Kanten bestimmen,<br />
• zu einer Fläche alle berandenden Kanten ermitteln.<br />
In [5, S. 31] wird außerdem eine nur geringfügig kompliziertere DCEL<br />
beschrieben, mit der auch unzusammenhängende PSLGs mit Eckengraden<br />
≥ 1 (anstelle von 2) repräsentiert werden können.<br />
Den in Abschnitt 5.4.2 vorgestellten Algorithmus zum Bestimmen aller<br />
Schnittpunkte von n Liniensegmenten können wir nun zu einem Algorithmus<br />
modifizieren, der die Überlagerung zweier gegebener PSLGs<br />
berechnet. Hierzu wenden wir den Schnittalgorithmus auf die Menge<br />
der Liniensegmente in den beiden PSLGs an. Zusätzlich zur Bestimmung<br />
der Schnittpunkte bauen wir während des Sweeps eine neue<br />
DCEL auf, die jeweils den Schnitt-PSLG links der aktuellen Sweep line<br />
beschreibt. Wir beschränken uns dabei auf die Ecken- und Kantentabellen;<br />
das Erzeugen der Flächentabelle schieben wir zunächst auf.<br />
Zum Aufbau der DCEL gehen wir folgendermaßen vor: Wir kopieren<br />
vor Beginn des Sweeps die Ecken- und Kantentabellen der beiden<br />
Ausgangs-DCELs in jeweils eine gemeinsame neue Tabelle (die natürlich<br />
noch keine gültige DCEL darstellt) und modifizieren diese dann bei<br />
jedem Schnittpunktereignis (zwischen Kanten aus verschiedenen DCELs)<br />
in geeigneter Weise.
5.6 Anwendung »Überlagerung von PSLGs« und »Arrangement-Berechnung« 65<br />
Vereinfacht ausgedrückt müssen bei jedem solchen Ereignis die zwei beteiligten<br />
Kanten (bzw. die vier beteiligten Halbkanten) durch vier neue<br />
Kanten (bzw. durch acht neue Halbkanten) ersetzt werden (für Einzelheiten<br />
siehe [5, S. 33]). Insgesamt wird hierfür (größenordnungsmäßig)<br />
nicht mehr Zeit benötigt als für das Erzeugen der Schnittpunkte.<br />
Nachdem die Ecken- und Kantentabellen der neuen DCEL während des<br />
Sweeps korrekt erzeugt wurden, müssen nun noch die Flächentabelle<br />
sowie die korrekten IncFace-Einträge der Kantentabelle generiert werden.<br />
Wieder etwas vereinfacht ausgedrückt geschieht dies, indem wir<br />
die Halbkanten der neuen DCEL – beginnend bei einer beliebigen, noch<br />
nicht besuchten Halbkante – „kreisförmig“ durchlaufen, d. h. zu einer<br />
Halbkante immer ihren Nachfolger besuchen, bis wir irgendwann wieder<br />
bei derjenigen Halbkante ankommen, bei der wir gestartet sind. Ein<br />
Kreis gegen den Uhrzeigersinn entspricht dann einer der beschränkten<br />
Flächen, ein Kreis im Uhrzeigersinn der unbeschränkten Fläche. Der<br />
Zeitaufwand hierfür ist wieder von derselben Größenordnung wie die<br />
Komplexität der DCEL.<br />
Insgesamt erhalten wir dann folgendes Korollar zu Satz 5.14:<br />
Korollar 5.21 Die Überlagerung zweier PSLGs der Komplexitäten m<br />
und n kann mit einem Zeitaufwand von O((m + n + k) log(m + n))<br />
und einem Speicherbedarf von O(m + n + k) bestimmt werden, wobei k<br />
die Komplexität der Überlagerung darstellt.<br />
Da wir zu einem gegebenen Polygon P = (p1, . . . , pm) in linearer Zeit<br />
einen PSLG erzeugen können, der genau dieses Polygon repräsentiert,<br />
folgt hieraus sofort ein weiteres Korollar:<br />
Korollar 5.22 Für zwei Polygone P = (p1, . . . , pm) und Q =<br />
(q1, . . . , qn) kann mit einem Zeitaufwand von O((m+n+k) log(m+n))<br />
und einem Speicherbedarf von O(m+n+k) ein PSLG bestimmt werden,<br />
der den Schnitt der beiden Polygone repräsentiert. Hierbei stellt k die<br />
Komplexität des Schnitts dar.<br />
Außerdem können wir mit derselben Vorgehensweise für eine Menge<br />
von n Liniensegmenten nicht nur deren Schnittpunkte berechnen, sondern<br />
auch das sog. Arrangement der Segmente, d. h. denjenigen PSLG, Arrangement<br />
der die gesamte Menge sich schneidender Segmente repräsentiert:<br />
Korollar 5.23 Für eine Menge von n Liniensegmenten in der Ebene<br />
kann deren Arrangement mit einem Zeitbedarf von O((n + k) log n) bestimmt<br />
werden.<br />
O((m + n + k) log(m + n))<br />
Zeitbedarf für den Schnitt<br />
allgemeiner Polygone<br />
Zeitbedarf von<br />
O((n + k) log n) zur<br />
Arrangement-Berechnung
Konvexe Hüllen ebener<br />
Punktmengen<br />
Die konvexe Hülle einer Menge A ⊆ R d (siehe Definition 4.5 auf Seite<br />
34) ist uns ja schon im Abschnitt 1.2 bei den Problemen »Einzäunen<br />
von Apfelbäumen« und »Christos Reichstag« (für d = 2, 3) begegnet. In<br />
diesem Kapitel wollen wir den Spezialfall betrachten, die konvexe Hülle<br />
einer endlichen Punktmenge A in der Ebene zu bestimmen.<br />
Wie wir schon in Abschnitt 4.1 gesehen haben, ist die konvexe Hülle einer<br />
ebenen n-elementigen Punktmenge (die nicht alle auf einer Geraden<br />
liegen) ein konvexes Polygon mit maximal n Ecken. Um dieses Polygon<br />
soll es also im folgenden gehen.<br />
6.1 Eigenschaften und untere Schranke<br />
Offensichtlich scheint der Rand der konvexen Hülle CH(A) der kürzeste<br />
geschlossene Weg zu sein, der die Punktmenge A umschließt. Folgendes<br />
Lemma bringt dies zum Ausdruck:<br />
Lemma 6.1 Sei w ein einfacher, geschlossener Weg, der die konvexe<br />
Hülle CH(A) der endlichen Punktmenge A ⊂ E 2 umschließt, d. h.<br />
CH(A) liegt in dem von w induzierten beschränkten Gebiet (welches<br />
nach dem Jordanschen Kurvensatzes eindeutig bestimmt ist). Dann ist<br />
der Rand von CH(A) höchstens so lang wie der Weg w.<br />
Beweis: O. B. d. A. sei CH(A) ein konvexes Polygon mit mindestens drei<br />
Ecken, d. h. CH(A) = (p1, . . . , pn). Von jedem Punkt pi ziehen wir die<br />
Winkelhalbierende hi der beiden inzidenten Polygonkanten nach außen.<br />
Diese schneidet den umschließenden Weg w mindestens einmal<br />
(siehe Abbildung 6.1 auf der nächsten Seite). Wir durchlaufen nun w<br />
(von einem beliebigen Punkt aus startend) gegen den Uhrzeigersinn und<br />
bezeichnen den beim Durchlauf jeweils ersten Schnitt von w mit der Winkelhalbierenden<br />
hi mit wi.<br />
Aufgrund der Konvexität des Polygons CH(A) schließt die Winkelhalbierende<br />
hi mit den beiden zu pi inzidenten Kanten einen Winkel ≥<br />
6<br />
Rand von CH(A) ist der<br />
kürzeste Weg um A
68 Konvexe Hüllen ebener Punktmengen<br />
Abbildung 6.1<br />
Der Abstand |pi pi+1| ist<br />
immer kleiner oder gleich<br />
dem Abstand |wi wi+1|<br />
a<br />
w<br />
W<br />
w ′<br />
untere Schranke von<br />
Ω(n log n) für konv. Hülle<br />
b<br />
wi<br />
pi<br />
CH(A)<br />
p1<br />
w1<br />
pi+1<br />
pn<br />
wi+1<br />
π/2 ein. Somit ist für zwei aufeinanderfolgende Winkelhalbierende hi<br />
und hi+1 das Punktepaar (pi, pi+1) unter allen Paaren aus der Menge<br />
hi × hi+1 dasjenige mit dem kleinsten Abstand. Deshalb gilt<br />
|pi pi+1| ≤ |wi wi+1| ≤ |wi,i+1| ,<br />
wobei wi,i+1 den Teilweg von w zwischen den Punkten wi und wi+1<br />
bezeichnet. Insgesamt kann deshalb die Gesamtlänge von ∂CH(A) nicht<br />
größer als die Länge des Weges w sein. ✷<br />
Erst Lemma 6.1 rechtfertigt z. B. bei unserem Problem »Einzäunen von<br />
Apfelbäumen« die Verwendung der konvexen Hülle, um einen Zaun<br />
minimaler Länge zu erhalten.<br />
Obiges Lemma läßt sich sowohl auf nicht-einfache Wege w, die CH(A) in<br />
einer ihrer Schlingen enthalten, verallgemeinern als auch auf beliebige<br />
konvexe Mengen A anstelle von CH(A). Mittels dieser allgemeineren<br />
Aussage erhalten wir dann folgendes nützliches Korollar:<br />
Korollar 6.2 Ist w ein einfacher „konvexer“ Weg von a nach b, d. h. zusammen<br />
mit dem Segment [a b] umschließt w eine konvexe Menge W,<br />
und ist w ′ ein beliebiger anderer Weg von a nach b (auf derselben Seite<br />
von [a b] wie w und außerhalb von W ◦ ), dann ist w ′ mindestens so lang<br />
wie w.<br />
Um eine untere Schranke für die Laufzeit eines Algorithmus zur Bestimmung<br />
der konvexen Hülle zu erhalten, können wir wieder – exakt wie<br />
im Beweis zu Satz 4.19 auf Seite 43 – das Sortierproblem auf unser Problem<br />
reduzieren und erhalten dann folgenden Satz:<br />
Satz 6.3 Die Konstruktion der konvexen Hülle von n Punkten in der<br />
Ebene besitzt einen Zeitbedarf von Ω(n log n).<br />
wn
6.2 Inkrementelle Konstruktion 69<br />
In den folgenden Abschnitten werden wir verschiedene Algorithmen<br />
zur Bestimmung der konvexen Hülle vorstellen, einige davon mit einer<br />
optimalen Laufzeit von Θ(n log n), andere output-sensitiv, d. h. mit einer<br />
Laufzeit, die von der Eckenzahl der konvexen Hülle abhängt. Hierbei<br />
sei {p1, . . . , pn} mit n ≥ 3 jeweils die Punktmenge, deren konvexe<br />
Hülle bestimmt werden soll (o. B. d. A. sollen nicht alle Punkte auf einer<br />
Geraden liegen1 ), und (pi1 , . . . , pim ) mit m ≤ n das gesuchte Polygon.<br />
6.2 Inkrementelle Konstruktion<br />
Ein Verfahren zur Konstruktion einer Struktur für eine Menge von Objekten<br />
(hier: die konvexe Hülle einer Menge von Punkten) heißt inkrementell,<br />
wenn die Objekte eines nach dem anderen hinzugefügt werden inkrementelle Verfahren<br />
und dabei die Struktur jedesmal aktualisiert wird.<br />
Wir starten also mit der konvexen Hülle für die Punktmenge {p1, p2, p3}<br />
– also einem Dreieck – und fügen die restlichen Punkte einen nach<br />
dem anderen hinzu, wobei wir die konvexe Hülle jedesmal aktualisieren<br />
müssen. Für den neu hinzukommenden Punkt pi gibt es hierbei<br />
zwei Möglichkeiten:<br />
1. pi liegt innerhalb des Polygons CH({p1, . . . , pi−1}):<br />
In diesem Fall ist nichts zu tun, da sich die konvexe Hülle durch<br />
Hinzunahme des Punktes pi nicht ändert, und es gilt<br />
CH({p1, . . . , pi}) = CH({p1, . . . , pi−1}) .<br />
2. pi liegt außerhalb (oder auch auf dem Rand) des Polyg-<br />
ons CH({p1, . . . , pi−1}):<br />
In diesem Fall kommt der Punkt pi zur Eckenfolge der konvexen<br />
Hülle hinzu, und zwar (bei Orientierung gegen den Uhrzeigersinn)<br />
nach dem Punkt pl und vor dem Punkt pr. Die Punkte pl<br />
und pr sind hierbei jeweils die (zu pi nächstgelegenen) Berührpunkte<br />
der beiden Tangenten durch den Punkt pi an das Polygon<br />
CH({p1, . . . , pi−1}). Die in der Eckenfolge zwischen pl und pr<br />
liegenden Punkte werden dabei aus der Eckenfolge der konvexen<br />
Hülle entfernt.<br />
Somit leistet Algorithmus 6.1 auf der nächsten Seite das Gewünschte.<br />
Einige Schritte des Algorithmus bedürfen allerdings noch der genaueren<br />
Erläuterung:<br />
Schritt 3: Der Point-in-polygon-Test kann (nach Satz 4.10) mittels der<br />
angularen Ordnung der Polygonecken mit einem Zeitbedarf<br />
von O(log n) beantwortet werden. Da sich unser Polygon während<br />
der Ausführung des Algorithmus dynamisch ändert (in<br />
1 Dieser Fall läßt sich immer mit linearem Prüfaufwand ausschließen und gesondert<br />
behandeln.<br />
Zwei Fälle für den neuen<br />
Punkt pi<br />
pi<br />
pr<br />
pl<br />
pi
70 Konvexe Hüllen ebener Punktmengen<br />
x<br />
pr<br />
pl<br />
pi<br />
Algorithmus 6.1 Inkrementelle Bestimmung der konvexen Hülle<br />
CONVEXHULLINCREMENTAL(p1, . . . , pn)<br />
Input: n Punkte p1, . . . , pn ∈ E 2<br />
1 CH ← (p1, p2, p3) bzw. CH ← (p1, p3, p2) {die drei Punkte sollen<br />
gegen den Uhrzeigersinn orientiert sein}<br />
2 for i ← 4, . . . , n do<br />
3 if pi liegt nicht im Polygon CH then<br />
4 Bestimme die beiden Berührecken pl bzw. pr der Tangenten<br />
durch pi an das Polygon CH<br />
5 Entferne alle Punkte zwischen pl und pr aus der Eckenliste CH<br />
6 Füge den Punkt pi zwischen pl und pr in die Eckenliste CH ein<br />
7 end if<br />
8 end for<br />
Output: CH ist die konvexe Hülle der Punkte p1, . . . , pn<br />
Schritt 5 werden evtl. Eckpunkte entfernt und in Schritt 6 wird<br />
ein Punkt hinzugefügt), sollte die Eckenfolge allerdings nicht in<br />
einem Feld sondern besser mittels eines balancierten Suchbaums<br />
verwaltet werden.<br />
Schritt 4: Der Sektor des Polygons, in dem sich der Punkt pi befindet, ist<br />
ja schon aus Schritt 3 bekannt. Somit können die Punkte pl und pr<br />
durch einen Durchlauf des Polygons gegen bzw. im Uhrzeigersinn<br />
bestimmt werden. Beispielsweise wird zur Bestimmung von pr<br />
das Polygon – beginnend bei der linken Sektorgrenze – unter Verwendung<br />
der ccw-Funktion aus Abschnitt 3.2.2 solange gegen den<br />
Uhrzeigersinn durchlaufen, wie der nächste Eckpunkt echt rechts<br />
des Strahls von pi zum aktuellen Eckpunkt liegt.<br />
Bemerkung 6.4 Realisieren wir Schritt 4 des Algorithmus wie oben beschrieben,<br />
erhalten wir für den Fall, daß kollineare Punkte auf dem Rand<br />
der konvexen Hülle liegen, eine Polygonrepräsentation, die alle diese<br />
Punkte auch als Ecken besitzt.<br />
Ist dies nicht gewünscht, so müssen wir den Polygondurchlauf im<br />
Schritt 4 so modifizieren, daß wir bei der Bestimmung der Berührpunkte<br />
pl und pr auch dann weiterlaufen, wenn der nächste Eckpunkt<br />
auf dem Strahl von pi zum aktuellen Eckpunkt liegt. Auf diese Weise<br />
enthält die Eckenfolge der konvexen Hülle keine kollinearen Ecken<br />
mehr. ⊳<br />
Wie ist jetzt also die Gesamtlaufzeit von Algorithmus 6.1? Die if-Abfrage<br />
in Schritt 3 kostet – wie oben gesehen – O(log n) Zeit, das Bestimmen<br />
der beiden Punkte pl und pr kostet O(n) Zeit und das Löschen der zwischen<br />
pl und pr liegenden Punkte sowie das Einfügen von pi lassen<br />
sich ebenfalls mit linearem bzw. konstantem Zeitaufwand erledigen. Jeder<br />
Schleifendurchlauf hat also einen Zeitbedarf von O(n). Da die for-
6.3 Jarvis’s march 71<br />
Schleife insgesamt (n − 3)-mal durchlaufen wird, erhalten wir als Gesamtzeitbedarf<br />
O(n 2 ). Laufzeit von O(n 2 )<br />
Diese Abschätzung ist jedoch zu grob! Es ist zwar richtig, daß uns in Feinere Abschätzung<br />
einem einzigen Schleifendurchlauf die Schritte 4 und 5 Ω(n) Zeit kosten<br />
können, nämlich dann, wenn fast alle Punkte der konvexen Hülle innerhalb<br />
des Dreiecks liegen, das von pi, pl und pr gebildet wird. Dies kann<br />
jedoch nicht beliebig oft passieren. Denn jeder Punkt, der in Schritt 4<br />
passiert und dann in Schritt 5 gelöscht wird, verschwindet aus der konvexen<br />
Hülle und kann in späteren Schleifendurchläufen nie wieder in<br />
Erscheinung treten. Summiert über alle Schleifendurchläufe erhalten wir<br />
also für die Schritte 4 und 5 trotzdem nur eine Laufzeit von O(n).<br />
Aufgrund des logarithmischen Zeitbedarfs für Schritt 3 erhalten wir damit<br />
also eine Gesamtlaufzeit von O(n log n). Dies fassen wir in folgendem<br />
Satz zusammen:<br />
Satz 6.5 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />
konvexe Hülle mittels des inkrementellen Algorithmus bei linearem<br />
Speicherbedarf mit einem Zeitbedarf von Θ(n log n) bestimmt werden.<br />
Bemerkung 6.6 Die Bestimmung der beiden Berührecken pl und pr<br />
kann sogar in logarithmischer Zeit O(log n) erfolgen, da die Folge<br />
ccw(pi, p1, p2), ccw(pi, p2, p3), . . . , ccw(pi, pi−1, p1)<br />
aufgrund der Konvexität des Polygons (p1, . . . , pi−1) genau zwei Vorzeichenwechsel<br />
besitzt (sofern pi nicht gerade auf dem Rand des Polygons<br />
liegt). Diese Vorzeichenwechsel entsprechen genau den Punkten pl<br />
und pr und können mittels binärer Suche ermittelt werden.<br />
Für unseren Algorithmus ergibt dies jedoch keinen Gewinn (im Gegenteil,<br />
über alle Schleifendurchläufe summiert werden sogar mehr Ecken<br />
betrachtet), da jede Ecke, die zwischen pl und pr liegt, sowieso in<br />
Schritt 5 entfernt werden muß. ⊳<br />
6.3 Jarvis’s march<br />
Die Beobachtung, die dem Algorithmus von Jarvis zugrunde liegt, ist,<br />
daß ein Segment [pi pj], welches die Punktmenge A = {p1, . . . , pn} separiert<br />
(d. h. sowohl links als auch rechts von [pi pj] liegen Punkte aus A),<br />
keine Kante der konvexen Hülle sein kann. Folglich genügt es, mit einem<br />
Punkt pi1 , der sicher ein Eckpunkt der konvexen Hülle ist, zu starten<br />
und dann nach einem weiteren Punkt pi2 zu suchen, so daß alle<br />
übrigen Punkte links des Segments [pi1 pi2 ] liegen. Dieser Schritt wird<br />
dann iteriert, bis man wieder beim Startpunkt pi1 angelangt ist. Aufgrund<br />
dieser Vorgehensweise erhielt der Algorithmus auch seinen Namen:<br />
Man startet an einer Stelle der konvexen Hülle und marschiert<br />
(engl. to march) dann um alle Punkte herum, bis man wieder am Ausgangspunkt<br />
angelangt ist.<br />
Trick: Summation über alle<br />
Schleifendurchläufe<br />
Zeitbedarf von Θ(n log n)<br />
für konvexe Hülle<br />
Bestimmung von pl und pr<br />
in O(log n)<br />
pi 1<br />
pi 4<br />
pi 2<br />
pi 3
72 Konvexe Hüllen ebener Punktmengen<br />
Jarvis’s march ist outputsensitiv<br />
Zeitbedarf von Θ(mn) für<br />
Jarvis’s march<br />
Algorithmus 6.2 Jarvis’s march zur Bestimmung der konvexen Hülle<br />
CONVEXHULLJARVIS(p1, . . . , pn)<br />
Input: n Punkte p1, . . . , pn ∈ E 2<br />
1 Bestimme den Punkt pi1 als den Punkt mit minimaler y-Koordinate<br />
(bei Punkten gleicher y-Koordinate, denjenigen mit minimaler<br />
x-Koordinate)<br />
2 j ← 1<br />
3 repeat<br />
{j zählt die Eckpunkte pij der konvexen Hülle}<br />
4 j ← j + 1<br />
5 rechts ← 1<br />
6 for k ← 2, . . . , n do<br />
7 if (pk liegt echt rechts von [pij−1 prechts]) oder (pk<br />
pij−1<br />
liegt auf<br />
prechts und näher an pij−1 als prechts)<br />
8<br />
then<br />
rechts ← k<br />
9 end if<br />
10 end for<br />
11 pij ← prechts<br />
12 until pij<br />
= pi1<br />
Output: Die konvexe Hülle der Punkte p1, . . . , pn ist das Polygon<br />
mit der Eckenfolge (pi1 , . . . , pij−1 )<br />
Für den Startpunkt pi1 können wir z. B. den Punkt mit minimaler<br />
y-Koordinate (und bei Punkten gleicher y-Koordinate, denjenigen<br />
mit minimaler x-Koordinate) wählen; zum Bestimmen der Punkte<br />
pi2 , pi3 , . . . verwenden wir wieder die ccw-Funktion. Diese Idee wurde<br />
im Algorithmus 6.2 umgesetzt.<br />
Bemerkung 6.7 Für den Fall, daß kollineare Punkte auf dem Rand der<br />
konvexen Hülle liegen, liefert Algorithmus 6.2 eine Polygonrepräsentation,<br />
die alle diese Punkte auch als Ecken besitzt.<br />
Soll die Eckenfolge der konvexen Hülle keine kollinearen Ecken enthalten,<br />
können wir Schritt 7 dahingehend modifizieren, daß im zweiten Teil<br />
der if-Abfrage daraufhin getestet wird, ob der Punkt pk weiter von pij−1<br />
entfernt ist als der Punkt prechts. ⊳<br />
Zum Zeitbedarf des Algorithmus: Jeder Durchlauf der for-Schleife benötigt<br />
Θ(n) Schritte; die äußere repeat-Schleife wird so oft durchlaufen,<br />
wie Eckpunkte auf der konvexen Hülle liegen. Somit hat der Jarvis’smarch-Algorithmus<br />
eine Gesamtlaufzeit von Θ(mn), wenn m die Komplexität<br />
der konvexen Hülle bezeichnet. Der Jarvis’s march ist also out-<br />
put-sensitiv. Im Worst case, wenn alle n Punkte auch auf der konvexen<br />
Hülle liegen, hat der Algorithmus also eine (nicht optimale) Laufzeit<br />
von Ω(n 2 ). Wir erhalten damit folgenden Satz:<br />
Satz 6.8 Für eine Menge von n Punkten p1, . . . , pn ∈ E2 kann deren<br />
konvexe Hülle (pi1 , . . . , pim ) mittels des Jarvis’s march bei linearem<br />
Speicherbedarf mit einem Zeitbedarf von Θ(mn) bestimmt werden.
6.4 Graham’s scan 73<br />
6.4 Graham’s scan<br />
Die Hauptidee des Algorithmus von Graham ist, die Punkte zunächst<br />
(zyklisch) angular zu sortieren, bezüglich eines Punktes, der in der konvexen<br />
Hülle der Punkte liegt (z. B. der Schwerpunkt dreier Punkte). Mittels<br />
dieses Preprocessings ist es dann leicht, diejenigen Punkte zu finden, die<br />
Eckpunkte der konvexen Hülle sind.<br />
Ein Eckpunkt p der konvexen Hülle muß nämlich mit allen Punkten pr �<br />
p � pl (insbesondere also mit den direkten Nachbarn in der angularen<br />
Ordnung) einen Winkel ≤ π einschließen, andernfalls wäre p eine<br />
konkave Ecke des Polygons. Andererseits wissen wir bereits aus Lem-<br />
ma 4.7, daß ein Polygon mit ausschließlich konvexen Ecken (d. h. positiven<br />
Knickwinkeln) konvex ist.<br />
Dies machen wir uns jetzt zunutze, indem wir die Punkte gemäß ihrer<br />
zyklischen angularen Ordnung durchlaufen und jeden Punkt p mit seinen<br />
direkten Nachbarn pr und pl in der angularen Ordnung testen. Wir<br />
unterscheiden dabei zwei Fälle:<br />
1. p liegt echt links von [pr pl]:<br />
Preprocessing: Angulare<br />
Sortierung der Punkte<br />
Der Punkt p kann somit keine Ecke der konvexen Hülle sein. Wir<br />
eliminieren deshalb p aus der Liste der Punkte. Da pr jetzt einen<br />
neuen direkten Nachbarn in der angularen Ordnung bekommen<br />
hat (nämlich pl) machen wir einen Rückwärtsschritt und testen als Rückwärtsschritt<br />
nächstes pr (eventuell zum wiederholten Mal).<br />
2. p liegt rechts von [pr pl]:<br />
Momentan spricht nichts dagegen, daß p ein Eckpunkt der konvexen<br />
Hülle ist. Wir machen deshalb einen Vorwärtsschritt und testen Vorwärtsschritt<br />
als nächstes pl.<br />
Durch dieses Vorgehen ist gewährleistet, daß alle Punkte vom Start- Invariante<br />
punkt bis zum aktuellen Punkt mit ihren Nachbarpunkten einen Winkel<br />
≤ π einschließen. Sollte der Startpunkt bei einem Rückwärtsschritt<br />
eliminiert werden, übernimmt der zugehörige Punkt pr seine Rolle.<br />
Diesen zirkularen Scan über alle Punkte führen wir solange durch, bis zirkularer Scan<br />
wir den Startpunkt wieder erreicht und erneut erfolgreich getestet haben<br />
(d. h. der Punkt liegt rechts von [pr pl]). Denn dann können wir<br />
sicher sein, daß alle in der Liste verbliebenen Punkte mit ihren Nachbarpunkten<br />
einen Winkel ≤ π einschließen. Da die verbliebene Punktfolge<br />
außerdem immer noch angular sortiert ist, wissen wir, daß sie gleichzeitig<br />
Eckenfolge eines (zumindest sternförmigen) Polygons ist (vgl. Abschnitt<br />
4.2.2). Lemma 4.7 garantiert uns dann die Konvexität des Polygons.<br />
Zur Bestimmung der Gesamtlaufzeit des Graham’s scans müssen wir<br />
nur noch die Zahl der insgesamt ausgeführten Vorwärts- und Rückwärtsschritte<br />
ermitteln:<br />
pl<br />
p<br />
pr
74 Konvexe Hüllen ebener Punktmengen<br />
Zeitbedarf von Θ(n log n)<br />
für Graham’s scan<br />
Rückwärtsschritte Da bei jedem Rückwärtsschritt ein Punkt aus der Liste<br />
entfernt wird, kann es maximal n − 3 solche Schritte geben, da<br />
aufgrund unserer Voraussetzungen die konvexe Hülle mindestens<br />
drei Eckpunkte enthalten muß.<br />
Vorwärtsschritte Offensichtlich kann es passieren, daß von einem<br />
Punkt aus Ω(n) Vorwärtsschritte getätigt werden. Dies kann allerdings<br />
nicht für alle Punkte der Fall sein. Denn die Zahl der noch<br />
nicht besuchten Punkte wird von einem Vorwärtsschritt um eins<br />
verringert und wird bei einem Rückwärtsschritt zumindest nicht<br />
vergrößert. Da außerdem für jeden Rückwärtsschritt höchstens<br />
ein zusätzlicher Vorwärtsschritt nötig ist, die Zahl der Rückwärtsschritte<br />
aber aus O(n) ist, muß auch die Zahl aller Vorwärtsschritte<br />
aus O(n) sein.<br />
Wir fassen diese Überlegungen in folgendem Satz zusammen:<br />
Satz 6.9 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />
konvexe Hülle mittels des Graham’s scans bei linearem Speicherbedarf<br />
mit einem Zeitbedarf von Θ(n log n) bestimmt werden.<br />
Bemerkung 6.10 Der oben beschriebene Algorithmus liefert wieder eine<br />
Polygonrepräsentation, die im Fall kollinearer Punkte auf dem Rand<br />
der konvexen Hülle diese auch alle als Ecken zurückliefert.<br />
Ist dies nicht gewünscht, muß nur in der Fallunterscheidung auf der vorhergehenden<br />
Seite »echt links« durch »links« und »rechts« durch »echt<br />
rechts« ersetzt werden. ⊳<br />
6.5 Konstruktion mittels Divide-and-conquer<br />
Divide-and-conquer-Verfahren sind insbesondere dann von Interesse,<br />
wenn ein Problem auf einem Parallelrechner bearbeitet werden soll, weil<br />
dann die entstehenden Teilprobleme auf verschiedenen Prozessoren<br />
gleichzeitig gelöst werden können.<br />
Bei einem Divide-and-conquer-Ansatz zerlegen wir das Problem in zwei<br />
ungefähr gleich große Probleme (hier: die Bestimmung der konvexen<br />
Hülle zweier nur halb so großer Punktmengen), lösen diese rekursiv<br />
und konstruieren aus den beiden Teillösungen (hier: zwei konvexe Polygone)<br />
die Lösung des ursprünglichen Problems (hier: die Bestimmung<br />
der konvexen Hülle zweier konvexer Polygone). Das Grundgerüst des<br />
Divide-and-conquer-Verfahrens bildet somit Algorithmus 6.3 auf der<br />
folgenden Seite. Hierbei setzen wir o. B. d. A. voraus, daß keine drei<br />
Punkte kollinear sind, denn sonst könnte es passieren, daß eine der konvexen<br />
Hüllen in einem der Rekursionsschritte kein reguläres Polygon<br />
mehr ist, sondern nur ein Liniensegment.<br />
Wichtigster Baustein dieses Divide-and-conquer-Algorithmus ist natürlich<br />
das „Verschmelzen“ der beiden konvexen Hüllen CH 1 und CH 2 in
6.5 Konstruktion mittels Divide-and-conquer 75<br />
Algorithmus 6.3 Konvexe Hülle mittels Divide-and-conquer<br />
CONVEXHULLD-A-Q(p1, . . . , pn)<br />
Input: n Punkte p1, . . . , pn ∈ E 2<br />
1 if n ≤ 6 then<br />
2 CH ← CH(p1, . . . , pn) {z. B. mittels eines naiven Algorithmus}<br />
3 else<br />
4 CH 1 ← CONVEXHULLD-A-Q(p1, . . . , p ⌊n/2⌋)<br />
5 CH 2 ← CONVEXHULLD-A-Q(p ⌊n/2⌋+1, . . . , pn)<br />
6 CH ← MERGEHULLS(CH 1, CH 2)<br />
7 end if<br />
Output: CH ist die konvexe Hülle der Punkte p1, . . . , pn<br />
Algorithmus 6.4 Konvexe Hülle zweier konvexer Polygone<br />
MERGEHULLS(P1, P2)<br />
Input: Zwei konvexe Polygone P1, P2 ⊂ E 2<br />
1 Bestimme einen Punkt ˜p ∈ P1<br />
2 if ˜p ∈ P2 then<br />
3 Verschmelze die (jeweils bez. ˜p angular sortierten) Eckenfolgen<br />
von P1 und P2 zu einer Folge CH<br />
4 else<br />
5 Bestimme die beiden Berührecken pl und pr der Tangenten<br />
durch ˜p an das Polygon P2<br />
6 Verschmelze die (bez. ˜p angular sortierten) Eckenfolge von P1 und<br />
die Teilfolge von P2 zwischen pr bis pl zu einer Folge CH<br />
7 end if<br />
8 Wende den Scan-Schritt des Graham’s scans auf die Folge CH an<br />
und eliminiere alle konkaven Ecken aus CH<br />
Output: CH ist die konvexe Hülle der beiden Polygone P1 und P2<br />
Schritt 6. Diesen Teil – also das Berechnen der konvexen Hülle zweier<br />
konvexer Polygone – müssen wir noch genauer spezifizieren. Hierbei<br />
können wir wieder ausnutzen, daß wir die beiden konvexen Polygone<br />
als Eckenfolge – und damit (zyklisch) angular sortiert – vorliegen haben.<br />
Algorithmus 6.4 leistet dann das Gewünschte. Einige Schritte des<br />
Algorithmus bedürfen noch einer genaueren Erläuterung:<br />
Schritt 2: Den Point-in-polygon-Test können wir aufgrund der angularen<br />
Sortierung der Polygonecken in logarithmischer Zeit durchführen.<br />
Hier in unserem Fall genügt jedoch auch ein naiver Linearzeitalgorithmus.<br />
Schritt 5: Die beiden Berührecken pl und pr können wie beim inkrementellen<br />
Algorithmus (Abschnitt 6.2) in linearer Zeit bestimmt<br />
werden. Die Ecken zwischen pl und pr liegen dabei sicherlich innerhalb<br />
von CH(P1 ∪ P2) und können entfernt werden.<br />
P1<br />
˜p<br />
pl<br />
pr<br />
P2
76 Konvexe Hüllen ebener Punktmengen<br />
konvexe Hülle zweier<br />
konvexer Polygone in Θ(n)<br />
Zeitbedarf von Θ(n log n)<br />
für Divide-and-conquer-<br />
Algorithmus<br />
Schritt 3 und Schritt 6: In beiden Fällen (»p ∈ P2« und »p /∈ P2«) können<br />
die beiden Eckenfolgen (bzw. Teilfolgen) in linearer Zeit zu<br />
einer Eckenfolge verschmolzen werden, die ebenfalls bezüglich ˜p<br />
zyklisch angular sortiert ist.<br />
Schritt 8: Somit haben wir jetzt dieselben Voraussetzungen wie nach<br />
dem Sortierschritt beim Graham’s scan, nämlich eine zyklisch angular<br />
sortierte Menge von Punkten, und können nun auf diese den<br />
Scan-Schritt anwenden (mit ebenfalls linearem Zeitbedarf), um die<br />
konvexe Hülle zu erhalten.<br />
Für das Bestimmen der konvexen Hülle zweier konvexer Polygone erhalten<br />
wir somit den folgenden Satz:<br />
Satz 6.11 Für zwei konvexe Polygone P1, P2 ⊂ E 2 mit einer Gesamtkomplexität<br />
von |P1| + |P2| = n kann deren konvexe Hülle bei linearem<br />
Speicherbedarf mit einem Zeitbedarf von Θ(n) bestimmt werden.<br />
Als direkte Folge aus diesem Satz erhalten wir dann auch die Laufzeitabschätzung<br />
für den Divide-and-conquer-Algorithmus 6.3:<br />
Satz 6.12 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />
konvexe Hülle mittels des Divide-and-conquer-Algorithmus 6.3 bei linearem<br />
Speicherbedarf mit einem Zeitbedarf von Θ(n log n) bestimmt<br />
werden.<br />
Beweis: Schritt 2 des Algorithmus hat einen konstanten Zeitbedarf, die<br />
Schritte 4, 5 und 6 jeweils linearen Zeitbedarf. Somit erhalten wir für<br />
den Gesamtzeitbedarf t(n) die Rekursionsgleichung<br />
t(n) = 2 · t(n/2) + O(n) ,<br />
die zu t(n) ∈ O(n log n) führt. ✷<br />
Bemerkung 6.13 Eine Alternative zu obigem Divide-and-conquer-Verfahren<br />
ist, die Punktmenge in zwei etwa gleich große Mengen zu zerlegen,<br />
deren konvexe Hüllen garantiert disjunkt sind. Dies kann beispielsweise<br />
mittels des Medians (der mit linearem Zeitbedarf bestimmt werden<br />
kann) der x-Koordinaten der Punkte geschehen. Die konvexen Hüllen<br />
der beiden Teilmengen werden dann wieder rekursiv bestimmt.<br />
Im Gegensatz zum vorherigen Algorithmus verzichten wir jetzt beim<br />
Berechnen der konvexen Hülle der beiden konvexen Polygone auf die<br />
Anwendung des Scan-Schritts des Graham’s scans, sondern nutzen aus,<br />
daß die beiden Polygone disjunkt sind. Dann können nämlich die obere<br />
und die untere Tangente an die beiden Polygone direkt bestimmt werden<br />
– durch gleichzeitiges Durchlaufen beider Eckenfolgen. Dieser Durchlauf<br />
benötigt bei naiver Implementierung auch wieder nur linearen Zeitbedarf.<br />
Zudem können die beiden Tangenten auch – durch Verwendung<br />
binärer Suche (siehe Bemerkung 6.6) – mit nur logarithmischem Zeitbedarf<br />
ermittelt werden.<br />
Insgesamt hat dieser alternative Divide-and-conquer-Ansatz auch einen<br />
Zeitbedarf von Θ(n log n). ⊳
6.6 Quickhull 77<br />
6.6 Quickhull<br />
Quickhull ist ebenfalls ein Divide-and-conquer-Verfahren und trägt seinen<br />
Namen aufgrund der großen Ähnlichkeit zum Quicksort-Sortierverfahren.<br />
Bei Quicksort wird ja bekanntlich die Menge der zu sortierenden<br />
Zahlen bezüglich eines zufällig gewählten Pivotelements in zwei Teilmengen<br />
von Zahlen zerlegt, die alle kleiner bzw. größer als das Pivotelement<br />
sind und diese Teilmengen werden dann rekursiv auf dieselbe Art<br />
und Weise sortiert. Im Average case (wenn die beiden Teilmengen ungefähr<br />
gleich groß sind) erhält man dann eine Laufzeit von O(n log n),<br />
im Worst case dagegen (wenn z. B. eine der beiden Mengen immer nur<br />
ein Element enthält) dagegen eine Laufzeit von Ω(n 2 ).<br />
Die Idee bei Quickhull ist die folgende:<br />
• Wir bestimmen zunächst zwei Punkte pl und pr, die garantiert<br />
Eckpunkte der konvexen Hülle sind (z. B. mittels minimaler und<br />
maximaler x-Koordinate). Die Gerade pl pr zerlegt dann die Menge<br />
der Punkte in zwei Hälften.<br />
• Zur Bestimmung der oberen Hälfte der konvexen Hülle (analog<br />
für die untere Hälfte) suchen wir einen Punkt ph, der ebenfalls garantiert<br />
auf der konvexen Hülle liegt, z. B. den Punkt maximalen<br />
Abstands zu pl pr. Alle Punkte in dem durch pl, pr und ph induzierten<br />
Dreieck können jetzt entfernt werden, da sie innerhalb der<br />
konvexen Hülle liegen.<br />
• Für die verbliebenen Punkte links von pl ph und rechts von ph pr<br />
wird nun rekursiv genauso verfahren, d. h. der Punkt ph übernimmt<br />
die Rolle von pr bzw. pl.<br />
Dies ergibt im Worst case (z. B. wenn auf allen Rekursionebenen alle<br />
Punkte stets rechts von ph pr liegen) wie bei Quicksort eine Laufzeit<br />
von Ω(n 2 ). Teilt ph dagegen die Menge der Punkte stets in zwei etwa<br />
gleich große Mengen, 2 erhält man eine Laufzeit von O(n log n) – unabhängig<br />
davon, wieviele Punkte außerdem noch innerhalb des Dreiecks<br />
liegen und eliminiert werden können.<br />
6.7 Dynamische Verfahren<br />
Alle bis jetzt vorgestellten Algorithmen zur Bestimmung der konvexen<br />
Hülle waren sog. Offline-Algorithmen, bei denen die komplette Eingabe Offline- vs. Online-<br />
(also in unserem Fall, die n Punkte) schon vor dem Start des Algorithmus Algorithmen<br />
vorliegt.<br />
Im Gegensatz hierzu erhält ein Online-Algorithmus seine Eingabe nicht<br />
vollständig zu Beginn, sondern nach und nach und auch die Größe der<br />
2 In der Tat müssen die beiden Mengen nicht wirklich gleich mächtig sein, sondern es<br />
genügt bereits, wenn (wie bei Quicksort) jede der beiden Mengen immer mindestens einen<br />
linearen Bruchteil der Ausgangsmenge enthält.<br />
pl<br />
ph<br />
pr
78 Konvexe Hüllen ebener Punktmengen<br />
Eingabe ist vor dem Start des Algorithmus nicht bekannt. Für unser Beispiel<br />
heißt das, daß zu beliebigen Zeitpunkten ein oder mehrere Punkte<br />
zur Punktmenge hinzukommen können (sog. Einfügeereignis) und die<br />
konvexe Hülle aller bis zu einem Zeitpunkt bekannten Punkte jeweils<br />
aktualisiert werden muß.<br />
Einfüge- und Außerdem sind nicht nur die obigen Einfügeereignisse möglich, son-<br />
Löschereignisse dern auch Löschereignisse, d. h. ein Punkt wird wieder aus der Punktmenge<br />
entfernt. Auch hier muß dann die konvexe Hülle entsprechend<br />
aktualisiert werden.<br />
Zeitbedarf von Θ(log n) für<br />
ein Einfügeereignis<br />
Von den in den letzten Abschnitten vorgestellten Algorithmen kann nur<br />
das inkrementelle Verfahren aus Abschnitt 6.2 so modifiziert werden,<br />
daß zumindest Einfügeereignisse effizient behandeln werden können.<br />
Hierzu verwalten wir die konvexe Hülle CH aller Punkte in einer geeigneten<br />
Union-Find-Struktur (siehe hierzu z. B. [22, S. 115]), so daß das<br />
Einfügen neuer Punkte und insbesondere das Löschen einer zusammenhängenden<br />
Folge von Punkten jeweils in logarithmischer Zeit möglich<br />
ist.<br />
Um die konvexe Hülle für einen neu hinzugekommenen Punkt zu aktualisieren,<br />
verwenden wir dann eine leicht modifizierte Version des Aktualisierungsschrittes<br />
von Algorithmus 6.1 auf Seite 70 (Schritte 3 bis 7):<br />
Schritt 4: Die Bestimmung der beiden Berührecken soll jetzt – wie in Bemerkung<br />
6.6 beschrieben – mit logarithmischem Zeitbedarf erfolgen.<br />
Wir verwenden deshalb eine binäre Suche auf unserer Union-<br />
Find-Datenstruktur.<br />
Schritt 5: Sind die beiden Berührecken pl und pr bestimmt, können alle<br />
zwischen pl und pr liegenden Ecken mit logarithmischem Zeitaufwand<br />
aus der Union-Find-Struktur für die konvexe Hülle „ausgehängt“<br />
werden.<br />
Somit kostet jeder Aktualisierungsschritt für ein Einfügeereignis<br />
Θ(log n). Schneller kann dies auch nicht bewerkstelligt werden, denn<br />
sonst hätten wir (bei n Punkten) einen Widerspruch zur unteren<br />
Schranke Θ(n log n) aus Satz 6.3. Insgesamt kostet also das dynamische<br />
Erzeugen der konvexen Hülle (wenn wir die n Punkte als n Einfügeereignisse<br />
betrachten) nicht mehr als das Erzeugen mit einem Offline-<br />
Algorithmus.<br />
Das effiziente Behandeln von Löschereignissen ist hingegen weitaus<br />
schwieriger als das von Einfügeereignissen, denn beim Löschen eines<br />
Punktes können im Worst case Ω(n) Punkte aus dem Inneren der konvexen<br />
Hülle zu neuen Ecken werden. Man kann jedoch zeigen, daß<br />
sich unter Verwendung einer komplizierteren Datenstruktur sowohl der<br />
Aktualisierungsschritt für ein Einfüge- als auch für ein Löschereignis<br />
in jeweils O(log 2 n) Zeit durchführen läßt. Das dynamische Erzeugen<br />
der konvexen Hülle mit diesem Online-Algorithmus (mittels n Einfügeereignissen)<br />
hat damit einen Zeitbedarf von O(n log 2 n). Die Online-<br />
Eigenschaft kostet uns also einen „Straffaktor“ von O(log n).
Lokationsprobleme in<br />
der Ebene<br />
Gegeben einen PSLG (siehe Abschnitt 5.6) mit der Gesamtkomplexität n,<br />
der eine Zerlegung der Ebene induziert, und einen Anfragepunkt p.<br />
Dann interessiert uns beim Point-location-Problem, in welchem der vom<br />
PSLG induzierten polygonalen Gebiete der Punkt p liegt (bzw. ob p in<br />
der unbeschränkten Region liegt). Offensichtlich läßt sich diese Frage<br />
naiv mit linearem Zeitbedarf beantworten, indem man p mit allen Polygonen<br />
auf Inklusion testet (z. B. mittels Algorithmus 4.2 auf Seite 45).<br />
Eine untere Schranke von Ω(log n) (im Entscheidungsbaummodell) für<br />
den Zeitbedarf einer Lokationsanfrage ist ebenfalls sofort einsichtig,<br />
denn ein PSLG der Komplexität n kann Ω(n) verschiedene Regionen<br />
aufweisen, in denen ein Anfragepunkt liegen kann und die demnach<br />
bei einer Point-location-Anfrage unterschieden werden müssen. Somit<br />
besitzt also der zu einer Point-location-Anfrage gehörende Entscheidungsbaum<br />
mindestens Ω(n) Blätter und hat damit mindestens die Höhe<br />
Ω(log n).<br />
Um ein Lokationsverfahren zu erhalten, das eine bessere Laufzeit aufweist<br />
als das naive Verfahren, ist ein sinnvoller Ansatz, aus der ursprünglichen<br />
vom PSLG induzierten planar subdivision eine neue Zerlegung<br />
der Ebene zu erzeugen, die sich „leichter“ durchsuchen läßt,<br />
d. h. bei der die Zahl der zu durchsuchenden Komponenten während<br />
der Suche möglichst schnell eingeschränkt werden kann. Dies könnte<br />
z. B. durch Verwendung von binärer Suche geschehen (denn dann wäre<br />
die Suchzeit nur noch logarithmisch von der Komponentenzahl abhängig).<br />
Darüberhinaus sollte die neue Zerlegung sich „nicht zu stark“ von<br />
der alten Zerlegung unterscheiden; insbesondere sollte jedes der neuen<br />
Polygone nur eine möglichst geringe (d. h. durch eine Konstante beschränkte)<br />
Zahl der ursprünglichen Polygone schneiden, da sonst die<br />
Rekonstruktion des Lokationsergebnisses für die ursprüngliche Zerlegung<br />
zu zeitaufwendig wäre.<br />
Diese zentrale Idee, neue geometrische Objekte zu erzeugen, auf die<br />
dann das Konzept der binären Suche angewandt werden kann, geht auf<br />
Dobkin und Lipton zurück (siehe [6]) und wird bei beiden Ansätzen, die<br />
in den folgenden Abschnitten vorgestellt werden, ausgenutzt.<br />
p<br />
point location<br />
untere Schranke von<br />
Ω(log n)<br />
7
80 Lokationsprobleme in der Ebene<br />
Anfragezeit von Θ(log n)<br />
mit doppelter bin. Suche<br />
Ω(n 2 ) Speicherbedarf<br />
7.1 Die Slab-Methode<br />
Bei der Slab-Methode zerlegen wir die Ebene in eine Menge vertikaler<br />
Streifen (engl. slabs), deren Begrenzungslinien jeweils durch die Ecken<br />
des PSLGs induziert werden (vgl. auch die Schnittbestimmung konvexer<br />
Polygone mittels des Plane-sweep-Ansatzes in Abschnitt 5.2). Auf<br />
diese Weise erhalten wir eine neue planar subdivision, deren beschränkte<br />
Regionen ausschließlich Trapeze (bzw. Dreiecke) sind.<br />
Da nach Konstruktion der Streifen Si keine Ecke des PSLGs innerhalb eines<br />
Streifens liegt, sich demnach also auch keine zwei Kanten des PSLGs<br />
innerhalb eines Streifens schneiden, können wir für jeden Streifen Si eine<br />
Ordnung der von Si geschnittenen Kanten, ei1 ≤ ei2 ≤ · · · ≤ ein i ,<br />
angeben und zusammen mit Si abspeichern. Eine Point-location-Anfrage<br />
für einen Punkt p ist demnach sehr einfach mittels einer zweimaligen<br />
binären Suche zu realisieren:<br />
1. Zuerst bestimmen wir mittels binärer Suche bez. der<br />
x-Koordinaten denjenigen Streifen Si, der den Punkt p enthält.<br />
2. Dann führen wir erneut eine binäre Suche durch (bez. der<br />
y-Koordinaten) und ermitteln im Streifen Si die beiden bez. ihrer<br />
Ordnung aufeinanderfolgenden Segmente eij und eij+1 , die den<br />
Punkt p einschließen.<br />
Da sowohl die Gesamtzahl aller Streifen als auch die Zahl aller Segmente<br />
aus O(n) ist, erhalten wir auf diese Weise eine optimale Anfragezeit<br />
von Θ(log n).<br />
Wir müssen also nur noch analysieren, wie groß der Aufwand zur Speicherung<br />
der Streifen Si und der jeweiligen Segmentfolgen ei1 , . . . , eini ist und was es uns kostet, die zugehörigen Datenstrukturen zu erzeugen.<br />
Wie oben schon erwähnt, gibt es höchstens O(n) Streifen und<br />
in jedem Streifen maximal O(n) Segmente, was einen Gesamtspeicherbedarf<br />
von O(n2 ) zur Folge hat. Speichern wir die Streifen, sortiert<br />
nach ihren x-Koordinaten in einem Baum, dann kostet uns der Aufbau<br />
O(n log n) Zeit. Wenn wir für jeden Streifen Si die zugehörigen Segmente<br />
eij ebenfalls in einem eigenen Baum speichern, dann hat der Aufbau<br />
aller dieser Bäume einen Zeitbedarf von O(n · n log n). Insgesamt erhalten<br />
wir also einen Gesamtzeitbedarf von O(n2 log n) für den Aufbau<br />
der Lokationsdatenstruktur.<br />
Wir können allerdings ausnutzen, daß, wenn eine Kante des PSLGs<br />
durch mehrere Streifen verläuft, diese Streifen alle aufeinanderfolgen<br />
müssen. Diese Beobachtung erlaubt es uns, mittels eines Plane-sweep-<br />
Algorithmus alle Segmentfolgen mit einem Zeitbedarf von O(n 2 ) zu erzeugen<br />
(siehe z. B. [22, S. 47]).<br />
Unglücklicherweise ist aber Ω(n2 ) tatsächlich auch eine untere Schranke<br />
für die Worst-case-Komplexität des Speicherbedarfs beim Slab-Verfahren<br />
und wir können leicht ein Beispiel angeben, bei dem Ω(n) Streifen<br />
mit jeweils Ω(n) Segmenten entstehen. Somit erhalten wir für die Slab-<br />
Methode den folgenden Satz:
7.2 Das Verfahren der verfeinerten Triangulationen 81<br />
Satz 7.1 Das Point-location-Problem für einen PSLG der Gesamtkomplexität<br />
n kann mittels der Slab-Methode mit einem optimalen Zeitbedarf<br />
von Θ(log n) beantwortet werden. Der Preprocessing-Aufwand<br />
(Zeit und Speicher) ist hierbei aus Θ(n 2 ).<br />
Ein in der Größe des PSLGs quadratischer Speicherbedarf ist jedoch für<br />
praktische Anwendungen (d. h. umfangreiche PSLGs) untragbar, so daß<br />
die Slab-Methode nur für kleinere Anwendungen praktikabel ist.<br />
7.2 Das Verfahren der verfeinerten Triangulationen<br />
In diesem Abschnitt wollen wir ein Verfahren vorstellen, das ebenfalls<br />
eine optimale Anfragezeit von Θ(log n) besitzt, gleichzeitig aber auch<br />
nur einen linearen Speicher- und Preprocessing-Zeitbedarf besitzt – das<br />
Verfahren der verfeinerten (und vergröberten) Triangulationen, welches<br />
im Jahr 1983 von Kirkpatrick [13] vorgestellt wurde.<br />
7.2.1 Einschub »Die Eulersche Formel«<br />
Die Eulersche Formel (bzw. Eulersche Polyederformel) ist uns schon in<br />
Beobachtung 5.20 im Abschnitt 5.6 begegnet. Sie stellt einen Zusammenhang<br />
her zwischen den Ecken-, Kanten- und Flächenzahlen sowie<br />
der Zahl der Zusammenhangskomponenten eines in die Ebene eingebetteten<br />
ungerichteten, planaren Graphen. Genauer gilt der folgende<br />
Satz:<br />
Satz 7.2 Für die kreuzungsfreie Realisierung (in die Ebene) eines unge-<br />
richteten Graphen G = (V, E, γ) sei<br />
v seine Eckenanzahl |V| ,<br />
e seine Kantenanzahl |E| ,<br />
f seine Flächenanzahl (inklusive der unbeschränkten Region) ,<br />
c die Zahl seiner Zusammenhangskomponenten .<br />
Dann gilt<br />
v − e + f = c + 1 . (7.1)<br />
Beweis: Wir konstruieren die geometrische Realisierung von G sukzessive<br />
und zeigen durch Induktion, daß die Eulersche Formel jeweils<br />
erfüllt ist. Wir beginnen mit der Realisierung des Graphens, der nur<br />
die Knoten V von G, aber keine Kanten, enthält. Dann ist offensichtlich<br />
v = c, e = 0 und f = 1, also stimmt die Behauptung.<br />
Wir fügen jetzt nach und nach jeweils eine Kante aus E zu G hinzu und<br />
untersuchen, wie sich die Verhältnisse in der entsprechenden geometrischen<br />
Realisierung ändern. Es gibt zwei Fälle:<br />
Preprocessing-Aufwand<br />
von Θ(n 2 ) bei der Slab-<br />
Methode<br />
v = 11, e = 10, f = 3, c = 3
82 Lokationsprobleme in der Ebene<br />
1. die neue Kante verbindet zwei bisher disjunkte Zusammenhangskomponenten:<br />
In diesem Fall wächst e um 1 und die Zahl c der Zusammenhangskomponenten<br />
fällt um 1. Gleichung (7.1) bleibt also richtig.<br />
2. die neue Kante verbindet Knoten derselben Zusammenhangskomponente:<br />
In diesem Fall wachsen sowohl e als auch die Flächenzahl f um<br />
jeweils 1 und Gleichung (7.1) bleibt ebenfall richtig. ✷<br />
Schränken wir die zugelassenen geometrischen Graphen etwas ein, erhalten<br />
wir die beiden folgenden Korollare:<br />
Folgerung für einfache Korollar 7.3 Für die kreuzungsfreie Realisierung (in die Ebene) eines<br />
Graphen ungerichteten einfachen Graphen G = (V, E, γ) gilt<br />
e ≤ 3v − 6c ≤ 3v − 6<br />
f ≤ 2<br />
2<br />
3e − c + 1 ≤ 3e f ≤ 2v − 5c + 1 ≤ 2v − 4<br />
(7.2)<br />
Beweis: Wir müssen nur die erste Ungleichung beweisen. Durch Einsetzen<br />
von Gleichung (7.1) in diese ergeben sich die beiden anderen.<br />
Hierzu betrachten wir die einzelnen Zusammenhangskomponenten<br />
von G getrennt voneinander. Seien also deshalb vi, ei, und fi die Ecken-,<br />
Kanten- und Flächenzahlen desjenigen Graphen, der nur aus der i-ten<br />
Zusammenhangskomponente von G besteht. Wir erweitern nun diesen<br />
Graphen durch Hinzufügen neuer Kanten zu einem einfachen Graphen<br />
mit maximaler Kanten- und Flächenanzahl. In diesem so entstehenden<br />
Graphen werden offenbar alle beschränkten Regionen von genau drei<br />
Kanten begrenzt, denn sonst könnten wir noch eine neue Kante einfügen<br />
und die Zahl der Flächen und Kanten noch weiter erhöhen. (Weniger<br />
als drei begrenzende Kanten ist aufgrund der geforderten Einfachheit<br />
des Graphen ebenfalls nicht möglich)<br />
Seien nun emaxi und fmaxi die Kanten- und Flächenzahlen dieses neuen<br />
Graphen für die i-te Zusammenhangskomponente. Da jede Region<br />
von genau drei Kanten begrenzt wird und jede Kante genau zwei Regionen<br />
begrenzt, gilt 2emaxi = 3fmaxi . Durch Einsetzen von Gleichung (7.1)<br />
mit c = 1 erhält man dann ei ≤ emaxi = 3vi − 6.<br />
Da die Ecken und Kanten in den einzelnen Zusammenhangskomponenten<br />
von G disjunkt sind, gilt �c i=1 vi = v und �c i=1 ei = e, woraus durch<br />
Summation e ≤ 3v − 6c folgt. ✷<br />
Folgerung für Graphen mit Korollar 7.4 Für die kreuzungsfreie Realisierung (in die Ebene) eines<br />
Knotengrad ≥ 3 ungerichteten Graphen G = (V, E, γ), dessen Knoten alle einen Grad<br />
von mindestens 3 besitzen, gilt<br />
v ≤ 2<br />
3 e<br />
v ≤ 2(f − c − 1) ≤ 2f − 4<br />
e ≤ 3(f − c − 1) ≤ 3f − 6<br />
(7.3)
7.2 Das Verfahren der verfeinerten Triangulationen 83<br />
Beweis: Von jedem Knoten gehen nach Voraussetzung mindestens drei<br />
Kanten aus. Da jede Kante zwei Knoten miteinander verbindet, gilt 2e ≥<br />
3v. Die beiden anderen Ungleichungen erhält man wieder durch Einsetzen<br />
von Gleichung (7.1). ✷<br />
Ein PSLG, wie wir ihn definiert haben, ist offensichtlich ein einfacher<br />
kreuzungsfrei in der Ebene realisierter Graph mit genau einer Zusammenhangskomponente<br />
(d. h. c = 1), so daß die Voraussetzungen von<br />
Satz 7.2 und Korollar 7.3 für einen PSLG immer erfüllt sind. Hieraus<br />
folgt dann auch sofort Beobachtung 5.20 auf Seite 63 – die Gesamtkomplexität<br />
eines PSLGs (also v + e + f) ist größenordnungsmäßig nicht größer<br />
als die Zahl v seiner Ecken.<br />
Bemerkung 7.5 Die Bezeichnung »Eulersche Polyederformel« resultiert<br />
aus der Tatsache, daß Gleichung (7.1) – ebenso wie die Ungleichungen –<br />
auch für ein Polyeder im dreidimensionalen Raum gilt (mit c = 1).<br />
Denn durch eine geeignete stetige Transformation können wir ein evtl.<br />
nicht-konvexes Polyeder zunächst in ein konvexes Polyeder überführen.<br />
Dieses bzw. seine Ecken und Kanten projizieren wir dann auf eine umschriebene<br />
Kugeloberfläche und anschließend vom „Nordpol“ der Kugel<br />
in eine zum „Südpol“ tangential verlaufende Ebene. Abbildung 7.1<br />
illustriert diesen Sachverhalt anhand eines zweidimensionalen Schnitts<br />
durch die Szene: die Ecken und Kanten des schwarzen konvexen Polyeders<br />
werden auf die Kugeloberfläche (grün) projiziert und von dort aus<br />
in die Projektionsebene (blau).<br />
Die Inzidenzen bleiben bei allen diesen Transformationen erhalten: Jede<br />
Kante des Polyeders wird auf eine (evtl. krummlinige) Kante in der<br />
Projektionsebene abgebildet und jede Fläche auf eine beschränkte Region<br />
des entstehenden planaren Graphen. Die einzige Ausnahme bildet<br />
diejenige „Fläche“ auf der Kugel, die den Nordpol enthält; diese wird<br />
auf die unbeschränkte Region abgebildet. (Der Nordpol sollte natürlich<br />
nicht gerade durch eine Ecke oder Kante verlaufen.)<br />
Somit haben wir das ursprüngliche Polyeder in einen kreuzungsfrei in<br />
die Ebene eingebetteten Graphen transformiert, für den die Eulersche<br />
Formel (und auch die beiden Korollare) gilt. Deren Aussagen übertragen<br />
sich damit auf die Ecken-, Kanten- und Flächenzahlen des Polyeders.<br />
⊳<br />
Abbildung 7.1<br />
Projektion des Polyeders<br />
auf eine Kugeloberfläche<br />
und von dort in die Ebene
84 Lokationsprobleme in der Ebene<br />
maximaler PSLG<br />
Triangulation<br />
7.2.2 Die Methode von Kirkpatrick<br />
Da das Verfahren der verfeinerten Triangulationen nur für solche PSLGs<br />
definiert ist, deren Regionen ausschließlich Dreiecke sind, führen wir<br />
hierfür eine eigene Bezeichnung ein.<br />
Definition 7.6 (Maximaler PSLG) Ein PSLG, zu dem keine weitere<br />
Kante, die zwei Ecken des PSLGs verbindet, hinzugefügt werden kann<br />
ohne seine Planarität zu verletzen, heißt ein maximaler PSLG.<br />
Man kann leicht zeigen, daß in einem maximalen PSLG jede der beschränkten<br />
Regionen ein Dreieck ist und daß sich jeder PSLG der Gesamtkomplexität<br />
n durch Hinzunahme weiterer Kanten in einen maximalen<br />
PSLG verwandeln läßt, der (aufgrund von Korollar 7.3) ebenfalls<br />
eine Komplexität aus O(n) besitzt.<br />
Definition 7.7 (Triangulation) Einen maximalen PSLG, bei dem der<br />
Rand der äußeren unbeschränkten Region ebenfalls ein Dreieck ist, nennen<br />
wir eine Triangulation.<br />
Eine Triangulation einer endlichen Punktmenge P ⊂ E 2 ist ein maximaler<br />
PSLG, der genau P als Eckenmenge besitzt.<br />
Wir nehmen also im folgenden an, daß wir das Point-location-Problem<br />
für den Spezialfall einer Triangulation beantworten wollen.<br />
Dies ist keine sehr große Einschränkung, denn jeder PSLG der Gesamtkomplexität<br />
n kann durch Hinzunahme dreier zusätzlicher Ecken und<br />
weiterer Kanten in eine Triangulation der Gesamtkomplexität O(n) verwandelt<br />
werden:<br />
1. Hierzu bestimmen wir zunächst ein Dreieck, das alle Ecken des<br />
PSLGs umschließt, beispielsweise indem wir in linearer Zeit mittels<br />
der maximalen und minimalen x- und y-Koordinaten dem<br />
PSLG ein Rechteck umschreiben und für dieses mit konstantem<br />
Zeitbedarf ein umschließendes Dreieck bestimmen.<br />
Dieses Dreieck fügen wir dem PSLG hinzu und verbinden jeweils<br />
jede Ecke des Dreiecks mit einer geeigneten extremalen Ecke des<br />
PSLGs. Der Gesamtzeitaufwand für diesen Schritt ist aus O(n).<br />
2. Jetzt müssen wir noch jede der beschränkten polygonalen Regionen<br />
triangulieren. Chazelle konnte zeigen, daß sich jedes einfache<br />
Polygon in linearer Zeit triangulieren läßt [3] – allerdings mit<br />
einem völlig unpraktikablen Algorithmus, der kaum von praktischem<br />
Interesse ist.<br />
Die Triangulation aller beschränkten Regionen kostet uns somit<br />
ebenfalls nur O(n) Zeit.<br />
3. Die auf diese Weise ggf. neu entstehenden Dreiecksregionen müssen<br />
natürlich noch einen Verweis auf diejenige Region des ursprünglichen<br />
PSLGs erhalten, in welcher sie enthalten sind.
7.2 Das Verfahren der verfeinerten Triangulationen 85<br />
Algorithmus 7.1 Point-location in einer Subdivision-Hierarchie<br />
LOCATE(p)<br />
Input: Subdivision-Hierarchie T1, . . . , Th<br />
Anfragepunkt p<br />
1 CAND h ← alle Regionen von Th<br />
2 R ← diejenige Region aus CAND h, die p enthält<br />
3 i = h − 1<br />
4 while i > 0 do<br />
5 CAND i ← alle Elternregionen von R in Ti<br />
6 R ← diejenige Region aus CAND i , die p enthält<br />
7 i ← i − 1<br />
8 end while<br />
Output: R ist diejenige Region von T1, die den Punkt p enthält<br />
Wir erhalten somit folgendes zusammenfassendes Lemma, welches die<br />
Einschränkung auf Triangulationen beim Point-location-Problem rechtfertigt:<br />
Lemma 7.8 Zu einem gegebenen PSLG der Gesamtkomplexität n kann<br />
mit einem Zeitbedarf von O(n) eine Triangulation (der Gesamtkomplexität<br />
O(n)) erzeugt werden.<br />
7.2.3 Subdivision-Hierarchien<br />
linearer Zeitbedarf zum<br />
Triangulieren eines PSLGs<br />
Die zentrale Idee des Verfahrens ist nun, zu der gegebenen Triangulation<br />
T eine Folge T1, . . . , Th Triangulationen zu erzeugen (eine sog. subdivision<br />
hierarchy), für die folgendes gilt: subdivision hierarchy<br />
• T1 = T .<br />
• Jede Region R von Ti+1 besitzt Zeiger auf diejenigen Regionen R ′<br />
von Ti, für die R ∩ R ′ �= ∅ gilt (für 1 ≤ i < h). Diese Regionen<br />
heißen die Eltern von R in Ti.<br />
Die Zahl h bezeichnen wir hierbei als die Höhe der Subdivision-Hierarchie.<br />
Der Speicherplatzbedarf einer solchen Hierarchie ist offensichtlich<br />
die Summe der Einzelkomplexitäten der Triangulationen, O( �h i=1 |Ti|),<br />
plus den zusätzlichen Platzbedarf für die Verzeigerung.<br />
Für einen Anfragepunkt p kann jetzt die entsprechende Region aus T1, Point-location mittels<br />
die p enthält, mittels eines Durchlaufs durch die Subdivision-Hierarchie<br />
– beginnend bei Th – gefunden werden, siehe Algorithmus 7.1.<br />
Da der Point-in-polygon-Test für ein Dreieck in konstanter Zeit durchgeführt<br />
werden kann, ist der Gesamtzeitbedarf für Algorithmus 7.1 offensichtlich<br />
aus O( �h i=1 |CAND i|). Somit muß es unser Ziel sein, eine Subdivision-Hierarchie<br />
zu konstruieren, bei der sowohl die Höhe als auch<br />
die Größe der Mengen CAND i möglichst klein sind. Daß dies tatsächlich<br />
möglich ist, wollen wir im folgenden zeigen.<br />
Durchlauf durch die<br />
Subdivision-Hierarchie
86 Lokationsprobleme in der Ebene<br />
v<br />
Lemma 7.9 Es gibt positive Konstanten c und d, so daß für jede Triangulation<br />
T mit mehr als drei Ecken mit einem Zeitbedarf von O(|T|) eine<br />
Triangulation T ′ konstruiert werden kann, für die gilt<br />
• |T ′ | ≤ (1 − 1/c) · |T| ,<br />
• jede Region von T ′ hat höchstens d Eltern in T.<br />
Beweis: Sei n die Zahl der Ecken von T und sei v irgendeine innere<br />
Ecken von T, d. h. eine Ecke, die nicht auf dem Rand der unbeschränkten<br />
Region liegt, und sei g(v) ihr Grad (im zugehörigen Graphen).<br />
Dann grenzen an v genau g(v) Regionen und die Vereinigung<br />
dieser Regionen (die Nachbarschaft von v) ergibt ein sternförmiges Polygon<br />
mit g(v) Ecken.<br />
Wenn wir nun die Ecke v und die g(v) inzidenten Kanten aus dem PSLG<br />
entfernen und die Nachbarschaft von v neu triangulieren (durch Einfügen<br />
von g(v)−3 neuen Kanten), erhalten wir eine neue Triangulation mit<br />
n − 1 Ecken. Außerdem schneidet jede der neuen Regionen – unabhängig<br />
davon, wie retrianguliert wurde – maximal g(v) der ursprünglichen<br />
Regionen von T.<br />
Betrachten wir jetzt zwei unabhängige Ecken v und w, d. h. zwei Ecken,<br />
die nicht durch eine Kante verbunden sind, dann überlappen sich die<br />
Nachbarschaften dieser Ecken offensichtlich nicht. Somit können beide<br />
Ecken gleichzeitig aus dem PSLG entfernt und die Nachbarschaften<br />
retrianguliert werden. Die entstehende Triangulation hat dann die Eigenschaft,<br />
daß keine ihrer Regionen mehr als max{g(v), g(w)} der ursprünglichen<br />
Regionen von T schneidet.<br />
gleichzeitiges Entfernen Diese Argumention können wir jetzt ausdehnen auf eine Menge<br />
unabhängiger Ecken v1, . . . , vt paarweise unabhängiger Ecken in T. Durch Entfernen dieser<br />
Ecken und anschließendem Retriangulieren der t sternförmigen Polygone<br />
erhalten wir eine neue Triangulation T ′ mit n − t Ecken und der<br />
Eigenschaft, daß keine Region von T ′ mehr als max1≤i≤t g(vi) Regionen<br />
von T schneidet.<br />
durchschnittlicher<br />
Eckengrad ist ≤ 6<br />
Es genügt jetzt also noch zu zeigen, daß es Konstanten c und d gibt, so<br />
daß eine Menge v1, . . . , vt unabhängiger Ecken mit g(vi) ≤ d (für 1 ≤<br />
i ≤ t) und t ≥ |T| /c immer mit einem Zeitbedarf von O(|T|) bestimmt<br />
werden kann. Dies ist eine direkte Folge aus dem nächsten Lemma. ✷<br />
Lemma 7.10 Es gibt positive Konstanten c und d, so daß jeder PSLG mit<br />
n Ecken mindestens n/c unabhängige Ecken mit einem Grad kleiner<br />
oder gleich d besitzt. Diese können mit einem Zeitaufwand von O(n)<br />
bestimmt werden.<br />
Beweis: Nach Korollar 7.3 besitzt ein PSLG mit n Ecken höchstens<br />
3n − 6 Kanten. Da jede dieser Kanten zwei Ecken miteinander verbindet,<br />
gibt es also maximal 6n − 12 Kantenenden und der durchschnittliche<br />
Eckengrad ist somit kleiner oder gleich (6n − 12)/n ≤ 6. Dar-<br />
aus folgt, daß höchstens die Hälfte aller Ecken einen Grad größer oder
7.2 Das Verfahren der verfeinerten Triangulationen 87<br />
gleich 11 besitzen können, denn sonst stünden nicht genügend Kanten<br />
zur Verfügung. Wir wählen also d = 11 und bestimmen in linearer<br />
Zeit die Teilmenge V aller Ecken, deren Grad kleiner oder gleich 11 ist<br />
(mit |V| ≥ n/2).<br />
Mit einer einfachen Eliminationsstrategie können wir dann in linearer<br />
Zeit eine unabhängige Teilmenge von V bestimmen. Aufgrund des beschränkten<br />
Grades der Ecken in V werden pro ausgewählter Ecke v<br />
maximal 11 Ecken aus V eliminiert, die zu v adjazent sind. Somit<br />
bleiben mindestens noch |V| /12 ≥ n/24 Ecken übrig und wir erhalten<br />
c = 24. ✷<br />
Durch wiederholte Anwendung von Lemma 7.9 erhalten wir dann den<br />
folgenden Satz, der uns die Existenz einer Subdivision-Hierarchie mit<br />
den gewünschten Eigenschaften garantiert:<br />
Satz 7.11 Zu einem PSLG der Gesamtkomplexität n kann mit einem<br />
Zeitbedarf von O(n) eine Folge T1, . . . , Th von Triangulationen erzeugt<br />
werden mit folgenden Eigenschaften:<br />
• Jede Region von T1 ist ganz in einer Region des PSLGs enthalten.<br />
• Es gibt eine positive Konstante d, so daß jede Region von Ti+1<br />
höchstens d Eltern in Ti besitzt (für 1 ≤ i < h).<br />
• Der Gesamtspeicherbedarf der Hierarchie ist aus O(n).<br />
• Die Höhe h der Hierarchie ist aus O(log n).<br />
Beweis: Nach den einleitenden Überlegungen von oben kann der PSLG<br />
in linearer Zeit in eine Triangulation T1 überführt werden, so daß jede<br />
Region von T1 ganz in einer Region des PSLGs enthalten ist. Mittels<br />
Lemma 7.9 erhalten wir dann aus T1 eine echte Triangulation T2 mit<br />
|T2| ≤ (1 − 1/c) · |T1|. Durch mehrfache Anwendung des Lemmas (solange,<br />
bis die Triangulation nur noch aus einem einzigen Dreieck besteht)<br />
erhalten wir eine Folge von Triangulationen T1, . . . , Th, deren Komplexitäten<br />
geometrisch fallen, und es gilt<br />
|T1| ∈ O(n)<br />
|Ti+1| ≤ (1 − 1/c) i · |T1| für 1 ≤ i < h<br />
|Th| ∈ O(1)<br />
Wegen Lemma 7.9 besitzt für 1 ≤ i < h jede Region von Ti+1 höchstens<br />
d Eltern in Ti und der Gesamtspeicherbedarf von O( �h i=1 d·|Ti|) =<br />
O( �h i=1 d · (1 − 1/c)i−1 · n) ist damit aus O(n). Hierbei schätzt der (konstante)<br />
Faktor d den zusätzlichen Aufwand für die Verzeigerung ab.<br />
Außerdem folgt wegen (1 − 1/c) h−1 · |T1| ≥ |Th| ∈ O(1) sofort h ∈<br />
O(log n). ✷<br />
Aus der Existenz einer solchen Subdivision-Hierarchie erhalten wir<br />
dann sofort folgendes Korollar zur Methode der verfeinerten Triangulationen:
88 Lokationsprobleme in der Ebene<br />
Anfrage in Θ(log n)<br />
Preprocessing in Θ(n)<br />
Korollar 7.12 Das Point-location-Problem für einen PSLG der Gesamtkomplexität<br />
n kann mittels der Methode der verfeinerten Triangulationen<br />
mit einem optimalen Zeitbedarf von Θ(log n) beantwortet werden.<br />
Der Preprocessing-Aufwand (Zeit und Speicher) ist hierbei jeweils<br />
aus Θ(n).<br />
Beweis: Die logarithmische Anfragezeit ergibt sich aus dem Gesamtzeitbedarf<br />
von O( �h i=1 |CAND i|) für Algorithmus 7.1, der wegen<br />
|CAND i| ≤ d und h ∈ O(log n) logarithmisch in n ist. ✷<br />
Das Verfahren von Kirkpatrick ist somit in jeglicher Hinsicht optimal.<br />
Sowohl die Anfragezeit als auch der Zeit- und der Speicherbedarf<br />
für das Preprocessing genügen den unteren Schranken für das Pointlocation-Problem.<br />
Allerdings gibt es für praktische Probleme trotzdem sinnvollere Alternativen<br />
als dieses Verfahren. Denn zum einen wird schon ein triangulierter<br />
PSLG vorausgesetzt (und der Triangulatiosalgorithmus von Chazelle<br />
ist für praktische Belange indiskutabel) und zum anderen sind die<br />
in der O-Notationen versteckten Konstanten relativ groß. Trotzdem besticht<br />
dieses Verfahren durch seine konzeptionelle Einfachheit und der<br />
erreichten Optimalität bezüglich aller geforderten Kriterien »Anfragezeit«,<br />
»Preprocessing-Aufwand« und »Speicherbedarf«.
Nachbarschaftsprobleme<br />
Ein Nachbarschaftsproblem ist ganz allgemein und abstrakt durch folgende<br />
Größen charakterisiert:<br />
• Einen Raum X (in unserem Fall ist dies der zweidimensionale reelle<br />
Raum R 2 ),<br />
• eine (endliche) Menge P von Objekten (hier: eine Teilmenge P ⊂ X<br />
von Punkten),<br />
• eine Möglichkeit der Objekte, Einfluß auf den Raum auszuüben.<br />
In unserem Fall wird diese Einflußnahme eines Objektes p ∈ P auf<br />
einen Punkt x ∈ X des Raumes durch den Abstand d(p, x) ausgedrückt<br />
(je geringer d(p, x), desto größer der Einfluß von p auf x).<br />
Hierbei gehen wir davon aus, daß die Funktion d(x, y) eine Metrik<br />
auf X (meist die euklidische Metrik) ist, das Paar (X, d) also einen<br />
metrischen Raum darstellt.<br />
8<br />
Man interessiert sich nun z. B. bei einem Objekt p ∈ P für die Gestalt<br />
und die Größe seines Einflußbereiches, d. h. für diejenige Region, für die<br />
der Einfluß von p stärker ist als der Einfluß eines der anderen Objekte<br />
(vgl. das Problem »Nähestes Telefon« in Abschnitt 1.2). Ein weiteres<br />
typisches Nachbarschaftsproblem ist, für einen Punkt x ∈ X dasjenige<br />
Objekt p ∈ P zu bestimmen, das den stärksten Einfluß auf x ausübt,<br />
also dasjenige Objekt, in dessen Einflußbereich x liegt. Dies wird als das<br />
Problem des nächsten Nachbarn (engl. nearest neighbor problem) bezeichnet. Nearest-Neighbor-Problem<br />
Solche Überlegungen führen uns im folgenden zum Begriff der Voronoi-<br />
Region und des Voronoi-Diagramms.<br />
8.1 Definition und Eigenschaften des Voronoi-<br />
Diagramms<br />
Im folgenden gehen wir – sofern nicht anders angegeben – immer davon<br />
aus, daß unsere Objekte Punkte im zweidimensionalen euklidischen<br />
Raum E2 sind. Insbesondere wird also der Einfluß eines Objekts p auf<br />
einen Punkt x durch die euklidische Metrik<br />
�<br />
|p x| = (p1 − x1) 2 + (p2 − x2) 2
90 Nachbarschaftsprobleme<br />
Abbildung 8.1<br />
Bisektoren in der<br />
Manhattan-Metrik (links)<br />
und der<br />
Maximum-Metrik (rechts)<br />
p<br />
Bisektor<br />
B(p, q)<br />
q<br />
flächige Bisektoren<br />
beschrieben.<br />
Wir betrachten nun zunächst den Fall von nur zwei Punkten p und q<br />
und interessieren uns für die Grenze zwischen ihren Einflußbereichen,<br />
den sog. Bisektor der beiden Punkte.<br />
Definition 8.1 (Bisektor) Der Bisektor B(p, q) zweier Punkte p und q<br />
im E2 ist definiert als<br />
Da die letzte Zeile der Umformung<br />
x ∈ B(p, q) ⇐⇒ |p x| = |q x|<br />
B(p, q) := { x ∈ E 2 � � |p x| = |q x| } . (8.1)<br />
⇐⇒ (p1 − x1) 2 + (p2 − x2) 2 = (q1 − x1) 2 + (q2 − x2) 2<br />
⇐⇒ p 2 1 − 2p1x1 + x 2 1 + p 2 2 − 2p2x2 + x 2 2 =<br />
q 2 1 − 2q1x1 + x 2 1 + q 2 2 − 2q2x2 + x 2 2<br />
⇐⇒ x1(2q1 − 2p1)<br />
+ x2(2q2 − 2p2)<br />
− (q 2 1 + q 2 2 − p 2 1 − p 2 2) = 0<br />
die Normalenform einer Geraden im R2 darstellt, ist der Bisektor B(p, q)<br />
für die euklidische Metrik eine Gerade (nämlich genau die Mittelsenkrechte<br />
des Liniensegments [p q]).<br />
Bemerkung 8.2 Legen wir andere Metriken als die euklidische Metrik<br />
zugrunde, können durchaus auch „kompliziertere“ Gebiete als Bisektoren<br />
auftreten. Abbildung 8.1 zeigt beispielsweise links Bisektoren bei<br />
Verwendung der Manhattan-Metrik und rechts bei Verwendung der<br />
Maximum-Metrik (siehe deren Definition auf Seite 6). Offenbar können<br />
hier sogar flächige Bisektoren auftreten: Bei der Manhattan-Metrik tritt<br />
ein solcher Spezialfall ein, wenn die beiden Punkte gegenüberliegende<br />
Eckpunkte eines Quadrats sind, und bei der Maximum-Metrik, wenn sie<br />
gleiche x- oder y-Koordinaten besitzen. ⊳<br />
Der (euklidische) Bisektor für zwei Punkte p und q zerlegt die Ebene in<br />
zwei Halbebenen, nämlich in<br />
D(p, q) := { x ∈ E 2 � � |p x| < |q x| }
8.1 Definition und Eigenschaften des Voronoi-Diagramms 91<br />
und<br />
D(q, p) = { x ∈ E 2 � � |p x| > |q x| } ,<br />
mittels derer wir jetzt auch für mehr als zwei Punkte deren Einflußbereiche<br />
– ihre sog. Voronoi-Regionen – definieren können.<br />
Definition 8.3 (Voronoi-Diagramm)<br />
Für eine Menge P = {p1, . . . , pn} ⊂ E2 von n Punkten in der Ebene ist<br />
die Voronoi-Region des Punktes pi ∈ P die Menge Voronoi-Region<br />
VR(pi) := �<br />
D(pi, pj) .<br />
Die Menge<br />
1≤j≤n<br />
j�=i<br />
VD(P) := E 2 \ �<br />
1≤i≤n<br />
VR(pi)<br />
bezeichnen wir als das Voronoi-Diagramm der Punktmenge P. Voronoi-Diagramm<br />
Aufgrund der Definition ist die Voronoi-Region VR(pi) eines Punktes pi<br />
der Schnitt von n − 1 offenen Halbebenen, die jeweils alle pi enthalten.<br />
Somit besitzt VR(pi) innere Punkte und kann als konvexes (möglicherweise<br />
unbeschränktes) Polygon dargestellt werden, das von maximal<br />
n − 1 Ecken und maximal n − 1 Kanten (bzw. Halbstrahlen) berandet<br />
wird. Das Voronoi-Diagramm besteht dann gerade aus denjenigen Bisektorteilen,<br />
die nicht im Innern eines dieser Polygone liegen. Der folgende<br />
Satz beschreibt deren Struktur etwas genauer:<br />
Satz 8.4 Sei P = {p1, . . . , pn} ⊂ E 2 eine Menge von n Punkten in der<br />
Ebene. Falls alle Punkte auf einer Geraden liegen, dann besteht das<br />
Voronoi-Diagramm aus n − 1 parallelen Geraden, ansonsten ist VD(P)<br />
wegzusammenhängend und besteht nur aus Segmenten und Halbstrahlen.<br />
Beweis: Die erste Aussage des Satzes ist einfach nachzuprüfen, wir zeigen<br />
deshalb gleich die zweite Aussage und nehmen an, daß nicht alle<br />
n ≥ 3 Punkte auf einer Geraden liegen.<br />
Wir zeigen zunächst, daß VD(P) nur aus Segmenten und Halbstrahlen<br />
besteht. Angenommen, dies wäre nicht der Fall, dann müßte VD(P) eine<br />
Gerade g enthalten, welche auf dem Rand zweier Voronoi-Regionen<br />
– o. B. d. A. VR(pi) und VR(pj) – liegt. Sei nun pk ∈ P ein Punkt, der<br />
nicht kollinear zu pi und pj liegt. Dann ist der Bisektor B(pk, pj) nicht pi pj<br />
parallel zu g und schneidet die Gerade. Somit kann aber der Teil der<br />
Geraden g, der im Innern von D(pk, pj) liegt, nicht zum Voronoi-Diagramm<br />
gehören und wir erhalten einen Widerspruch.<br />
Wir müssen jetzt nur noch zeigen, daß VD(P) wegzusammenhängend<br />
ist. Wäre dem nicht so, dann müßte es eine Voronoi-Region VR(pi) geben,<br />
die die komplette Ebene teilt. Da Voronoi-Regionen konvex sind,<br />
g<br />
pk
92 Nachbarschaftsprobleme<br />
Abbildung 8.2<br />
Die drei möglichen Fälle<br />
eines Punktes x der Ebene<br />
Repräsentation des<br />
Voronoi-Diagramms als<br />
PSLG<br />
VR(pi) unbeschränkt<br />
⇐⇒ pi ∈ ∂CH(P)<br />
x<br />
pi<br />
x<br />
müßte VR(pi) aus einem Streifen bestehen, der von zwei parallelen Geraden<br />
begrenzt wird. Dies ist aber – wie eben gezeigt – nicht möglich.<br />
✷<br />
Außer für den einfachen Spezialfall von n kollinearen Punkten ist das<br />
Voronoi-Diagramm also wegzusammenhängend und kann als PSLG<br />
(siehe Abschnitt 5.6) repräsentiert werden, sofern wir die Halbstrahlen,<br />
welche die unbeschränkten Regionen beranden, geeignet berücksichtigen.<br />
Die Voronoi-Knoten und Voronoi-Kanten entsprechen dann den Knoten<br />
und Kanten (bzw. Halbstrahlen) des PSLGs.<br />
Das folgende Lemma gestattet uns, jeden Punkt der Ebene eindeutig<br />
einer der drei Mengen »Voronoi-Knoten«, »Voronoi-Kante« oder<br />
»Voronoi-Region« zuzuordnen. Ein Beweis dieses Lemmas findet sich<br />
z. B. in [14, S. 215].<br />
Lemma 8.5 Für einen Punkt x ∈ E 2 sei C(x) die kleinste abgeschlossene<br />
ε-Kugel U ε(x) um x,<br />
pi<br />
pj<br />
U ε(x) = { y ∈ E 2 � � |x y| ≤ ε } ,<br />
die mindestens einen Punkt aus P = {p1, . . . , pn} enthält. Dann gilt:<br />
P ∩ C(x) = {pi} ⇐⇒ x liegt in der Voronoi-Region VR(pi) des Punktes<br />
pi (siehe Abbildung 8.2, links).<br />
P ∩ C(x) = {pi, pj} ⇐⇒ x liegt auf der Voronoi-Kante, die die Regionen<br />
VR(pi) und VR(pj) begrenzt (siehe Abbildung 8.2, Mitte).<br />
P ∩ C(x) = {pi1 , . . . , pik } (mit k ≥ 3) ⇐⇒ x ist ein Voronoi-Knoten,<br />
an den die Regionen VR(pi1 ), . . . , VR(pik ) angrenzen. Dabei entspricht<br />
die zyklische angulare Ordnung der Punkte pi1 , . . . , pik<br />
um x der Ordnung ihrer Voronoi-Regionen um x (siehe Abbildung<br />
8.2, rechts).<br />
Mit Hilfe dieses Lemmas können wir eine interessante Eigenschaft der<br />
unbeschränkten Regionen des Voronoi-Diagramms beweisen:<br />
Satz 8.6 Eine Voronoi-Region VR(pi) eines Punktes pi ∈ P ist genau<br />
dann unbeschränkt, wenn der Punkt pi auf dem Rand der konvexen<br />
Hülle von P liegt.<br />
pk<br />
x<br />
pi<br />
pj
8.1 Definition und Eigenschaften des Voronoi-Diagramms 93<br />
Beweis: Angenommen, die Voronoi-Region VR(pi) ist unbeschränkt.<br />
Dann muß es einen weiteren Punkt pj geben, so daß ein unbeschränktes<br />
Stück des Bisektors B(pi, pj) zum Voronoi-Diagramm VD(P) gehört.<br />
Wir wählen einen Punkt x auf diesem Stück und betrachten den in Lemma<br />
8.5 definierten Kreis C(x), auf dessen Rand die beiden Punkte pi<br />
und pj liegen.<br />
Schieben wir x auf der unbeschränkten Voronoi-Kante weit genug<br />
nach rechts (ins „Unendliche“), können wir jeden Punkt in der rechten<br />
(durch pi und pj induzierten) Halbebene mit C(x) überdecken. Da<br />
nach Lemma 8.5 der Kreis C(x) keinen weiteren Punkt aus P enthalten<br />
kann, müssen alle übrigen Punkte aus P \ {pi, pj} in der linken Halbebene<br />
liegen und das Segment [pi pj] liegt auf dem Rand der konvexen<br />
Hülle CH(P).<br />
Sind umgekehrt pi und pj zwei benachbarte Ecken von CH(P) und<br />
liegt P o. B. d. A. links der Geraden pi pj, dann läßt sich immer ein Halbstrahl<br />
auf dem Bisektor B(pi, pj) finden (indem wir weit genug nach<br />
rechts wandern), so daß jeder Kreis C(x) mit einem Mittelpunkt x auf<br />
dem Halbstrahl keinen weiteren Punkt aus P\{pi, pj} mehr enthält. Folglich<br />
bildet ein unbeschränktes Stück von B(pi, pj) – nämlich eben jener<br />
Halbstrahl – eine Voronoi-Kante und auch VR(pi) und VR(pj) sind unbeschränkt.<br />
✷<br />
Für das Voronoi-Diagramm als eine Unterteilung der Ebene in Regionen<br />
größten Einflusses interessiert uns natürlich, wie komplex diese Unterteilung<br />
sein kann:<br />
Satz 8.7 Das Voronoi-Diagramm einer n-elementigen Punktmenge in<br />
der Ebene besteht aus höchstens 2n − 5 Ecken und 3n − 6 Kanten.<br />
Beweis: Falls alle n Punkte auf einer Geraden liegen, folgt die Behauptung<br />
sofort aus Satz 8.4. Wir nehmen deshalb an, dies wäre nicht der Fall<br />
und erweitern das Voronoi-Diagramm zu einem (zusammenhängenden)<br />
planaren Graphen, indem wir eine zusätzliche Ecke einführen, die wir<br />
mit allen Halbstrahlen (von denen es mindestens drei geben muß) verbinden.<br />
Auf diese Weise erhalten wir einen Graphen, dessen Knoten<br />
alle einen Grad von mindestens 3 besitzen, und wir können Korollar 7.4<br />
darauf anwenden. Die Flächenzahl f des Graphen ist dabei gleich der<br />
Zahl n der Punkte, die Kantenzahl e gleich der Zahl der Voronoi-Kanten<br />
und die Eckenzahl v gleich der Zahl der Voronoi-Knoten plus eins.<br />
Somit folgt die Behauptung aus Ungleichung (7.3). ✷<br />
Die Komplexität des Voronoi-Diagramms für eine Punktmenge ist also<br />
nur linear in der Zahl der Punkte. Zusammen mit Satz 8.6 auf der vorherigen<br />
Seite erhalten wir dann aus dem vorherigen Satz sofort die folgende<br />
Aussage zur Konstruktion der konvexen Hülle einer Punktmenge:<br />
Korollar 8.8 Aus dem Voronoi-Diagramm VD(P) einer n-elementigen<br />
Punktmenge P kann mit einem Zeitbedarf von O(n) die konvexe Hülle<br />
CH(P) konstruiert werden.<br />
L R<br />
pj<br />
pi<br />
x<br />
∞
94 Nachbarschaftsprobleme<br />
unt. Schr. von Ω(n log n)<br />
für Voronoi-Diagramm<br />
Delaunay-Zerlegung<br />
DG(P) ist planar<br />
Beweis: Für das gegebene Voronoi-Diagramm müssen wir nur eine<br />
unbeschränkte Regionen finden und uns dann an den unbeschränkten<br />
Kanten entlang einmal um die Punktmenge herum bewegen. Dabei<br />
wird jede Voronoi-Kante höchstens einmal inspiziert und der Gesamtzeitbedarf<br />
ist aus O(n). ✷<br />
Aufgrund der unteren Schranke von Ω(n log n) aus Satz 6.3 für die Konstruktion<br />
der konvexen Hülle ergibt sich damit auch sofort eine untere<br />
Schranke für die Konstruktion des Voronoi-Diagramms:<br />
Korollar 8.9 Die Konstruktion des Voronoi-Diagramms von n Punkten<br />
in der Ebene besitzt einen Zeitbedarf von Ω(n log n).<br />
8.2 Der Delaunay-Graph<br />
Definition 8.10 (Delaunay-Graph) Sei P eine Menge von n Punkten<br />
in der Ebene und E die Menge aller Voronoi-Kanten im Voronoi-Diagramm<br />
VD(P). Der ungerichtete Graph DG(P) = (P, E, γ) mit Eckenmenge<br />
P, Kantenmenge E und einer Abbildung<br />
γ: e ↦→ {pi, pj} für eine Voronoi-Kante e auf dem Bisektor B(pi, pj)<br />
heißt der Delaunay-Graph zur Menge P.<br />
Seine geometrische Realisierung, die jede Ecke auf den zugehörigen<br />
Punkt in der Ebene und jede Kante e = {pi, pj} auf das Liniensegment<br />
[pi pj] abbildet, heißt die von der Punktmenge P induzierte Delaunay-Zerlegung.<br />
Ein Liniensegment [pi pj] dieser Zerlegung nennt man<br />
auch Delaunay-Kante.<br />
Aufgrund der Konvexität der Voronoi-Regionen gibt es zu jedem<br />
Bisektor B(pi, pj) höchstens eine Voronoi-Kante. Somit enthält der<br />
Graph DG(P) auch höchstens eine Kante zwischen je zwei Punkten<br />
pi, pj ∈ P. Für die vom Delaunay-Graphen induzierte Zerlegung<br />
der Ebene können wir damit eine wichtige Eigenschaft zeigen:<br />
Satz 8.11 Die zu einem Delaunay-Graphen DG(P) gehörende Delaunay-<br />
Zerlegung ist kreuzungsfrei, d. h. der Graph DG(P) ist planar.<br />
Beweis: Wir nehmen an, es gäbe zwei Segmente [pi pj] und [pk pl] in<br />
der Delaunay-Zerlegung, die sich in einem Punkt x schneiden (oder<br />
überlappen). Für den in Lemma 8.5 definierten Kreis C(x) gilt dann<br />
P ∩ C(x) = {pi, pj}, da x auf der Voronoi-Kante zu den Regionen VR(pi)<br />
und VR(pj) liegt. Andererseits gilt aber auch P ∩ C(x) = {pk, pl}, da x<br />
auch auf der Voronoi-Kante zu den Regionen VR(pk) und VR(pl) liegt.<br />
Somit müssen die beiden Segmente identisch sein, was aber – nach obiger<br />
Anmerkung – unmöglich ist. ✷<br />
Bemerkung 8.12 Aus obigen Definitionen und Überlegungen folgt, daß
8.2 Der Delaunay-Graph 95<br />
• jeder Voronoi-Region eine Ecke in DG(P),<br />
• jeder Voronoi-Kante eine Kante in DG(P),<br />
• jedem Voronoi-Knoten eine Region in der zu DG(P) gehörenden<br />
Delaunay-Zerlegung<br />
entspricht. Das Voronoi-Diagramm VD(P) und der Delaunay-<br />
Graph DG(P) sind somit zueinander dual und lassen sich auch in<br />
linearer Zeit ineinander überführen.<br />
VD(P) und DG(P) sind<br />
zueinander dual<br />
Insbesondere hat auch jede beschränkte Region in DG(P) genau so viele<br />
Kanten, wie bei ihrem zugehörigen Knoten in VD(P) zusammenlaufen.<br />
Besitzt also jeder Voronoi-Knoten genau den Grad 3 (d. h. jeder<br />
Kreis C(x) enthält höchstens drei Punkte aus P), dann sind alle beschränkten<br />
Regionen von DG(P) Dreiecke und wir erhalten einen maximalen<br />
PSLG. Aus diesem Grund nennt man DG(P) bzw. die zugehörige<br />
Delaunay-Zerlegung auch eine Delaunay-Triangulation der Punktmen- Delaunay-Triangulation<br />
ge P, selbst wenn der Rand der unbeschränkten Region kein Dreieck ist<br />
oder obige Bedingung nicht erfüllt ist.<br />
Im letzten Fall kann es sich dann bei den übrigen beschränkten Regionen<br />
nur um konvexe Polygone handeln, deren Ecken alle auf dem Kreis C(x)<br />
um den entsprechenden Voronoi-Knoten x liegen, und die sich leicht<br />
„nachtriangulieren“ lassen. Mit Ausnahme dieses Spezialfalls von mehr<br />
als drei kozirkular liegenden Punkten ist die Delaunay-Triangulation somit<br />
eindeutig bestimmt. ⊳<br />
Die Delaunay-Kanten und die Dreiecke in der Delaunay-Zerlegung können<br />
wir noch etwas genauer charakterisieren:<br />
Lemma 8.13 Für eine Punktmenge P und ihre zugehörige Delaunay-Triangulation<br />
DG(P) gilt:<br />
• Zwei Punkte pi, pj ∈ P sind genau dann durch eine Delaunay-<br />
Kante miteinander verbunden, wenn es einen Kreis gibt, der nur pi<br />
und pj auf seinen Rand enthält und keinen Punkt aus P in seinem<br />
Innern.<br />
• Drei nicht-kollineare Punkte pi, pj, pk ∈ P induzieren genau dann<br />
ein Dreieck der Delaunay-Triangulation, wenn der Umkreis des<br />
Dreiecks (d. h. der eindeutig bestimmte Kreis durch pi, pj und pk<br />
keinen weiteren Punkte aus P auf seinem Rand oder in seinem Innern<br />
enthält.<br />
Beweis: Nach Definition 8.10 sind zwei Punkte pi, pj ∈ P genau<br />
dann durch eine Delaunay-Kante miteinander verbunden, wenn es eine<br />
Voronoi-Kante auf dem Bisektor B(pi, pj) gibt. Dies ist nach Lemma 8.5<br />
gleichbedeutend damit, daß es einen Punkt x auf dieser Voronoi-Kante<br />
gibt mit P ∩ C(x) = {pi, pj}.<br />
Die zweite Behauptung zeigt man analog. ✷
96 Nachbarschaftsprobleme<br />
beliebige Triangulation<br />
Delaunay-Triangulation<br />
☞ WWW<br />
Mit Hilfe dieser Aussage erhalten wir sofort eine alternative Charakterisierung<br />
einer Delaunay-Triangulation:<br />
Satz 8.14 Sei P ⊂ E 2 eine endliche Punktmenge in der Ebene und T<br />
eine Triangulation von P. Dann ist T eine Delaunay-Triangulation von P,<br />
genau dann wenn der Umkreis einer jeden Dreiecksregion von T keinen<br />
Punkt von P in seinem Innern enthält.<br />
Die Delaunay-Triangulation besitzt noch viele weitere interessante Ei-<br />
genschaften, unter anderem eine, die z. B. bei der Erzeugung von Oberflächennetzen<br />
(engl. mesh generation) eine wichtige Rolle spielt: Hier<br />
kommt es nämlich darauf an, daß für eine gegebene Punktmenge nicht<br />
irgendeine Triangulation verwendet wird, sondern eine, die hinsichtlich<br />
bestimmter Kriterien, die von der Anwendung vorgegeben werden, optimal<br />
ist. Ein solches Kriterium ist beispielsweise, daß die erzeugten<br />
Dreiecke in der Triangulation möglichst keine spitzen Winkel aufweisen<br />
sollen. Diesbezüglich ist die Delaunay-Triangulation im gewissen Sinn<br />
optimal, wie der folgende Satz zeigt. Ein Beweis findet sich z. B. in [14,<br />
S. 236].<br />
Satz 8.15 Sei P eine Menge von Punkten in der Ebene, die nicht alle auf<br />
einer Geraden liegen und von denen keine vier auf einem gemeinsamen<br />
Kreisrand liegen. Dann haben die Dreiecke der Delaunay-Triangulation<br />
DG(P) unter allen Triangulationen von P den größten minimalen Innenwinkel,<br />
d. h.<br />
min{ α � � α ist Innenwinkel eines Dreiecks von DG(P) }<br />
=<br />
max<br />
Triangulation T von P min{ α � � α ist Innenwinkel eines Dreiecks von T } .<br />
Zum interaktiven Experimentieren mit Voronoi-Diagrammen und Delaunay-Triangulationen<br />
kann das Java-Applet »VoroGlide« der FernUniversität<br />
Hagen verwendet werden (�������������������������������<br />
���������������).<br />
8.3 Verallgemeinerungen<br />
Neben dem Voronoi-Diagramm für Punkte in der euklidischen Ebene<br />
gibt es eine Vielzahl von Möglichkeiten, den Nachbarschaftsbegriff zu<br />
verallgemeinern, siehe z. B. [1]. Einige sollen im folgenden exemplarisch<br />
genannt werden:<br />
Allgemeinere Abstandsbegriffe für Punkte In Bemerkung 8.2 haben<br />
wir schon am Beispiel der Manhattan- und der Maximum-Metrik<br />
gesehen, daß sich die Definition des Bisektors auch auf andere Metriken<br />
als der euklidischen Metrik übertragen läßt, beispielsweise<br />
auf die Familie der Minkowski-Metriken Lp(x, y) mit p = 1, . . . , ∞
8.3 Verallgemeinerungen 97<br />
(siehe deren Definition auf auf Seite 6). Die Funktionen Lp gehören<br />
hierbei zu einer Menge spezieller durch Normen induzierter Metriken,<br />
die in der <strong>Algorithmische</strong>n <strong>Geometrie</strong> auch als symmetrische<br />
konvexe Distanzfunktionen bezeichnet werden.<br />
Die meisten strukturellen Eigenschaften des Voronoi-Diagramms<br />
lassen sich hierbei auf diese Klasse von Distanzfunktionen übertragen,<br />
mit dem Hauptunterschied, daß die Bisektoren gekrümmt<br />
sind.<br />
Weitere Informationen und zwei Java-Applets zum Experimentieren<br />
finden sich auf der Seite der FernUniversität Hagen über<br />
(nicht notwendigerweise symmetrische) konvexe Distanzfunktionen<br />
(��������������������������������������������������<br />
������������������������������ ). WWW☞<br />
Allgemeinere Objekte Wir haben uns bisher auf die einfachste Menge<br />
P ⊂ E 2 von Objekten eingeschränkt, die denkbar ist – auf Punkte.<br />
Wenn man die Abstandsfunktion d(p, x), die den Einfluß des<br />
Objekts p auf den Punkt x ∈ E 2 beschreibt, geeignet wählt, kann<br />
man aber auch kompliziertere Objekte zulassen, beispielsweise Liniensegmente.<br />
Hierzu definieren wir für ein Segment l dessen Abstand<br />
zu einem Punkt x.<br />
d(l, x) := min |x y|<br />
y∈l<br />
Die Bisektoren zwischen zwei Liniensegmenten, die wir auf diese<br />
Weise erhalten, sind wieder gekrümmt und bestehen i. allg. aus<br />
Halbstrahlen, Liniensegmenten und Parabelstücken.<br />
Voronoi-Diagramme höherer Ordnung Das klassische Voronoi-Diagramm<br />
VD(P) unterteilt die Ebene so in Regionen, daß alle Punkte<br />
einer Region denselben nächsten Nachbarn in der Menge P besitzen.<br />
Zerlegt man dagegen für eine Zahl k zwischen 1 und n − 1 die<br />
Ebene so in Regionen, daß alle Punkte aus einer Region dieselben k<br />
nächsten Nachbarn besitzen, erhält man das sog. Voronoi-Diagramm<br />
der Ordnung k, i. Z. VDk(P). Dabei ist VD1(P) gerade das klassische<br />
Voronoi-Diagramm und VDn−1(P) ist die Unterteilung in<br />
Gebiete gleicher entferntester Nachbarn.<br />
Höherdimensionale Räume Eine Verallgemeinerung des Voronoi-Diagramms<br />
in Räume höherer Dimension liegt nahe und ist auch<br />
möglich, allerdings gehen hierbei viele der oben gezeigten Eigenschaften<br />
verloren. So besteht z. B. das Voronoi-Diagramm im dreidimensionalen<br />
euklidischen Raum zwar immer noch aus konvexen<br />
Regionen, seine Größe ist aber nicht mehr linear in der Zahl<br />
der Punkte, sondern quadratisch.<br />
Voronoi-Diagramm der<br />
Ordnung 2
98 Nachbarschaftsprobleme<br />
Bisektor von L und R<br />
8.4 Konstruktion des Voronoi-Diagramms<br />
Wir wollen im folgenden zwei Verfahren mit jeweils optimaler Laufzeit<br />
Θ(n log) zur Berechnung des Voronoi-Diagramms einer Punktmenge<br />
in der euklidischen Ebene beschreiben – einen Divide-and-conquer-<br />
Ansatz ähnlich dem Verfahren zur Konstruktion der konvexen Hülle aus<br />
Abschnitt 6.5 sowie ein Sweep-line-Verfahren. Die Algorithmen sollen<br />
dabei nur skizziert werden. Weiterführende Informationen finden sich<br />
zum Divide-and-conquer-Algorithmus in [14, S. 295] und zur Sweepline-Methode<br />
in [5, S. 149] und [14, S. 286].<br />
Aufgrund der Dualität von Voronoi-Diagramm und Delaunay-Triangulation<br />
kann natürlich mit allen Verfahren auch die Delaunay-Triangulation<br />
einer Punktmenge bestimmt werden. Da der lineare Überführungsaufwand<br />
(siehe Bemerkung 8.12 auf Seite 94) geringer ist als die untere<br />
Laufzeitschranke für die Konstruktion des Voronoi-Diagramms (siehe<br />
Korollar 8.9 auf Seite 94) ist Ω(n log n) auch eine untere Schranke für die<br />
Konstruktion der Delaunay-Triangulation und jedes Verfahren, welches<br />
die eine Struktur berechnet, kann zu einem Verfahren erweitert werden,<br />
welches die andere Struktur mit demselben Zeitbedarf bestimmt.<br />
8.4.1 Divide-and-conquer-Verfahren<br />
Die Grundidee des Divide-and-conquer-Verfahrens zur Bestimmung<br />
des Voronoi-Diagramms ist ganz ähnlich wie bei der Konstruktion der<br />
konvexen Hülle: Wie in Bemerkung 6.13 auf Seite 76 beschrieben, teilen<br />
wir mit linearem Zeitbedarf die Punktmenge P in zwei etwa gleich<br />
große Mengen L und R, deren konvexe Hüllen disjunkt sind – beispielsweise<br />
mittels des Medians der x-Koordinaten.<br />
Die Voronoi-Diagramme der beiden Mengen werden dann rekursiv<br />
bestimmt und müssen nun noch zu einem gemeinsamen Voronoi-Diagramm<br />
für die ursprüngliche Menge verschmolzen werden (siehe Abbildung<br />
8.3 auf der gegenüberliegenden Seite). Hierzu betrachten wir die<br />
Kanten im Voronoi-Diagramm VD(P) der Ursprungsmenge P. Offenbar<br />
gibt es zwei Arten von Voronoi-Kanten:<br />
1. Kanten, die zwischen Voronoi-Regionen von Punkten aus derselben<br />
Teilmenge L oder R von P verlaufen. Solche Kanten sind schon<br />
in den Voronoi-Diagrammen VD(L) und VD(R) enthalten, sind<br />
dort aber ggf. länger.<br />
2. Kanten, die zwischen einer L-Region und einer R-Region verlaufen.<br />
Zusammen bilden diese Kanten die Menge<br />
B(L, R) := { x ∈ E 2 � � min<br />
p∈L<br />
|p x| = min |q x| }<br />
q∈R<br />
aller Punkte, die einen nächsten Nachbarn in L und einen in R besitzen,<br />
genannt den Bisektor von L und R.
8.4 Konstruktion des Voronoi-Diagramms 99<br />
Man kann nun zeigen, daß der Bisektor B(L, R) immer eine (unbeschränkte)<br />
polygonale Kette ist, die zudem monoton bez. der Separationsgeraden<br />
der beiden Mengen L und R ist. 1 Das Voronoi-Diagramm<br />
VD(P) kann man dann konstruieren, indem man die beiden Teil-<br />
Diagramme VD(L) und VD(R) längs des Bisektors B(L, R) aufschneidet<br />
und den linken Teil von VD(L) mit B(L, R) und mit dem rechten Teil<br />
von VD(R) verbindet (siehe Abbildung 8.3). Das Hauptproblem ist also,<br />
den Bisektor B(L, R) der beiden Mengen L und R zu bestimmen, denn<br />
das Verschmelzen der beiden Voronoi-Diagramme ist (bei gegebenem<br />
Bisektor) mit linearem Zeitbedarf möglich bzw. kann sogar schon bei<br />
dessen Konstruktion ausgeführt werden.<br />
Um den Bisektor zu ermitteln, sucht man zunächst eines seiner beiden<br />
unbeschränkten Teilstücke. Diese werden aber durch genau diejenigen<br />
Punkte aus L und R induziert, die auch die in Bemerkung 6.13 eingeführten<br />
oberen und unteren Tangenten (an die konvexen Hüllen) bestimmen,<br />
und können somit in linearer (bzw. mittels binärer Suche sogar in logarithmischer)<br />
Zeit ermittelt werden.<br />
Nachdem wir eines der unbeschränkten Stücke des Bisektors gefunden<br />
haben (o. B. d. A. sei dies das zur unteren Tangente durch die beiden<br />
Punkte li ∈ L und rj ∈ R gehörende Stück), arbeiten wir uns in beiden<br />
Voronoi-Diagrammen VD(L) und VD(R) gleichzeitig von unten nach<br />
oben vor. Wir starten jeweils in den beiden Regionen VR(li) und VR(rj),<br />
die das unbeschränkte Bisektorstück induzieren, und prüfen dann, ob<br />
der Bisektor B(li, rj) als nächstes eine Nachbarregion VR(lk) von VR(li)<br />
oder eine Nachbarregion VR(rl) von VR(rj) erreicht. Dies können wir<br />
durch einen geeigneten Durchlauf der Kanten von VR(li) und VR(rj)<br />
erreichen. Die so ermittelte Region VR(lk) bzw. VR(rl), welche vom<br />
1 Monoton bedeutet hier, daß jede zur Separationsgeraden senkrecht stehende Gerade<br />
die Kette B(L, R) maximal einmal schneidet.<br />
Abbildung 8.3<br />
Verschmelzen der beiden<br />
Voronoi-Diagramme
100 Nachbarschaftsprobleme<br />
Abbildung 8.4<br />
Bei einem neuen Punkt<br />
ändert sich das Voronoi-<br />
Diagramm auch links der<br />
Sweep line<br />
Zeitbedarf von Θ(n log n)<br />
für Divide-and-conquer-<br />
Verfahren<br />
Bisektor als nächstes betreten wird, übernimmt dann die Rolle der Region<br />
VR(li) bzw. VR(rj), die der Bisektor verläßt.<br />
Auf diese Weise hangeln wir uns von unten nach oben durch die beiden<br />
Teil-Diagramme, bis wir bei denjenigen Punkten angelangt sind, die die<br />
obere Tangente der konvexen Hülle bestimmen. Eine sorgfältige Implementation<br />
und Analyse garantieren dabei, daß jede Voronoi-Kante der<br />
beiden Teil-Diagramme nur höchstens einmal besucht wird. Somit kann<br />
der Bisektor B(L, R) in linearer Zeit bestimmt werden.<br />
Für die Gesamtlaufzeit des Algorithus erhalten wir dann wieder dieselbe<br />
Rekursionsgleichung wie bei der Konstruktion der konvexen Hülle<br />
in Abschnitt 6.5 und somit den folgenden Satz:<br />
Satz 8.16 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />
Voronoi-Diagramm mittels des Divide-and-conquer-Verfahrens bei<br />
linearem Speicherbedarf mit einem optimalen Zeitbedarf von Θ(n log n)<br />
bestimmt werden.<br />
8.4.2 Sweep-line-Verfahren<br />
Die Grundidee bei diesem Verfahren ist natürlich wieder – wie bei allen<br />
Sweep-line-Verfahren – eine senkrechte Linie von links nach rechts über<br />
die Punkte aus P gleiten zu lassen und sich in der Vertikalstruktur den<br />
Schnitt der Sweep line mit dem aktuellen Voronoi-Diagramm zu merken.<br />
Jeder neu entdeckte Punkt würde dann ein Einfügeereignis und<br />
jeder Schnitt zweier auf der Sweep line benachbarter Voronoi-Kanten<br />
ein Schnittereignis (und ggf. ein Löschereignis) bewirken.<br />
Problem bei der Das Problem hierbei ist allerdings, daß sich zum einen bei einem Ein-<br />
Sweep-line-Methode fügeereignis – also beim Entdecken eines neuen Punktes – das Voronoi-<br />
Diagramm auch links der Sweep line ändert (siehe Abbildung 8.4), und<br />
zum anderen überhaupt nicht klar ist, wann für solche verspätet hinzugekommenen<br />
Voronoi-Kanten (links der Sweep line) das zugehörige<br />
Schnittereignis abgearbeitet werden soll – zu dem Zeitpunkt, an dem<br />
die Sweep line den Schnittpunkt passiert, ist dieser ja noch gar nicht bekannt.
8.4 Konstruktion des Voronoi-Diagramms 101<br />
Aus diesem Grund wenden wir das Sweep-Paradigma in leicht abgewandelter<br />
Form auf unser Problem an: Anstatt uns in der Vertikalstruktur<br />
die Schnittmenge des aktuellen Voronoi-Diagramms mit der Sweep<br />
line zu merken, verwalten wir besser gleich nur denjenigen Teil des<br />
Voronoi-Diagramms links der Sweep line, der sich garantiert nicht mehr<br />
ändern kann, d. h. der von Punkten rechts der Sweep line unbeeinflußt<br />
bleibt.<br />
Der Teil des Voronoi-Diagramms, welcher sich nicht mehr ändern kann,<br />
besteht offenbar aus allen Punkten der Ebene, deren Abstand zu irgendeinem<br />
der Punkte pi ∈ P links der Sweep line geringer ist als ihr Abstand<br />
zur Sweep line selbst. Da der Bisektor eines Punktes und einer<br />
Geraden eine Parabel ist, besteht die Grenze dieses Bereichs – die sog.<br />
Wellenfront oder Küstenline (engl. beach line) – also aus einer Menge von<br />
Parabelstücken. Für die Wellenfront kann man nun zeigen, daß sie zum<br />
einen wegzusammenhängend und zum anderen y-monoton ist, d. h. jede<br />
horizontale Linie schneidet sie nur in höchstens einem Punkt. Nur<br />
diese Wellenfront sollten wir in der Vertikalstruktur verwalten. Wellenfront<br />
Die Punkte, in denen zwei benachbarte Parabelstücke der Wellenfront<br />
zusammenstoßen, liegen genau auf den Voronoi-Kanten von VD(P).<br />
Wenn nun die Sweep line nach rechts wandert, ändert sich die Wellenfront<br />
kontinuierlich und es können zwei Ereignisse auftreten, welche die<br />
Struktur der Wellenfront beeinflussen:<br />
1. Ein Parabelstück der Wellenfront verschwindet, d. h. die Endpunkte<br />
der beiden Nachbarstücke stoßen zusammen. Dies bedeutet,<br />
daß wir an der Stelle, an der die Endpunkte zusammengestoßen<br />
sind, einen Voronoi-Knoten entdeckt haben, der sich im weiteren<br />
Verlauf nicht mehr ändert und den wir zu VD(P) hinzunehmen<br />
können. Das entsprechende Parabelstück können wir aus der<br />
Vertikalstruktur entfernen.<br />
2. Ein neues Parabelstück erscheint. Dies passiert genau dann, wenn<br />
die Sweep line einen neuen Punkt pi ∈ P passiert. In einem solchen<br />
Fall muß die Vertikalstruktur (also die Folge der Parabelstücke)<br />
entsprechend aktualisiert werden.<br />
Dies ist die Grundidee des Sweep-line-Algorithmus. Die Feinheiten<br />
wie z. B. eine sinnvolle Verwaltung der Vertikalstruktur, die Berechnung<br />
der Ereigniskoordinaten usw. finden sich beispielsweise in [5, S. 149]<br />
und [14, S. 286].<br />
Zusammenfassend erhalten wir dann folgenden Satz:<br />
Satz 8.17 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />
Voronoi-Diagramm mittels der Sweep-line-Methode bei linearem<br />
Speicherbedarf mit einem optimalen Zeitbedarf von Θ(n log n) bestimmt<br />
werden.<br />
Zeitbedarf von Θ(n log n)<br />
für Sweep-line-Methode
102
Abkürzungen<br />
A<br />
Abkürzungen und Symbole<br />
CAD engl. computer aided design<br />
CAM engl. computer aided manufacturing<br />
DCEL engl. doubly connected edge list (s. S. 63)<br />
FTS Fahrerloses Transportsystem<br />
GIS Geographisches Informationssystem<br />
NP alle von einem nichtdeterministischen Algorithmus in polynomieller Zeit lösbaren<br />
Probleme (s. S. 18)<br />
O. B. d. A. Ohne Beschränkung der Allgemeinheit<br />
P alle von einem deterministischen Algorithmus in polynomieller Zeit lösbaren Probleme<br />
(s. S. 18)<br />
PSLG engl. planar straight line graph (s. S. 62)<br />
PSPACE alle von einem deterministischen Algorithmus mit polynomiellem Speicherbedarf<br />
lösbaren Probleme (s. S. 18)<br />
Symbole<br />
A die abgeschlossene Hülle der Menge A (s. S. 6)<br />
∀ der Allquantor<br />
a �z b die angulare Ordnung der Punkte a und b bez. des Strahls [0 z} (s. S. 29)<br />
a � b die angulare Ordnung der Punkte a und b bez. der positiven x-Achse (s. S. 30)<br />
B(p, q) der Bisektor der Punkte p und q (s. S. 90)<br />
B + (v) das von der Ecke v ausgehende Pfeilbüschel (s. S. 11)<br />
B − (v) das in die Ecke v mündende Pfeilbüschel (s. S. 11)<br />
ccw(p, q, r) die Counter-clockwise-Funktion der drei Vektoren p, q, r (s. S. 27)<br />
U ε(x) die ε-Umgebung von x (s. S. 6)<br />
U R ε (x) die ε-Umgebung von x in R (s. S. 8)<br />
|x y| der euklidische Abstand der Punkte x und y im E d (s. S. 5)<br />
E d der d-dimensionale euklidische Raum (s. S. 5)<br />
∃ der Existenzquantor<br />
p q die Gerade durch die Punkte p und q (s. S. 23)
104 Abkürzungen und Symbole<br />
g(v) der Grad der Ecke v (s. S. 11)<br />
g + (v) der Außengrad der Ecke v (s. S. 11)<br />
g − (v) der Innengrad der Ecke v (s. S. 11)<br />
O(g) alle Funktionen höchstens von der Größenordnung von g (s. S. 16)<br />
Ω(g) alle Funktionen mindestens von der Größenordnung von g (s. S. 16)<br />
Θ(g) alle Funktionen genau von der Größenordnung von g (s. S. 16)<br />
o(g) alle Funktionen von geringerer Größenordnung als g (s. S. 16)<br />
H + (n, a) die positive Halbebene zu einer Geraden g(n, a) (s. S. 24)<br />
H− (n, a) die negative Halbebene zu einer Geraden g(n, a) (s. S. 24)<br />
A ◦<br />
[a, b]<br />
das Innere oder der offene Kern der Menge A<br />
das geschlossene Intervall { x ∈ R<br />
(s. S. 6)<br />
� � a ≤ x ≤ b }<br />
[a, b) das halboffene Intervall { x ∈ R � � a ≤ x < b }, analog auch (a, b]<br />
(a, b) das offene Intervall { x ∈ R � � a < x < b }<br />
|A| die Kardinalität der Menge A<br />
ker(P) der Kern des Polygons P (s. S. 40)<br />
α(si, si+1) Knickwinkel zweier aufeinanderfolgender Segmente einer polygonalen Kette<br />
(s. S. 34)<br />
CH(A) die konvexe Hülle der Menge A (s. S. 34)<br />
|x| die (euklidische) Länge des Vektors x ∈ E d<br />
tA(n) die Worst-case-Laufzeit von Algorithmus A (s. S. 18)<br />
∅ die leere Menge<br />
Lp(x, y) die Minkowski-Metrik für 1 ≤ p ≤ ∞ (s. S. 6)<br />
N(v) die Nachfolgermenge der Ecke v (s. S. 11)<br />
N die Menge der natürlichen Zahlen, N := {0, 1, 2, . . . }<br />
¬ das logische »nicht«<br />
g(n, a) die Normalenform einer Geraden g (s. S. 23)<br />
G ⊒ G ′ Graph G ist ein Obergraph von G ′ (s. S. 12)<br />
∨ das logische »oder«<br />
GR ′ der durch R ′ induzierte Partialgraph (s. S. 12)<br />
∂A der Rand der Menge A (s. S. 6)<br />
Π1 �τ Π2 Problem Π1 ist auf Π2 τ-reduzierbar (s. S. 19)<br />
R die Menge der reellen Zahlen<br />
vis(p) das Sichtbarkeitspolygon von p (s. S. 39)<br />
sgn(x) das Vorzeichen (lat. signum) von x, sgn(x) ∈ {−1, 0, 1}<br />
〈x, y〉 das kanonische Skalarprodukt der beiden Vektoren x und y im R d (s. S. 6)<br />
sA(n) der Worst-case-Speicherbedarf von Algorithmus A (s. S. 18)<br />
[p q} der Strahl von p aus in Richtung q, analog auch {p q] (s. S. 23)<br />
[p q] die Strecke zwischen den Punkten p und q (s. S. 23)<br />
G[V ′ ] der durch V ′ induzierte Subgraph (s. S. 12)<br />
G ′ ⊑ G Graph G ′ ist ein Teilgraph von G (s. S. 12)<br />
∧ das logische »und«<br />
a × b das Vektorprodukt zweier Vektoren a und b (s. S. 26)
V(v) die Vorgängermenge der Ecke v (s. S. 11)<br />
�w eine Parametrisierung eines Weges w (s. S. 8)<br />
105
106
Literaturverzeichnis<br />
[1] F. Aurenhammer, R. Klein. Voronoi Diagrams. Technischer Bericht TR 198, Department of<br />
Computer Science, FernUniversität Hagen, 1996.<br />
[2] J. L. Bentley, T. A. Ottmann. Algorithms for Reporting and Counting Geometric Intersections.<br />
IEEE Transactions on Computers, C-28:643–647, 1979.<br />
[3] B. Chazelle. Triangulating a Simple Polygon in Linear Time. Discrete and Computational Geometry,<br />
6:485–524, 1991.<br />
[4] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rives. Introduction to Algorithms.<br />
MIT Press, 6th edition, 1992.<br />
[5] Mark de Berg, Marc van Kreveld, Mark Overmars, Otfried Schwarzkopf. Computational Geometry:<br />
Algorithms and Applications. Springer, 1997.<br />
[6] D. P. Dobkin, R. J. Lipton. Multidimensional Searching Problems. SIAM Journal on Computing,<br />
5:181–186, 1976.<br />
[7] M. E. Dyer. Linear Time Algorithms for Two- and Three-Variable Linear Programs. SIAM<br />
Journal on Computing, 13:31–45, 1984.<br />
[8] Herbert Edelsbrunner. Algorithms in Combinatorial Geometry. Springer, Berlin Heidelberg, 1987.<br />
[9] Otto Forster. Analysis 2. Vieweg, Braunschweig, 5th edition, 1984.<br />
[10] Michael R. Garey, David S. Johnson. Computers and Intractability (A Guide to the Theory of NP-<br />
Completeness. W. H. Freeman and Company, 1979.<br />
[11] Klaus Jänich. Topologie. Springer, 5th edition, 1996.<br />
[12] Dieter Jungnickel. Graphen, Netzwerke und Algorithmen. BI Wissenschaftsverlag, 2nd edition,<br />
1990.<br />
[13] David G. Kirkpatrick. Optimal Search in Planar Subdivisions. SIAM Journal on Computing,<br />
12:28–35, Februar 1983.<br />
[14] Rolf Klein. <strong>Algorithmische</strong> <strong>Geometrie</strong>. Addison-Wesley, 1997.<br />
[15] Sven Oliver Krumke. Graphentheoretische Konzepte und Algorithmen. ������������������<br />
��������������������������������� , 1997. (Skript zur Vorlesung im Sommersemester 1997,<br />
Universität Würzburg).
108 Literaturverzeichnis<br />
[16] N. Megiddo. Linear-Time Algorithms for Linear Programming in R 3 and Related Problems.<br />
SIAM Journal on Computing, 12:759–776, 1983.<br />
[17] James R. Munkres. Topology: a first course. Prentice-Hall, 1975.<br />
[18] Hartmut Noltemeier. Graphentheorie: mit Algorithmen und Anwendungen. de Gruyter, Berlin,<br />
1975.<br />
[19] Joseph O’Rourke. Computational Geometry in C. Cambridge University Press, 2nd edition, 1998.<br />
[20] J. Pach, M. Sharir. On Vertical Visibility in Arrangements of Segments and the Queue Size in<br />
the Bentley-Ottmann Line Sweeping Algorithm. SIAM Journal on Computing, 20:460–470, 1991.<br />
[21] Christos H. Papadimitriou. Computational Complexity. Addison-Wesley, 1994.<br />
[22] Franco P. Preparata, Michael Ian Shamos. Computational Geometry: An Introduction. Springer,<br />
New–York, 2nd edition, 1985.<br />
[23] Boto von Querenburg. Mengentheoretische Topologie. Springer, 1979.