760 likes | 968 Views
Jörg Bruder Benjamin Drayer Joachim Krempel Daniel Schüssele. Das Maßproblem von Klee. Übersicht. Problem 1-dimensional Problem 2-dimensional Scanline (Bentley) Naive Lösung Segmentbaum Lösung Problem d-dimensional. Das eindimensionale Maßproblem.
E N D
Jörg Bruder Benjamin Drayer Joachim Krempel Daniel Schüssele Das Maßproblem von Klee
Übersicht • Problem 1-dimensional • Problem 2-dimensional • Scanline (Bentley) • Naive Lösung • Segmentbaum Lösung • Problem d-dimensional
Das eindimensionale Maßproblem Gegeben: n Intervalle auf einer Geraden.
Das eindimensionale Maßproblem Gegeben: n Intervalle auf einer Geraden.
Das eindimensionale Maßproblem Gegeben: n Intervalle auf einer Geraden. Gesucht: Länge der Vereinigung über alle n Intervalle
Das eindimensionale Maßproblem Gegeben: n Intervalle auf einer Geraden. Gesucht: Länge der Vereinigung über alle n Intervalle
Das eindimensionale Maßproblem Gegeben: n Intervalle auf einer Geraden. Gesucht: Länge der Vereinigung über alle n Intervalle Platzbedarf: O(n)
Das eindimensionale Maßproblem Gegeben: n Intervalle auf einer Geraden. Gesucht: Länge der Vereinigung über alle n Intervalle Platzbedarf: O(n) Zeitkomplexität: O(n log(n))
Das zweidimensionale Maßproblem Gegeben: n Rechtecke
Das zweidimensionale Maßproblem Gegeben: n Rechtecke Gesucht: Die von den Rechtecken überdeckte Fläche
Scanline • Speicherung der Rechtecke • Scanline • Berechnung der Fläche
Speicherung der Rechtecke q = (x-low, x-high, y-low, y-high)
Scanline • Sortiere x-Werte aufsteigend • Verschmelze gleiche x-Werte • Analog y-Werte • Speichere die v als Listen bei den u
Berechnung der Fläche • m(i)=Maß der aktiven Segmente
Naiver Ansatz • Verwende die Scanline • Berechne m(i) als eindimensionales Maßproblem • Achtung: Worstcaselaufzeit
Segmentbaum • Idee • Blätter • q-voll, q-partiell • 1-Umbrella • count(x) • Delta(x) • Einfügen • Löschen • Gesamtalgorithmus
Segmentbaum • Idee • Blätter • q-voll, q-partiell • 1-Umbrella • count(x) • Delta(x) • Einfügen • Löschen • Gesamtalgorithmus
Idee • Speichere nicht die Fragmente aus denen ein Segment besteht sondern markiere bestimmte Knoten. • Der Unterbaum, der von jedem Knoten ausgeht überdeckt gewisse Segmente. • Das Maß der aktiven Segmente soll in den Knoten gespeichert werden. • Wenn dies realisiert ist, dann kann man an der Wurzel des Baumes das Gesammtmaß für die gerade aktiven Segmente ablesen.
Segmentbaum • Idee • Blätter • q-voll, q-partiell • 1-Umbrella • count(x) • Delta(x) • Einfügen • Löschen • Gesamtlgorithmus
Blätter doppelt, Speichere alle y-Werte bis auf und da sie einmal als Anfang und einmal als Ende eines Segments auftreten.
Segmentbaum • Idee • Blätter • q-voll, q-partiell • 1-Umbrella • count(x) • Delta(x) • Einfügen • Löschen • Gesamtlgorithmus
q-voll, q-partiell Knoten A ist q-voll, wenn das Segment von A ganz in q liegt
q-voll, q-partiell Knoten A ist q-partiell, wenn A nicht q-voll ist aber einen Sohn hat, der q-voll oder q-partiell ist.
Segmentbaum • Idee • Blätter • q-voll, q-partiell • 1-Umbrella • count(x) • Delta(x) • Einfügen • Löschen • Gesamtalgorithmus
1-Umbrella Konstrukt um Infomationen effizient in den Knoten zu halten 1-Umbrella für Segment q: -Tip t
1-Umbrella Konstrukt um Infomationen effizient in den Knoten zu halten 1-Umbrella für Segment q: -Tip t - high-line, low-line, high-tip, low-tip
1-Umbrella Konstrukt um Infomationen effizient in den Knoten zu halten 1-Umbrella für Segment q: -Tip t - high-line, low-line, high-tip, low-tip - q-volle Knoten an der high- oder low-line
1-Umbrella Konstrukt um Infomationen effizient in den Knoten zu halten 1-Umbrella für Segment q: -Tip t - high-line, low-line, high-tip, low-tip - q-volle Knoten an der high- oder low-line Analyse:
1-Umbrella Konstrukt um Infomationen effizient in den Knoten zu halten 1-Umbrella für Segment q: -Tip t - high-line, low-line, high-tip, low-tip - q-volle Knoten an der high- oder low-line Analyse: - O(log(n)) Knoten
1-Umbrella Konstrukt um Infomationen effizient in den Knoten zu halten 1-Umbrella für Segment q: -Tip t - high-line, low-line, high-tip, low-tip - q-volle Knoten an der high- oder low-line Analyse: - O(log(n)) Knoten - O(log(n)) Zeit
Segmentbaum • Idee • Blätter • q-voll, q-partiell • 1-Umbrella • count(x) • Delta(x) • Einfügen • Löschen • Gesamtalgorithmus
count(x) • Idee war das Maß in den Knoten zu speichern nicht die Umbellas • Gefahr: Das Maß soll sich nur erhöhen, wenn ein noch nicht ganz enthaltenes Segment eingefügt wird • Gefahr: Beim Löschen muß berücksichtigt werden ob es noch andere Segmente gibt, die das gelöschte Intervall überdecken • Lösung: Zusatzinformation in den Knoten
count(x) • Informationen in den Knoten • Speichere im Knoten x das aktuelle Maß val(x) • Speichere im Knoten x, wie oft x als q-voller Knoten in einem 1-Umbrella vorkommt als count(x)
Segmentbaum • Idee • Blätter • q-voll, q-partiell • 1-Umbrella • count(x) • Delta(x) • Einfügen • Löschen • Gesamtalgorithmus
Delta(x) Aktualisiert val(x) und count(x) im Knoten x, wenn ein Segment eingefügt wird und gibt Änderung zurück Fall 1: Fall 2: - count(x)++ - Änderung=Segmentgröße - val(x) - val(x)=Segmentgröße - count(x)++ - Änderung=0 - val(x) bleibt
Delta(x) Algorithmus: if(val(x)=Segmentgröße){ count(x)++; return 0; } else{ count(x)++; f=Segmetgröße-val(x); val(x)=Segmentgröße; return f; } Laufzeit: O(1)
Segmentbaum • Idee • Blätter • q-voll, q-partiell • 1-Umbrella • count(x) • Delta(x) • Einfügen • Löschen • Gesamtlgorithmus
Einfügen • Berechnen des 1-Umbrellas • Von low- und high-tip bis t mit Delta(x) updaten • Bei t Informationen verschmelzen • Information zur Wurzel propagieren
Einfügen Algorithmus: incr=Delta(low-tip); x=father(low-tip);
Einfügen Algorithmus: incr=Delta(low-tip); x=father(low-tip); while(x!=t){ f=0; if(x hat einen q-vollen Sohn y){ f=Delta(y); }
Einfügen Algorithmus: incr=Delta(low-tip); x=father(low-tip); while(x!=t){ f=0; if(x hat einen q-vollen Sohn y){ f=Delta(y); } if(val(x)=Wert des gesammten von x aufgespannten Segments){ incr=0; } else{ incr=incr+f; val(x)=val(x)+incr; } x=father(x); }