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 Inklusions- und Schnittproblem für Rechtecke A B C D E gegeben: Rechtecke, hier { A, B, C, D, E} gesucht: alle sich gegenseitig schneidenden Rechteck-Paare (X,Y), hier { (A,B), (A,C), (A,D), (A,E), (B,C), (B,D) } Annahme: zwei Rechteckseiten haben maximal einen Punkt gemeinsam; alle oberen und unteren Rechteckseiten haben paarweise verschiedene y-Koordinaten 2 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Inklusions- und Schnittproblem für Rechtecke A B C D E algorithmische Idee: Anwendung des Scan-Line-Prinzips ... ... hier in y-Richtung das Ermitteln der Beziehungen zwischen den „aktiven“ Objekten ist algorithmisch „spannender“ 3 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Inklusions- und Schnittproblem für Rechtecke A B C D E Teilprobleme • • • die Scan-Line in „geeigneten Sprüngen“ horizontal über die Rechtecke parallel verschieben (/* Repräsentation */) die relevanten Teilmengen verwalten „Einsichten“ über die Beziehung zwischen den aktiven Objekten ableiten und ausgeben 4 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen ... Rechtecke (/* Teilproblem 1 /*) A B C D E Repräsentation: • • je Rechteck: y-Koordinaten der Ecken (/* etwa [.Ay,Ay.] */) für die Objektmenge: aufsteigend sortierte Menge Q aller solcher Punkte (/* hier { .Ay, .By, .Cy, .Dy, Cy.,..., Ey. } ... die Elemente in Q sind die „Haltepunkte“ für die horizontale Scan-Line 5 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen ... Rechtecke (/* Teilproblem 2 /*) A B C D E Verwaltung: • • initial: tot = aktiv = ∅; inaktiv = Menge aller Rechtecke einzelne Schritte: • falls aktuelles Element in Q vom Typ .Xy • aktiv = aktiv ∪ { X } • falls aktuelles Element in Q vom Typ Xy. • aktiv = aktiv \ { X }; tot = tot ∪ { X } 6 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen ... Rechtecke (/* Teilproblem 3 /*) A B C D E es sei .Yy das aktuelle Element in Q Æ es sind alle Paare (X,Y) auszugeben mit • • X gehört zur Menge der aktiven Rechtecke die Rechtecke X und Y haben einen Punkt gemeinsam ... es sind sogenannte Überlappungsanfragen zu beantworten 7 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen ... Rechtecke (/* Teilproblem 3 /*) A B C D E es seien X und Y zwei Rechtecke mit den x-Koordinaten .X, X., .Y und Y. Æ es sind zwei Fälle möglich • • .X < .Y < X. (/* das kennen Sie schon; Bereichsanfrage */) .Y < .X < Y. (/* neu; inverse Bereichsanfrage */) 8 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen gesucht: Datenstruktur zur Unterstützung von inversen Bereichsanfragen • • Repräsentation von Mengen von Intervallen [.X,X.] Operationen: • Einfügen eines Intervalls • Löschen eines Intervalls • Feststellen, ob ein gegebener Punkt in einem repräsentierten Intervall liegt (/* inverse Bereichsanfrage, Aufspießfrage */) 9 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Datenstruktur zur Unterstützung von inversen Bereichsanfragen Vorverarbeitung (/* Skalierung */) A A = [2,9] B = [4,8] C = [5,6] D = [7,10] E = [1,3] B C D E 10 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Datenstruktur zur Unterstützung von inversen Bereichsanfragen Vorverarbeitung (/* Skalierung */) A B C D E jedes Intervall ist Vereinigung von endlich vielen Elementar-Intervallen 11 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Datenstruktur zur Unterstützung von inversen Bereichsanfragen Vorverarbeitung (/* Skalierung */) A B C D E jedes Intervall ist Vereinigung von endlich vielen Elementar-Intervallen 12 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Datenstruktur zur Unterstützung von inversen Bereichsanfragen ... sogenannte Skelettbäume 1 2 3 4 5 6 7 8 Intervall [7,8] Intervall [1,8] Intervall [1,4] 1 2 3 4 Aufbau eines vollständigen Skelettbaum 5 6 7 13 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Datenstruktur zur Unterstützung von inversen Bereichsanfragen ... sogenannte Skelettbäume 1 2 3 4 5 A 6 7 8 A 1 2 Repräsentation von Intervallen 3 4 5 6 A 7 14 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Datenstruktur zur Unterstützung von inversen Bereichsanfragen ... sogenannte Skelettbäume 1 2 3 B 4 5 B 6 7 8 B 1 2 Repräsentation von Intervallen 3 4 5 6 B 7 15 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Skelettbäume Arbeit mit der Datenstruktur (/* Initialisierung */) Erzeuge einen vollständigen Binärbaum, der alle zu repräsentierenden Intervalle aufnehmen kann ... linear in n 16 Annahme: n = Anzahl der Rechtecke Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Skelettbäume Arbeit mit der Datenstruktur (/* Einfügen */) setze k = Wurzel falls das von k repräsentierte Intervall das Intervall I vollständig enthält, so markiere k mit I und stoppe andernfalls mache wie folgt weiter: falls der rechte Sohn einen Punkt von I enthält, mache im rechten Teilbaum weiter falls der linke Sohn einen Punkt von I enthält, mache im linken Teilbaum weiter linear in der Tiefe des Skelettbaums 17 Annahme: I = [a,b] das einzufügende Intervall Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Skelettbäume Arbeit mit der Datenstruktur (/* Einfügen */) 1 2 3 4 B 5 B 6 7 8 maximal 2 Intervalle in dieser Ebene können zu rekursiven Aufrufen führen maximal 2 Intervalle in dieser Ebene können zu rekursiven Aufrufen führen 1 2 Repräsentation von Intervallen 3 4 5 6 B 7 18 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Skelettbäume Arbeit mit der Datenstruktur (/* Löschen */) setze k = Wurzel falls k mit I markiert ist, streiche I und stoppe andernfalls mache wie folgt weiter: falls der rechte Sohn einen Punkt von I enthält, mache im rechten Teilbaum weiter falls der linke Sohn einen Punkt von I enthält, mache im linken Teilbaum weiter linear in der Tiefe des Skelettbaums 19 Annahme: I = [a,b] das zu löschende Intervall Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Skelettbäume Arbeit mit der Datenstruktur (/* Berarbeiten einer Anfrage */) sei x der interessierende Punkt suche das Elementarintervall [x,x] im Skelettbaum und gib alle Intervalle aus, mit denen die besuchten Knoten markiert sind linear in der Tiefe des Skelettbaums 20 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Skelettbäume ... Randproblem: Listen mit den Knotenmarkierungen verwalten Idee 1 • an jeden Knoten k wird eine doppelt verkettete Liste Lk aller Intervalle gespeichert, mit denen dieser Knoten markiert ist Æ nur für die Ausgabe wichtig !!! Konsequenz • zusätzlich O(n log(n)) Speicherplatz 21 Hinweis: je Knoten gibt es maximal O(log(n)) Intervalle, mit denen dieser Knoten markiert ist Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Skelettbäume ... Randproblem: Listen mit den Knotenmarkierungen verwalten Idee 2 • • sortierte Liste L aller im Skelettbaum aktuell verwalteten Intervalle I (/* so, daß binäre Suche realisierbar ist */) zu jedem Intervall I eine einfach verkette Liste L‘I von Verweisen auf die entsprechende Einträge in den doppelt verketteten Listen, die an den Knoten im Skelettbaum hängen Konsequenz • zusätzlich O(nlog(n)) Speicherplatz 22 Hinweis: je Intervall gibt es maximal O(log(n)) Knoten, die mit diesem Intervall markiert sind Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Skelettbäume (/* Lk */) Anfrage: in O(log(n‘)) + O(k‘) Einfügen: in O(log(n‘)) + O(log(n‘)) + O(log(n‘)) (/* Lk, L, L‘I */) Löschen: in O(log(n‘)) + O(log(n‘)) + O(log(n‘)) (/* L, L‘I, Lk */) ... zusätzlicher Speicherplatz: O(n‘log(n‘)) insgesamt: O(log(n‘) + k‘) 23 n‘ – Anzahl der Intervalle; k‘ – Anzahl der Antworten auf die Anfrage Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Schnittproblem mit Skelettbäumen (/* Komplexitätsanalyse */) Teilproblem 1: in O(nlog(n)) (/* Sortieren*/) Teilproblem 2: in O(n) * O(log(n)) (/* Einfügen, Löschen */) Teilproblem 3: in O(n) * O(log(n)) + O(k) (/* Ableiten + Ausgeben */) ... zusätzlicher Speicherplatz: O(nlog(n)) insgesamt: O(nlog(n) + k) 24 n – Anzahl der Rechtecke; k – Anzahl der Paare sich schneidender Rechtecke Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen eine andere Datenstruktur zur Unterstützung von inversen Bereichsanfragen ... sogenannte Intervallbäume Fokus • • dieselbe Laufzeit weniger zusätzlicher Speicherplatz ... Ziel: O(n) 25 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen eine andere Datenstruktur zur Unterstützung von inversen Bereichsanfragen ... sogenannte Intervallbäume Vorverarbeitung (/* Skalierung */) A A = [2,9] B = [4,8] C = [5,6] D = [7,10] E = [1,3] B C D E 1 2 3 4 5 6 7 8 9 10 26 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen ( A, B, D ) ( D, A, B ) Intervallbäume A = [2,9] B = [4,8] C = [5,6] D = [7,10] E = [1,3] 4 (E) (E) 1 • • 7 9 (C) (C) 2 3 6 8 10 5 höhenbalancierter Suchbaum mit je einem Punkt als Schlüssel je Knoten k zwei Listen Lu(k) und Lo(k) mit Intervallnamen • aufsteigend sortierte Liste Lu(k) bzgl. des Intervallanfangs • absteigend sortierte Liste Lo(k) bzgl. des Intervallendes • ein Intervall ist in den Listen Lu(k) und Lo(k), falls der jeweilige Punkt zum 27 Intervall gehört und das Intervall nicht zu den Listen des Vaters gehört Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Intervallbäume Arbeit mit der Datenstruktur (/* Einfügen */) setze k = Wurzel falls k im Intervall I vorkommt, so wird I in beiden Listen Lu(k) und Lo(k) eingefügt andernfalls mache wie folgt weiter: falls k > a, so mache im linken Teilbaum weiter falls k < a, so mache im rechten Teilbaum weiter linear in der Tiefe des Intervallbaums 28 I = [a,b] das einzufügende Intervall Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Intervallbäume Arbeit mit der Datenstruktur (/* Löschen */) setze k = Wurzel falls I in Lu(k) bzw. Lo(k) vorkommt, so wird I in beiden Listen Lu(k) und Lo(k) gestrichen andernfalls mache wie folgt weiter: falls k > a, so mache im linken Teilbaum weiter falls k < a, so mache im rechten Teilbaum weiter linear in der Tiefe des Intervallbaums 29 I = [a,b] das einzufügende Intervall Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Intervallbäume Arbeit mit der Datenstruktur (/* Anfrage beantworten */) sei x der interessierende Punkt setze k = wurzel falls x = k, gib alle Intervalle in Lu(k) aus falls x < k, gib alle Intervalle in Lo(k ) aus, die x enthalten falls x einen rechten Sohn hat, so mache im rechten Teilbaum weiter; andernfalls stoppe falls k > a, gib alle Intervalle in Lu(k ) aus, die x enthalten falls x einen linken Sohn hat, so mache im linken Teilbaum weiter; andernfalls stoppe ... geht durch einfaches Durchlaufen der entsprechenden Liste, da entweder Anfangsstück bis Intervallende < x (/* Lo */) bzw. Intervallanfang > x (/* Lu */) interessant 30 linear in der Tiefe des Intervallbaums Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen ( A, B, D ) ( D, A, B ) Intervallbäume A = [2,9] B = [4,8] C = [5,6] D = [7,10] E = [1,3] 7 4 (E) (E) 1 9 (C) (C) 2 3 6 8 10 5 x = 3 Æ A, E x = 6 Æ A, B, C x = 9 Æ D, B 31 Datenstrukturen Kap. 8: Geometrische Algorithmen Geometrische Datenstrukturen Intervallbäume Anfrage: in O(log(n‘)) + O(k‘) Einfügen: in O(log(n‘)) Löschen: in O(log(n‘)) ... zusätzlicher Speicherplatz: O(n‘) insgesamt: O(log(n‘) + k‘) 32 n‘ – Anzahl der Intervalle; k‘ – Anzahl der Antworten auf die Anfrage