Ü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