Datenstrukturen Kap. 8: Geometrische Algorithmen - fbi.h

Werbung
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Gliederung der Vorlesung
1. Einführung/Motivation
2. Rechnermodelle/Effizienzmaße
2.1 RAM
2.2 Effizienzmaße/O-Notation
3. Sortieren
3.1 Elementare Sortierverfahren
3.2 Effiziente Sortierverfahren
3.3 Andere Ansätze
4. Rekursive Algorithmen
4.1 Typische Beispiele
4.2 Iterative vs. rekursive Algorithmen
5. Einfache Datentypen
5.1 Warteschlangen
5.2 Stacks/Listen
6. Wörterbücher
6.1 Hashing
6.2 Suchbäume
6.3 Skip-Listen
7. Bäume/Graphen
7.1 Grundlegende Algorithmen
8. Geometrische Algorithmen
8.1 Geometrische Datenstrukturen
9. Stringsuchverfahren
9.1 Grundlegende Algorithmen
10. Algorithmische Prinzipien
10.1 Dynamisches Programmieren
10.2 Greedy-Algorithmen
1
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
•
•
•
Sichtbarkeitsproblem
Schnittproblem
Inklusions- und Schnittproblem für Rechtecke
Einschränkungen
betrachten nur den
•
•
zweidimensionalen Fall
Iso-orientierten Fall, d.h. alle Liniensegmente und
Linien verlaufen parallel zu den
... Verallgemeinerungen sind möglich, aber nicht immer offensichtlich
2
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Sichtbarkeitsproblem
A
B
C
D
E
F
gegeben:
Liniensegmente; hier: { A, B, C, D, E, F }
gesucht:
alle gegenseitig sichtbaren Segment-Paare (X,Y);
hier: { (A,F), (A,C), (B,D), (B,E), (C,E), (C,F), (D,E), (E,F) }
Annahme:
alle Segmente haben paarweise unterschiedlichen Anfangs- und
Endpunkte sowie unterschiedliche y-Koordinaten
3
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Sichtbarkeitsproblem (/* naive Lösung */)
A
B
C
D
E
F
•
•
bestimme alle Paare (X,Y) mit X ≠ Y
teste für jedes Paar (X,Y), ob X und Y gegenseitig sichtbar sind
benötigte Zeit: wenigstens Ω(n2)
4
n – Anzahl der Segmente
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Sichtbarkeitsproblem (/* bessere Lösung */)
A
B
C
D
E
F
Scan-Line-Prinzip
•
•
•
laß eine vertikale Linie (/* Scan-Line */) von links nach rechts
über die gegebene Menge von Objekten laufen
verwalte drei disjunkte Teilmengen von Objekten: tot, aktiv,
inaktiv; hier: { A, C, F }, { B, E } , { D }
analysiere die „Beziehungen“ zwischen den aktiven Objekten und
gib die gewonnen „Einsichten“ aus; hier: das Paar (B,E)
5
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Sichtbarkeitsproblem (/* bessere Lösung */)
A
B
C
D
E
F
Teilprobleme
•
•
•
die Scan-Line in „geeigneten Sprüngen“ über die Segmente
verschieben (/* Repräsentation der Segmente */)
die relevanten Teilmengen verwalten
„Einsichten“ über die Beziehung zwischen den aktiven Segmenten
ableiten und ausgeben
6
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Sichtbarkeitsproblem (/* bessere Lösung, Teilproblem 1 */)
A
B
C
D
E
F
Repräsentation:
•
•
je Segment: x-Koordinaten der Endpunkte; etwa [.A,A.]
für die Objektmenge: aufsteigend sortierte Menge Q aller
solcher Endpunkte; { .F, .A, .C, .E, A., ..., B. }
... die Elemente in Q sind die „Haltepunkte“ für der Scan-Line
7
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Sichtbarkeitsproblem (/* bessere Lösung, Teilproblem 2 */)
A
B
C
D
E
F
Verwaltung:
•
initial: tot = aktiv = ∅; inaktiv = Menge aller Segmente
•
falls aktuelles Element in Q vom Typ .X
•
aktiv = aktiv ∪ { X }
•
falls aktuelles Element in Q vom Typ X.
•
aktiv = aktiv \ { X }; tot = tot ∪ { X }
8
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Sichtbarkeitsproblem (/* bessere Lösung, Teilproblem 3 */)
A
B
C
D
E
F
Fall 1: das aktuelle Element in Q ist vom Typ .X
•
es sind maximal zwei Paare (X,Y) und (X,Y‘) auszugeben
Fall 2: das aktuelle Element in Q ist vom Typ .X
•
es ist maximal ein Paar (Y,Y‘) auszugeben
... Y und Y‘ sind Nachbarn von X in der Menge der aktiven Segmente
9
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Sichtbarkeitsproblem (/* bessere Lösung, Teilproblem 3 */)
A
B
C
D
E
F
Repräsentation:
speichere die Menge der aktiven Segmente als balancierten Suchbaum
(/* Ordnungskriterium y-Koordinate der einzelnen Segmente */)
...
Y ist Nachbar eines Segments X, falls X symmetrischer Vorgänger
bzw. symmetrischer Nachfolger von X ist
10
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Sichtbarkeitsproblem (/* bessere Lösung, Komplexitätsanalyse */)
Teilproblem 1: in O(nlog(n))
(/* Sortieren */)
Teilproblem 2: in n * O(log(n))
(/* Einfügen, Löschen */)
Teilproblem 3: in n * O(log(n))
(/* Ableiten + Ausgeben */)
... zusätzlicher Speicherplatz: O(n)
Hinweis: maximal 3n – 6 viele Paare (/* falls n > 2 */)
n – Anzahl der Liniensegemente
insgesamt: O(nlog(n))
11
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem
a
A
B
C
b E
D
c
F
gegeben:
Liniensegmente; hier { A, B, C, D, E, F, a, b, c, d }
gesucht:
alle sich gegenseitig schneidender Segment-Paare (X,Y);
hier { (A,a), (B,c), (C,a), (C,b), (D,c), (E,b), (E,c), (F,b) }
Annahme:
alle Segmente parallel zur x-Achse haben paarweise unterschiedliche
Anfangs- und Endpunkte, die verschieden von der x-Koordinate der
Segmente parallel zur y-Achse sind
12
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem
a
A
B
C
b E
D
c
F
der „naive“ Ansatz alle Paare (X,Y) herzunehmen und zu prüfen,
ob sich das parallel zur x-Achse liegende Segment X und das
parallel zur y-Achse liegende Segment Y schneiden, benötigt
Zeit Ω(n2)
... es geht nicht immer besser (/* Anzahl der Schnittpunkte */)
13
n – Anzahl der Liniensegemente
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem
„worst case“ n/2 * n/2 viele Schnittpunkte
...
falls es die Anzahl der Schnittpunkte nicht quadratisch in der
Anzahl der Segmente können „clevere“ Algorithmen besser sein
14
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem
a
A
B
C
D
b E
c
F
algorithmische Idee: Anwendung des Scan-Line-Prinzips
...
man muß zusätzliche „Haltepunkte“ einfügen (/* es
genügt, sich die x-Koordinate der parallel zur y-Achse
liegenden Segmente zu merken */)
15
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem
a
A
B
C
b E
D
c
F
Teilprobleme
•
•
•
die Scan-Line in „geeigneten Sprüngen“ über die Segmente
parallel verschieben (/* Repräsentation der Objekte */)
die relevanten Teilmengen verwalten
„Einsichten“ über die Beziehung zwischen den aktiven Objekten
ableiten und ausgeben
16
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem (/* Teilproblem 1 /*)
a
A
B
C
b E
D
c
F
Repräsentation:
•
•
•
je Segment parallel zur x-Achse: x-Koordinate der Endpunkte;
etwa [.A,A.]
je Segment parallel zur y-Achse: x-Koordinate (etwa a)
für die Objektmenge: aufsteigend sortierte Menge Q aller
solcher Punkte; hier: { .F, .A, .C, .E, a, A.,.C, b, ..., B. }
... die Elemente in Q sind die „Haltepunkte“ für der Scan-Line
17
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem (/* Teilproblem 2 /*)
a
A
B
C
b E
D
c
F
Verwaltung:
•
•
initial: tot = aktiv = ∅; inaktiv = Menge aller Segmente parallel
zur x-Achse
einzelne Schritte:
•
falls aktuelles Element in Q vom Typ .X
•
aktiv = aktiv ∪ { X }
•
falls aktuelles Element in Q vom Typ X.
•
aktiv = aktiv \ { X }; tot = tot ∪ { X }
18
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem (/* Teilproblem 3 /*)
a
A
B
C
b E
D
c
F
das aktuelle Element in Q ist ein Segment Y parallel zur y-Achse
Æ es sind alle Paare (X,Y) auszugeben mit
•
•
X gehört zur Menge der aktiven Objekte
die y-Koordinate von X liegt zwischen dem Anfangs- und
Endpunkt des Segments Y
... es sind sogenannte Bereichsanfragen zu beantworten
19
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem (/* Teilproblem 3 /*)
a
A
B
C
b E
D
c
F
Repräsentation:
•
•
•
speichere die Menge der aktiven Segmente als balancierten
Suchbaum (/* Ordnungskriterium y-Koordinate der
einzelnen Segmente */)
füge in jeden Knoten einen Verweis auf ein zusätzliches
Blatt ein, welches die y-Koordinate des Segments speichert
verkette diese zusätzlichen Blätter doppelt (/* gemäß ihrer
Reihenfolge */)
20
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem (/* Teilproblem 3 /*)
a
A
C
B
C
b E
A
F
D
c
F
E
1
2
3
4
-
Anfangspunkt von a:
Endpunkte von a:
1.5
5
finde Element X‘ mit kleinster y-Koordinate ≥ 1.5
finde Element X‘‘ mit größter y-Koordinate ≤ 5
gib alle Elemente aus, deren Blätter in der bei X‘
beginnenden und bei X‘‘ endenden Liste liegen
21
Datenstrukturen
Kap. 8: Geometrische Algorithmen
Geometrische Datenstrukturen
Schnittproblem (/* Komplexitätsanalyse */)
Teilproblem 1: in O(nlog(n))
(/* Sortieren*/)
Teilproblem 2: in n * O(log(n))
(/* Einfügen, Löschen */)
Teilproblem 3: in n * O(log(n)) + O(k)
(/* Ableiten + Ausgeben /)
... zusätzlicher Speicherplatz: O(n)
... Ausgabe:
O(k)
insgesamt: O(nlog(n) + k)
22
n – Anzahl der Liniensegemente; k – Anzahl der Schnittpunkte
Herunterladen