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