Übung zur Vorlesung Algorithmische Geometrie

Werbung
Übung zur Vorlesung Algorithmische Geometrie
Dipl.-Math. Bastian Rieck
Arbeitsgruppe Computergraphik und Visualisierung
Interdisziplinäres Zentrum für Wissenschaftliches Rechnen
19. Juni 2012
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
1 / 28
Aufgaben
Vorherige Aufgaben
Aufgabe 1.1
Teilen Sie ein gegebenes nicht-einfaches Polygon in y -monotone Teilstücke
auf. Beschreiben Sie dabei für jeden Ereignispunkt des Sweep Line
Algorithm, welcher Knotentyp behandelt wird und geben Sie die jeweiligen
Helferknoten an.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
2 / 28
Aufgaben
Aufgabe 1.2
Sei P ein rectilinear polygon. Geben Sie ein Beispiel an, das aufzeigt, dass
im schlimmsten Fall b n4 c Kameras benötigt werden, um das gesamte
Polygon zu überwachen.
Aufgabe 1.3
Beschreiben Sie einen Algorithmus im Pseudocode, der eine 3-Färbung
eines triangulierten einfachen Polygons P mit n Knoten berechnet. Ihr
Algorithmus soll lineare Komplexität haben.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
3 / 28
Aufgaben
Fragen?
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
4 / 28
Rekurrenzgleichungen
Algorithmus zum Aufbau eines kd-Baumes
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
5 / 28
Rekurrenzgleichungen
Behauptung
Die Komplexität zum Aufbau des Baumes genügt der Rekurrenzgleichung
(
O(1)
für n = 1,
T (n) =
.
O(n) + 2T (dn/2e) für n > 1
Die Lösung“ dieser Gleichung ist O(n log n).
”
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
6 / 28
Rekurrenzgleichungen
Beweis
Annahme: n sei hinreichend groß, sodass die folgenden Terme jeweils alle
definiert sind. Wir schreiben im Folgenden keine Landausymbole mehr, um
die Terme einfacher zu halten.
T (n) = n + 2T (n/2) = 2n + 4T (n/4) = 3n + 8T (n/8) = . . .
= kn + 2k T (n/2k )
Wir wissen bereits, dass T (1) = 1. Suche also k, sodass
n
= 1 ⇔ n = 2k ⇔ ld n = k.
2k
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
7 / 28
Rekurrenzgleichungen
Wir setzen dies nun in die Gleichung von oben ein und erhalten:
T (n) = n ld n + 2ld n T (1)
= n ld n + n
Somit gilt T (n) ∈ O(n ld n) ≡ O(n log n).
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
8 / 28
Rekurrenzgleichungen
Algorithmus zur Suchanfrage in einem kd-Baum
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
9 / 28
Rekurrenzgleichungen
Betrachte zwei Ebenen des Baumes für Rekurrenz.
Jeder der vier Knoten auf Höhe 2 entspricht einer
Region, die n4 Punkte enthält.
Höchstens zwei der vier Knoten müssen von uns
durchsucht werden, da nur sie geschnitten werden
können.
Also müssen wir die Anzahl der Schnitte in diesen
zwei Teilbäumen rekursiv zählen.
Zusätzlich haben wir immer noch den Schnitt mit
dem Wurzelknoten sowie (in diesem Fall) dem
linken Knoten.
Insgesamt erhalten wir die Rekurrenz:
(
O(1)
für n = 1,
Q(n) =
2 + 2Q(n/4) für n > 1
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
10 / 28
Rekurrenzgleichungen
Behauptung
√
Es gilt Q(n) ∈ O( n).
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
11 / 28
Rekurrenzgleichungen
Beweis
Sei n im Folgenden wieder hinreichend groß gewählt. Zudem lassen wir
wieder die Landausymbole weg.
Q(n) = 2 + 2Q(n/4) = 6 + 4Q(n/16) = 14 + 8Q(n/64)
= 30 + 16Q(n/256)
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
12 / 28
Rekurrenzgleichungen
Beweis
Sei n im Folgenden wieder hinreichend groß gewählt. Zudem lassen wir
wieder die Landausymbole weg.
Q(n) = 2 + 2Q(n/4) = 6 + 4Q(n/16) = 14 + 8Q(n/64)
= 30 + 16Q(n/256)
= · · · = 2k+1 − 2 + 2k (Q(n/4k ))
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
12 / 28
Rekurrenzgleichungen
Wir nutzen nun wieder aus, dass Q(1) = 1 und erhalten dadurch:
n
= 1 ⇔ n = 4k ⇔ k = log4 n
4k
Durch Einsetzen in die vorherige Gleichung erhalten wir:
Q(n) = 2log4 n+1 − 2 + 2log4 n
= 3 · 2log4 n − 2
Es gilt:
ld n
1
2log4 n = 2 ld 4 = 2 2 ld n
√
1
= n2 = n
Unter Vernachlässigung der konstanten Terme sehen wir also, dass für die
√
Rekurrenz Q(n) ∈ O( n) gilt.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
13 / 28
Exkurs
Kurzer Exkurs
Master-Theorem
Sei eine Rekurrenz der Form
n
T (n) = aT ( ) + f (n)
b
gegeben mit a ≤ 1 und b > 1. Wir unterscheiden nun 3 Fälle:
1
2
3
Falls f (n) = O(nlogb (a)− ) für > 0, so gilt T (n) = Θ(nlogb a ).
Falls f (n) = Θ(nlogb a logk n) für k ≥ 0, so gilt
T (n) = Θ(nlogb a logk+1 n).
Falls f (n) = Ω(nlogb (a)+ ) für > 0 und außerdem af (n/b) ≤ cf (n)
für c < 1 konstant und n hinreichend groß, so gilt T (n) = Θ(f (n)).
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
14 / 28
Exkurs
Anwendung auf vorherige Gleichungen
1. Gleichung
T (n) = n + 2T (n/2), also ist f (n) = n, a = b = 2. Wir können nur Fall 2
mit k = 0 anwenden, denn offensichtlich ist f (n) = Θ(nld 2 log0 n) = Θ(n).
Nach dem Theorem gilt somit, dass T (n) = Θ(nld 2 log1 n) = Θ(n log n).
2. Gleichung
Q(n) = 2 + 2Q(n/4), also ist f (n) = 2, a = 2 und b = 4. Wir können Fall
1 mit beliebig großem anwenden, denn f (n) = O(1). Nach dem Theorem
erhalten wir somit, dass
Q(n) = Θ(nlogb a = Θ(nlog4 2 )
√
1
= Θ(n 2 ) = Θ( n)
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
15 / 28
Exkurs
Fazit
Wir erhalten schärfere Schranken durch das Master-Theorem.
Die Schranken bestätigen die groben Abschätzungen, die wir bereits
berechnet haben.
Für einen Beweis des Master-Theorems siehe Cormen et al., Introduction
to Algorithms, 3. Ausgabe, S. 97–106 (schöne Beweisidee, leider sehr viel
handwaving am Ende).
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
16 / 28
Bereichssuche
Eindimensionale Bereichssuche
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
17 / 28
Bereichssuche
Beobachtung
Die Bereichssuche ist ausgabe-sensitiv, d.h. der Algorithmus hängt
nicht nur von der Eingabe, sondern auch von der Ausgabe ab.
ReportSubtree() benötigt eine Laufzeit von O(k),
wobei k die Anzahl der gelieferten Punkte ist.
Pfade innerhalb des balancierten Baums haben eine Länge von
O(log n).
Theorem
Sei P eine Menge von n Punkten aus R. Die Menge P kann in einem
balancierten Binärsuchbaum gespeichert werden, der O(n) Speicher und
O(n log n) Konstruktionszeit braucht.
Dies geschieht derart, dass die Punkte in einer Bereichssuche in
O(k + log n) Zeit geliefert werden können, wobei k die Anzahl der
gelieferten Punkte ist.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
18 / 28
Bereichssuche
Zweidimensionale Bereichsbäume
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
19 / 28
Bereichssuche
Beobachtung
Annahme (wird später behandelt), dass keine zwei Punkte identische
x- und y-Koordinaten haben.
In den Blättern werden die Punkte gespeichert und nicht nur die
y-Koordinaten.
Aufbauzeit von O(n log n) kann nur dann erzielt werden wenn die
Menge Py in Zeile 1 nach y-Koordinaten vorsortiert ist, denn dann
kann der Binärbaum von unten nach oben in O(n) konstruiert werden.
Lemma
Ein Bereichsbaum auf einer Menge P von n Punkten aus dem R2 benötigt
O(n log n) Speicher.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
20 / 28
Bereichssuche
Zweidimensionale Bereichssuche
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
21 / 28
Bereichssuche
Erinnerung
Sei P die Menge von n Punkten aus R. Die Punkte in einer Bereichssuche
können in einer Laufzeit von O(k + log n) geliefert werden.
Beobachtung
1DRangeQuery() benötigt O(log n + kv ), wobei kv die Anzahl der
gelieferten Punkte in diesem Aufruf sind.
Die Summe über alle Punkte im Hauptbaum T ist dann:
X
O(log n + kv ).
v
Aus v kv = k und der Tatsache, dass die Suchpfade von x und x 0
im Baum T einen Länge von O(log n) haben, folgt:
P
X
O(log n) = O(log2 n).
v
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
22 / 28
Bereichssuche
Theorem
Sei P eine Menge von n Punkten aus R2 . Ein Bereichsbaum für P
benötigt O(n log n) Speicher und kann in einer Laufzeit von O(n log n)
konstruiert werden.
Die Suche von Punkten innerhalb eines rechteckigen Bereichs kann
mithilfe des Bereichsbaums in einer Laufzeit von O(log2 n + k) erfolgen,
wobei k die Anzahl der gelieferten Punkte ist.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
23 / 28
Bereichssuche
Komplexität von Kd Bäumen und Bereichsbäumen
Sei P eine Menge von n Punkten aus R2 und k die Anzahl der gelieferten
Punkte. Für rechteckige Bereichssuchen gilt:
Kd Baum
Speicher: O(n).
Aufbauzeit: O(n log n).
√
Bereichssuche: O( n + k).
Bereichsbaum
Speicher: O(n log n).
Aufbauzeit: O(n log n).
Bereichssuche: O(log2 n + k).
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
24 / 28
Bereichssuche
Allgemeine Koordinaten
Bisherige Algorithmen nehmen an, dass Punkte paarweise verschieden
sind und keine Koordinate doppelt vorkommt
Diese unrealistische Annahme kann durch lexikographische Ordnung
auf Koordinaten umgangen werden.
Grundidee:
(a|b) < (a0 |b 0 ) ⇔ a < a0 ∨ (a = a0 ∧ b < b 0 )
Ersetze dann Punkt (x, y ) durch ((x|y ), (y |x)). Diese Konvertierung kann
auch nur virtuell durchgeführt werden. Die Ordnung ist dann beim
Vergleichen zweier Koordinaten zu betrachten.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
25 / 28
Hausaufgaben
Aufgabe 1
Sortieren Sie die folgenden Komplexitätsklassen nach aufsteigender
Komplexität: O(n3 ), O(n2 log n), O(log log n), O(log n), O((log n)2 ),
√
√
O(()1), O( n), O(n2 + log n), O(n!), O(nn ), O(2n ), O( 3 n), O(15n2 ).
Begründen Sie ihre Sortierung kurz.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
26 / 28
Hausaufgaben
Aufgabe 2
Implementieren Sie einen kd-Baum für eine Menge von Punkten im R2 .
Aufgabe 3
Erweitern Sie das Programm aus der vorherigen Aufgabe um eine
Visualisierung der Unterteilung der Ebene, die durch den Baum gegeben
wird.
Aufgabe 4
Erweitern Sie das Programm aus der vorherigen Aufgabe um eine
automatische Lokalisierung von Punkten. Reagieren Sie auf einen
Mausklick, indem Sie dasjenige Blatt des kd-Baums hervorheben, das den
Mauszeiger enthält.
Der kd-Baum muss nicht für beliebige Daten funktionieren. Sie dürfen von
der Annahme ausgehen, dass keine x- und y -Koordinate doppelt
vorkommt.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
27 / 28
Hausaufgaben
Hinweise
Falls Sie die Aufgabe mit Hilfe von Qt4 lösen wollen:
Sie können von QGraphicsView ableiten und die Funktion
mousePressEvent überladen. Sie erhalten Sie die Koordinaten unter
dem Cursor dann durch mapToScene().
Um die berechneten Regionen und Linien zu zeichnen, können Sie im
obigen QGraphicsView eine QGraphicsScene definieren und in diese
mittels addRect(), addLine() sowie addEllipse() zeichnen.
B. Rieck (CoVis)
Algorithmische Geometrie
19. Juni 2012
28 / 28
Herunterladen