Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 Simplex Range Searching Motivation: Bild 1 zeigt eine Landkarte in der die Populationsdichte durch Punkte ab einer Einwohnerzahl von 5.000 Personen dargestellt ist. Falls wir die Auswirkung des Baus eines neuen Flughafen in einer gegebenen Region zeigen wollen, ist es nützlich zu wissen, wie viele Menschen in der betroffenen Region leben. Geometrisch gesprochen haben wir eine Menge von Punkten in der Ebene und wir wollen die Punkte innerhalb der gefragten Region zählen (genauer die Region, innerhalb der der Lärm der Flugzeuge ist, einen gewissen Level überschreitet). Wir möchten im Folgenden eine Datenstruktur entwickeln, die mit allgemeinen Suchgebieten umgehen kann. (Hierbei und im Folgenden folgen wir der Konvention, den Ausdruck „Punkte zählen“ im Sinne von „Zahl der Punkte auflisten“ zu benutzen, nicht im Sinne von die Punkte aufzählen.) Bild 1 Wir diskutieren in diesem Kapitel die ebene Variante des simplex range searching, genannt Dreiecks-Gebiets-Suche: Gegeben sei eine Menge S von n Punkten in der Ebene; wir zählen die Punkte von S innerhalb des betrachteten Dreiecks t. 1. Partitionsbäume Zur Vereinfachung triangulieren wir zunächst die betrachtete Region, indem wir sie in Dreiecke zerlegen. Danach untersuchen wir jedes einzelne resultierende Dreieck. Die Menge der inneren Punkte ist nun eine Vereinigung der Menge der Punkte innerhalb der Dreiecke. Wenn wir die Punkte genauer untersuchen, müssen wir besonders Obacht geben bei den gemeinsamen Punkten, die auf der gemeinsamen Grenze von zwei Dreiecken liegen. Bevor wir uns jedoch an die Dreiecks-Gebiets-Suche herantasten, betrachten wir zunächst das vereinfachte Problem der Halbebenen-Gebiets-Betrachtung, dass wir eine Partitionierung in zwei Halbebenen statt in Dreiecke vornehmen. Es soll also untersucht 1 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 werden, wie viele Punkte in einem betrachteten Gebiet, hier in einer betrachteten Halbebene, liegen. Wie soll die Datenstruktur für Halbebenen-Gebiets-Betrachtung aussehen? Als ein kleines warm-up betrachten wir zunächst das eindimensionale Problem: wir betrachten eine Menge von n Punkten auf der reellen Achse und wir wollen die Punkte auf einer betrachteten Halbgeraden zählen (d.h., die Punkte liegen auf einer bestimmten Seite eines betrachteten Punktes). Wie wir wissen, benutzt man dazu einen blattorientierten balancierten binären Suchbaum, bei dem jeder Knoten auch die Zahl der Punkte seines Unterbaumes speichert. Somit können wir solche Fragen in O(log n) Zeit beantworten. Wie können wir dies nun im Zweidimensionalen verallgemeinern? Um dies beantworten zu können, müssen wir zuerst einen solchen Suchbaum geometrisch interpretieren. Jedes Blatt des Baumes enthält einen Schlüssel -die Koordinaten des Punktes-, um die Punktmengen in die Mengen aufzuteilen, die in den linken und rechten Unterbäumen gespeichert sind. Wir können uns überlegen, dass der Wert dieses Schlüssels die reelle Achse in zwei Stücke teilt. Auf diese Art gilt, dass jedes Blatt des Baumes mit einem Punkt auf der Achse korrespondiert – die Wurzel mit der gesamten Achse, die beiden Kinder der Wurzel mit den beiden Halbachsen, und so weiter. Für jede beliebige Halbachse und jeden Knoten gilt: die Umgebung eines Kindes des Knotens ist sogar komplett in der Halbachse enthalten oder komplett disjunkt davon. Alle Punkte in dieser Umgebung sind in der Halbachse oder gar nicht drin. Folglich haben wir nur rekursiv in dem anderen Unterbaum des Knotens zu suchen. Um dies ins Zweidimensionale zu verallgemeinern, können wir versuchen, die Ebene in 2 Gebiete zu unterteilen, so dass es für jede betrachtete Halbebene ein Gebiet gibt, das entweder ganz in der Halbebene enthalten ist oder vollständig disjunkt davon ist. Leider existiert eine solche Partitionierung nicht, also benötigen wir eine weitere Verallgemeinerung: anstelle von einer Partitionierung in zwei Gebiete müssen wir in mehrere Gebiete unterteilen. Die Partition muss so aussehen, dass wir für jede betrachtete Halbebene rekursiv in nur ein paar anderen Gebieten suchen müssen. Wir geben nun eine formale Definition eines solchen Typs von Partitionierung an, wie wir sie brauchen: Definition: Eine normierte Partitionierung einer Menge S von n Punkten in der Ebene ist ein Tupel S : S1 , t1 ,..., S r , t r , wobei S i disjunkte Teilmengen von S sind, deren Vereinigung S ist, und t i ist ein Dreieck, das S i enthält. Die S i werden Klassen genannt. Wir verlangen nicht von den Dreiecken, dass sie disjunkt sind, so dass ein Punkt von S in mehr als einem Dreieck liegen kann. Dennoch ist solch ein Punkt nur Mitglied einer Klasse. Bild 2 zeigt ein Beispiel für eine normierte Partitionierung der Größe r=5. Es wurden unterschiedliche Grauabstufungen verwendet, um die unterschiedlichen Klassen darzustellen. Wir sagen: eine Gerade l schneidet ein Dreieck t i , falls l das Innere von t i unterteilt. 2 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 (Wenn die Punktmenge S nicht in allgemeiner Position ist, müssen wir manchmal (halboffene) Abschnitte genauso gut wie Dreiecke in der normierten Partitionierung verwenden.) Eine Gerade durchläuft definitionsgemäß genau dann ein Segment, wenn sie dessen (relatives) Inneres durchschneidet, es aber nicht enthält. Die Schnittzahl der Geraden l in Bezug auf S ist die Zahl der Dreiecke von S , die von l geschnitten werden. Somit ist 2 die Schnittzahl von l in Bild 2. Die Schnittzahl von S ist die maximale Schnittzahl über alle möglichen Geraden l. In Bild 2 können Sie Geraden finden, die 4 Dreiecke schneiden, aber keine Gerade schneidet alle 5. Schließlich sagen wir: eine normierte Partitionierung ist gut, 2n wenn S i für alle 1 i r . In anderen Worten: bei guten r normierten Partitionierungen enthält keine der Klassen mehr als die doppelte Durchschnittszahl der Punkte einer Klasse. Bild 2 Nun, da wir die Notation der Partitionierung formalisiert haben, schauen wir, wie wir eine solche Partitionierung für Halbebenen-Gebiets-Betrachtungen verwenden können. Sei h die betrachtete Halbebene. Falls ein Dreieck der Partitionierung nicht von dem Rand von h geschnitten wird, liegt seine Klasse S i sogar komplett in h, oder sie ist vollständig disjunkt von h. Das bedeutet, dass wir nur die Klasse S i durchlaufen müssen, für welche t i vom Rand von h geschnitten wird. Zum Beispiel, falls wir in Bild 2 l , die Halbebene oberhalb von l, betrachten, müssen wir 2 der 5 Klassen durchlaufen. Die Effizienz eines Suchprozesses hängt daher von der Schnittzahl der normierten Partitionierung ab: je kleiner die Schnittzahl, desto besser die Suchzeit. Das folgende Theorem stellt fest, dass es immer möglich ist, eine normierte Partitionierung zu finden mit der Schnittzahl O r ; später müssen wir sehen, was dies für die Suchzeit bedeutet. Theorem 1.1: Für jede Menge S von n Punkten in der Ebene und jeden beliebigen Parameter r mit 1 r n , gibt es eine gute normierte Partitionierung der Größe r und 3 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 Schnittzahl O r . Des Weiteren, für jedes 0 kann eine solche normierte Partition für jedes 0 in der Zeit O n1 konstruiert werden. Ohne Beweis! Wir müssen nun den Beweis als gegeben hinnehmen und uns darauf konzentrieren, wie man dies in der Weise einer effizienten Datenstruktur für Halbebenen-GebietsBetrachtungen benutzt. Die Datenstruktur, die wir betrachten werden, nennt man einen Partitionierungsbaum: Es ist ein Baum, dessen Wurzel r Kinder hat, jedes ist wiederum die Wurzel eines rekursiv definierten Partitionierungsbaumes für eine der Klassen in einer normierten Partitionierung. Es gibt keine spezielle Anordnung für die Kinder. Bild 3 Bild 3 zeigt eine normierte Partitionierung und den korrespondierenden Baum. Die gepunkteten Dreiecke der Partitionierung werden rekursiv für die Klassen, die mit dem mittleren Kind der Wurzel zusammenhängen, berechnet; die fünf Unterklassen sind in fünf Unterbäumen unter dem mittleren Kind gespeichert. Abhängig von der Anwendung speichern wir außerdem einige zusätzliche Informationen über die Klassen. Die Grundstruktur eines Partitionierungsbaumes ist wie folgt: - Falls S nur einen Punkt p enthält besteht der Baum aus nur einem Blatt, in dem p explizit gespeichert ist. Die Menge S ist die kanonische Teilmenge des Blattes. - Außerdem ist die Struktur ein Baum T mit Verzweigungsgrad r, wobei r eine hinreichend große Konstante ist. (Nebenbei müssen wir sehen, wie r gewählt werden muss.) Die Kinder der Wurzel des Baumes stehen in einer 1-zu-1 Beziehung mit den Dreiecken einer guten normierten Partitionierung der Größe r für die Menge S. Das Dreieck der Partitionierung, das mit Kind korrespondiert, ist mit t bezeichnet. Die korrespondierende Klasse in S wird die kanonische Teilmenge von genannt und wird mit S bezeichnet. Das Kind ist die Wurzel eines rekursiv definierten Partitionierungsbaumes T in der Menge S . 4 Seminararbeit Thema: Simplex Rang Searching - Annette Böhm Matr.Nr.: 650274 In jedem Kind speichern wir das Dreieck t . Ebenso speichern wir Informationen über die Teilmenge S ; für Halbebenen-Gebiets-Zählung ist diese Information der Wert von S , aber für andere Anwendungen könnten wir andere Informationen speichern wollen. Wir können nun den Algorithmus zum Zählen der Anzahl der Punkte von S in einer betrachteten Halbebene h beschreiben. Der Algorithmus gibt eine Menge von Knoten des Partitionierungsbaumes T aus, genannt die ausgewählten Knoten, so dass die Teilmenge von Punkten von S, die in h liegen, die disjunkte Vereinigung der kanonische Teilmenge der Knoten in ist. In anderen Worten ist eine Menge von Knoten deren kanonischen Teilmengen disjunkt sind und somit gilt: S h S . Die gewählten Knoten sind genau die Knoten mit der Eigenschaft: t h (oder, im Fall ist ein Blatt, liegt der Punkt, der an gespeichert ist, in h) und es gibt keine Eltern von , so dass t h ist. Die Zahl der Punkte in h kann berechnet werden, indem man die Werte der ausgewählten kanonischen Teilmengen aufsummiert. Algorithmus SELECTINHALFPLANE(h,T) Eingabe: eine betrachtete Halbebene h und ein Partitionierungsbaum (oder ein Unterbaum davon) Ausgabe: eine Menge von kanonischen Knoten für alle Punkte in dem Baum, die in h liegen. 1. 0 2. if T aus einem einzigen Blatt besteht 3. then if der Punkt, der in gespeichert ist, in h liegt then 4. else for jedes Kind der Wurzel von T 5. do if t h 6. then 7. else if t h 0 8. then SELECTINHAFPLANE(h, T ) 9. return Bild 4 veranschaulicht die Schritte des Algorithmus. Die gewählten Kinder der Wurzel sind in schwarz dargestellt. Die Kinder, die rekursiv besucht wurden (genauso wie die Wurzel selbst, bis sie auch besucht worden ist) sind grau. Wie bereits gesagt, kann durch Aufruf von SELECTINHALFPLANE und durch Aufsummieren der Werte der gewählten Knoten, die im Knoten gespeichert sind, die Halbebenen-Gebiets-Betrachtungen gelöst werden. Praktisch gesehen möchte jemand einen Zähler von nicht beibehalten; wenn ein Knoten ausgewählt ist, erhöht der Wert seiner kanonischen Teilmenge den Zähler. 5 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 Bild 4 Wir haben den Partitionierungsbaum, eine Datenstruktur zum Halbebenen-GebietsZählen und dessen Algorithmus beschrieben. Nun ist es Zeit, unsere Struktur zu analysieren. Wir starten mit der Höhe der Speicherung: Lemma 1.2: Sei S eine Menge von n Punkten in der Ebene. Ein Partitionierungsbaum auf S benötigt O(n) Speicherung. Beweis: Sei M(n) die maximale Anzahl der Knoten, die ein Partitionierungsbaum einer Menge S von n Punkten haben kann, und n soll den Wert der kanonischen Untermenge S festlegen. Dann erfüllt M(n) die folgende Rekursion: 1, n 1 M n 1 M n , n 1 wobei wir über alle Kinder der Wurzel des Baumes summieren. Da die Klassen in normierten Partitionierungen disjunkt sind, erhalten wir n n . 2n . r Somit ist für jede Konstante r>2 M n 1 2n cn . Des Weiteren gilt für alle : n Linearzeit ist bestmöglich, aber was ist mit der Suchzeit? Lemma 1.3: 6 Sei S eine Menge von n Punkten in der Ebene. Für beliebiges 0 gibt es einen Partitionierungsbaum für S, so dass wir für eine betrachtete Halbebene h 12 O von dem Baum n Knoten wählen können mit der Eigenschaft, dass die Teilmenge von Punkten von S in h die disjunkte Vereinigung der kanonischen Teilmenge der ausgewählten Knoten ist. Die Wahl dieser Knoten benötigt Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 12 O n Zeit. Wie eine Konsequenz kann die Halbebenen-Gebiets 12 Betrachtung in Zeit O n gelöst werden. Beweis: Sei 0 gegeben. Gemäß Theorem 1.1 gibt es eine Konstante c derart, dass wir für jeden beliebigen Parameter r eine normierte Partitionierung der Größe r konstruieren können mit Schnittzahl bei fast c r . Wir legen dem Partitionierungsbaum die normierte Partitionierung der Größe 1 r : 2 c 2 zu Grunde. Sei Q(n) die maximale Suchzeit für jede Suche in einem Baum nach einer Menge von n Punkten. Sei h eine betrachtete Halbebene und n sei der Wert der kanonischen Teilmenge S . Dann erfüllt Q(n) die folgende Rekursion: 1, n 1 Qn r Qn , n 1 C ( h ) wobei wir über der Menge C(h) aller Kinder der Wurzel, mit t wird vom Rand von h geschnitten, summieren. 2n Somit ist Qn r cn r c d r r e r r e n mit c,d,e r C h konstant, mit n 1 2n für jedes ist. Also ist Q(n)= O n 2 r . Sie könnten nun etwas überrascht sein über die Suchzeit: Die Suchzeit der meisten geometrischen Datenstrukturen, die wir bis jetzt gesehen haben, ist O(log n) oder ein Polynom in log n, wohingegen die Suchzeit für den Partitionierungsbaum um die O n liegt. Offensichtlich ist dies der Preis, den wir zahlen müssen, wenn wir wirklich 2-dim. Suchprobleme lösen möchten, genauso wie Halbebenen-Gebiets-Zählung. Ist es möglich, solche Fragen in logarithmischer Zeit zu lösen? Nein: später werden wir eine Datenstruktur für Halbebenen-Gebiets-Betrachtungen designen mit logarithmischer Suchzeit. Aber diese Verbesserung der Suchzeit wird nicht einfach so kommen, sondern die Datenstruktur wird quadratische Speicherung benötigen. Es gibt einen Zusammenhang(Austausch) zwischen Suchzeit und Speicherung: um die Speicherung zu senken, müssen wir die Zahl der vorberechneten kanonischen Teilmengen senken. Nun kommen wir zurück zu unserem ursprünglichen Problem, der Dreiecks-GebietsBetrachtung. Welche Veränderungen benötigen wir, falls wir Partitionierungsbäume für Dreiecke benutzen möchten, anstelle von Halbebenen als Suchgebiete? Die Antwort ist einfach: Gar keine. Wir können exakt dieselbe Datenstruktur und denselben Algorithmus benutzen, wobei die „betrachtete Halbebene“ durch ein „betrachtetes Dreieck“ ersetzt wird. In der Tat funktioniert die Lösung für jegliches betrachtetes Gebiet . Die einzige Frage ist, was in der Suchzeit passiert. 7 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 Wenn der Algorithmus einen Knoten besucht, gibt es 3 Typen von Kindern: - Die Kinder , für die t komplett in dem Suchgebiet liegt, - Die Kinder , für die t außerhalb des Gebietes liegt und - Die Kinder , für die t teilweise in dem betrachteten Gebiet liegt. Nur die Kinder des 3. Typs müssen rekursiv besucht werden. Die Suchzeit hängt deshalb von dem betrachteten Gebiet ab. In anderen Worten müssen wir sehen, was die Schnittzahl von in Bezug auf die normierte Partitionierung ist. Für eine dreieckige betrachtete Region ist dies einfach: ein Dreieck in der Partitionierung wird von dem Rand von nur geschnitten, wenn es von einer der 3 Linien, die durch die Ecken von verlaufen, geschnitten wird. Sobald jede der Linien höchstens c r Dreiecke unterteilt, ist die Schnittzahl von höchstens 3c r . Die Rekursion für die Suchzeit bleibt fast dieselbe, nur die Konstante c wird zu 3c. Als ein Resultat werden wir r größer wählen müssen, aber schließlich bleibt die Suchzeit asymptotisch dieselbe. Wir erhalten folgendes Theorem: Theorem 1.4: Sei S eine Menge von n Punkten in der Ebene. Für beliebiges 0 gibt es eine Datenstruktur für S, genannt Partitionsbaum, die O(n) Speicherung benötigt, so dass die Punkte von S, die innerhalb eines betrachteten Dreiecks 1 liegen, in O n 2 Zeit gezählt werden können. Die Punkte können in weiterer O(k) Zeit aufgelistet werden, wobei k die Zahl der aufgelisteten Punkte ist. Die Struktur kann in O n1 Zeit konstruiert werden. Beweis: Die einzigen 2 Fälle, die noch nicht diskutiert wurden, sind die Konstruktionszeit und die Anzeige der Punkte. Einen Partitionsbaum zu konstruieren ist einfach: die rekursive Definition, die vorher direkt gegeben wurde, impliziert einen rekursiven Aufbau-Algorithmus. Wir setzen fest, dass die Zeit, die dieser Algorithmus benötigt, um einen Partitionsbaum zu konstruieren für eine Menge von n Punkten, T(n) ist. Sei 0 gegeben. Mit Theorem 1.1 können wir eine gute normierte Partition für S von Größe r mit Schnittzahl O r in Zeit O n1 ` für beliebiges ` 0 konstruieren. Sei ` . Somit: T(n) erfüllt die Rekursion: 2 O1, n 1 T n 1 2 O n T n , n 1 wobei wir über alle Kinder der Wurzel des Baumes summieren. Weil die Klassen bei einer normierten Partition disjunkt sind, haben wir n n und die Lösung der Rekursion ist T n O n . Es bleibt zu zeigen, dass die k Punkte in einem gewünschten Dreieck in O(k) weiterer Zeit angezeigt werden können. Diese Punkte werden gespeichert in den Blättern unterhalb der gewählten Knoten. Folglich können diese durch Durchlaufen der Unterbäume, die im gewählten Knoten verwurzelt sind, 1 8 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 aufgelistet werden. Weil die Zahl der inneren Knoten eines Baumes linear bei der Zahl der Blätter des Baumes ist, benötigt dies Linearzeit bei der Zahl der aufgelisteten Knoten. 2. Multi-Level-Partitionsbäume Bei Halbebenen-Gebiets-Zählung war die einzige Information, die wir über die gewählten kanonischen Teilmengen im Partitionierungsbaum gespeichert hatten, ihr Wert. Was ist, wenn wir weitere Informationen über die kanonischen Teilmengen benötigen? Was ist, wenn wir die Elemente der kanonischen Teilmenge in einer Liste oder in einem Baum oder irgend einer Art von Datenstruktur, die wir mögen, speichern möchten? Zur Beantwortung dieser Fragen erhalten wir eine Multi-Level-Datenstruktur. Wir machen nun ein Beispiel für eine Multi-Level- Datenstruktur basierend auf Partitionierungsbäumen: Sei S eine Menge von n Liniensegmenten in der Ebene. Wir möchten die Zahl der Segmente, die durch eine gewünschte Gerade l unterteilt sind, zählen. Seien p right s und p left s die rechten und linken Endpunkte eines Segmentes s. Eine Gerade l schneidet s, falls und nur falls jeder der Endpunkte von s auf unterschiedlichen Seiten von l liegt oder s einen Endpunkt auf l hat. Wir zeigen, wie man die Zahl der Segmente von s S , mit p right s liegt oberhalb l und p left s liegt unterhalb, zählt. Die Segmente mit einem Endpunkt auf l und diejenigen, bei denen p right s unterhalb von l und p left s oberhalb l liegen, können durch eine ähnliche Datenstruktur gezählt werden. Hier wählen wir – für eine vertikale Linie -, die linke Seite sei unterhalb von l, und die rechte Seite oberhalb von l. Die Idee der Datenstruktur ist einfach. Wir finden zuerst alle Segmente s S , so dass p right s oberhalb von l liegt. In dem vorherigen Abschnitt sahen wir, wie man einen Partitionierungsbaum verwendet, um diese Segmente aus einer Zahl von kanonischen Teilmengen, auszuwählen. Für jede dieser ausgewählten kanonischen Teilmengen sind wir an der Zahl der Segmente s mit p left s unterhalb von l interessiert. Das ist eine HalbebenenGebiets-Zählungs-Betrachtung, die beantwortet werden kann, falls wir jede kanonische Teilmenge in einem Partitionierungsbaum speichern. Wir beschreiben diese Lösung in einem weiteren Detail. Die Datenstruktur ist wie folgt definiert: Für eine Menge S` von Segmenten sei Pright S´ : p right s : s S `die Menge von rechten Endpunkten der Segmente in S` , und sei Pleft S´ : pleft s : s S ` die Menge der linken Endpunkte der Segmente in S`. - Die Menge Pright S ist in einem Partitionierungsbaum T gespeichert. Die kanonische Teilmenge von einem Knoten von T ist Pright . Die Menge von Segmenten, die mit den linken Endpunkten in Pright zusammenhängen, sind 9 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 S genannt, mit S s : p right s Pright . (Variieren wir die Terminologie - leicht, nennen wir manchmal S die kanonische Teilmenge von .) Mit jedem Knoten der First-Level-Baumes T speichern wir die Menge Pleft S in einem Second-Level-Partitionierungsbaum Tassoc für Halbebenen- Gebiets-Zählung. Dieser Partitionierungsbaum ist die assoziierte Struktur von . Mit dieser Datenstruktur können wir die Segmente s S mit p right s oberhalb von l aus einer Zahl von kanonischen Teilmengen auswählen. Um die Zahl dieser Segmente zu zählen, ist alles, was wir zu tun haben, die Werte der ausgewählten Teilmengen zu summieren. Sei T der Unterbaum von T , der in verwurzelt ist. Algorithmus: SELECTINTSEGMENTS(l,T) Eingabe: Eine betrachtete Gerade l und ein Partitionierungsbaum (oder ein Unterbaum davon) Ausgabe: eine Menge von kanonischen Knoten für alle Segmente in dem Baum, die durch l unterteilt sind. 1. 0 2. if T aus einem einzigen Blatt besteht 3. then if das Segment, das in gespeichert ist, l unterteil then 4. else for jedes Kind der Wurzel von T 5. do if t l 6. then SELECTINHALFPLANEl , Tassoc 7. 8. 9. return else if t h 0 then SELECTINTSEGMENTS(l, T ) Der gegebene Suchalgorithmus kann die Segmente mit dem rechten Endpunkt oberhalb der gefragten Linie und dem linken Endpunkt unterhalb ihr finden. Interessanter Weise kann derselbe Partitionierungsbaum benutzt werden, um die Segmente mit dem linken Endpunkt oberhalb der gefragten Linie und dem rechten unterhalb ihr zu finden. Nur der Algorithmus muss geändert werden: tausche l durch l aus und wir sind fertig. Nun analysieren wir unseren Multi-Level-Partitionierungsbaum für Auswahl bei Segmentunterteilung. Wir starten mit die Höhe der Speicherung: Lemma 2.1: Beweis: 10 Sei S eine Menge von n Segmenten in der Ebene. Ein Two-LevelPartitionierungsbaum für Auswahlbetrachtung bei Segmentunterteilung in S benötigt O(n log n) Speicherung. Sei n der Wert der kanonischen Teilmenge S im First-LevelPartitionierungsbaum. Die Speicherung für diesen Knoten besteht aus einem Partitionierungsbaum für S , und mit Lemma 1.2 wissen wir, dass dies lineare Speicherung benötigt. Somit erfüllt die Speicherung M(n) für einen TwoLevel-Partitionierungsbaum über n Segmenten die Rekursion Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 O1, n 1 M n On M n , n 1 wobei wir über alle Kinder der Wurzel des Baumes summieren. Wir wissen, 2n dass n n und n ist. Wenn r>2 eine Konstante ist, ist die Lösung r en 1 1 en log n mit der Rekursion M n cn dn en en 1 r r 1 r c, d, e konstant. Fügt man also einen zweiten Level zu dem Partitionierungsbaum hinzu, erhöht dies die Höhe der Speicherung um einen logarithmischen Faktor. Was ist mit der Suchzeit? Überraschender Weise ändert sich die Suchzeit asymptotisch überhaupt nicht. Lemma 2.2: Sei S eine Menge von n Segmenten in der Ebene. Für beliebiges 0 gibt es einen Two-Level-Partitionierungsbaum für S, so dass wir für eine betrachtete 12 Gerade l O n Knoten aus dem Baum mit der Eigenschaft, dass die Teilmenge von Segmenten von S, die durch l unterteilt wird, die disjunkte Vereinigung der kanonischen Teilmengen der ausgewählten Knoten ist, 12 auswählen können. Die Wahl dieser Knoten benötigt O n Zeit. Folglich 1 kann die Zahl der unterteilten Segmente in O n 2 Zeit gezählt werden. Beweis: Wir benutzen wieder eine Rekursion, um die Suchzeit zu analysieren. Sei 0 gegeben. Sei n der Wert der kanonischen Teilmenge S . Lemma 1.3 sagt uns, dass wir die assoziierte Struktur Tassoc von Knoten auf die Art 1 konstruieren können, dass die Suchzeit in Tassoc O n 2 ist. Nun betrachten wir den gesamten two-level Baum T auf S. Wir basieren diesen Baum auf einer guten normierten Partitionierung der Größe r mit Schnittzahl von maximal 1 c r , für r : 2 c 2 ; eine solche Partitionierung existiert im Two-Level Baum für eine Menge von n Segmenten. Dann erfüllt Q(n) die Rekursion: O1, n 1 Qn 12 c r 2n O rn Q r , n 1 i 1 11 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 12 Mit unserer Wahl von r ist die Lösung dieser Rekursion Q(n)= O n . Diese Grenze der Suchzeit impliziert direkt die Grenze der Zahl der gewählten kanonischen Teilmengen. 3. Schnittbäume Bisher haben wir die planaren Gebiets-Such-Probleme mit Partitionierungsbäumen gelöst. Die Speicherungsvoraussetzungen der Partitionierungsbäume sind gut; sie benutzen 1 annähernd lineare Speicherung. Die Suchzeit ist jedoch O n 2 und dies ist etwas hoch. Können wir eine bessere Suchzeit, z.B. O(log n) erreichen, falls wir willens sind, mehr als lineare Speicherung zu geben? Um überhaupt Hoffnung auf Erfolg zu haben, müssen wir auf die Annäherung vom Gebrauch von normierten Partitionen verzichten: es ist nicht möglich, normierte Partitionierungen mit weniger als O r Schnittzahlen zu konstruieren, welche gebraucht wird, um eine Suchzeit schneller als O n zu erreichen. q Bild 5 Um eine neue Annäherung an das Problem zu präsentieren, müssen wir es in einem neuen Licht betrachten. Das erste Problem, das wir in Abschnitt 1 gelöst haben, war das Halbebenen-Gebiets-Zählungs-Problem: gegeben sei eine Menge von Punkten, zähl die Zahl der Punkte, die in einer betrachteten Halbebene liegen. Schauen wir, was wir erhalten, wenn wir dieses Problem in der dualen Ebene betrachten. Wir fassen zusammen, dass die betrachtete Halbebene positiv ist, das heißt, wir möchten die Punkte oberhalb der betrachteten Geraden zählen. In der dualen Ebene haben wir dann folgendes Setting: gegeben ist eine Menge L von n Geraden in der Ebene, wir zählen die Geraden unterhalb eines betrachteten Punktes q. In dem Kapitel über Arrangements haben wir gelernt, dass wir ein Arrangement A(L) konstruieren können, es für Punkt-Lokalisierungs-Betrachtungen vorausberechnen und mit jeder Seite die Zahl der Geraden unterhalb eines betrachteten Punktes speichern. Diese Lösung benötigt O n 2 Speicherung und sie hat O(log n) Suchzeit. Aber wenn wir zu Dreiecks-Gebiets-Zählung übergehen, ist diese Annäherung nicht so gut: es gibt einfach zu viele mögliche Dreiecke, um alle möglichen Antworten vorauszuberechnen. 12 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 Stattdessen wollen wir versuchen, die Menge der Geraden unterhalb eines betrachteten Punktes durch eine kleine Zahl von kanonischen Teilmengen auf rekursive Weise, auszudrücken. Dann können wir die Multi-Level-Annäherung aus dem vorigen Abschnitt benutzen, um das Dreiecks-Gebiets-Betrachtungs-Problem zu lösen. Wir konstruieren die gesamte Sammlung von kanonischen Teilmengen, indem wir eine Datenstruktur, genannt Schnittbaum, benutzen. Die Idee hinter Schnittbäumen ist dieselbe wie für Partitionierungsbäume: die Ebene ist in dreieckige Regionen unterteilt, wie in Bild 6 dargestellt ist. Zur Zeit verlangen wir, dass die Dreiecke disjunkt sind. Wie kann eine solche Partitionierung helfen, die Zahl der Geraden unterhalb eines betrachteten Punktes zu zählen? Sei L : l1 , l 2 ,..., l n die Menge von Geraden, die wir nach Dualisierung der Punkte, die für Dreiecks-Gebiets-Betrachtung vorausberechnet werden, erhalten. Wir wählen ein Dreieck t der Partitionierung und l i eine Gerade , die t nicht untereilt. Falls l i unterhalb von t liegt, dann liegt l i unterhalb eines betrachteten Punktes innerhalb von t. Ähnlich, falls l i oberhalb von t liegt, liegt er oberhalb eines betrachteten Punktes innerhalb von t. Dies bedeutet, dass, falls unser betrachteter Punkt q in t liegt, sind die einzigen Geraden von welchen wir noch nicht wissen, ob sie oberhalb oder unterhalb von q liegen, diejenigen, die t unterteilen. Unsere Datenstruktur wird jedes Dreieck der Partitionierung speichern, mit einem Zähler, der die Zahl der Geraden unterhalb von ihm anzeigt; für jedes Dreieck haben wir ebenfalls eine rekursiv definierte Struktur von Geraden, die es unterteilen. Um in dieser Struktur zu betrachten, determinieren wir zuerst in welchem Dreieck t der betrachtete Punkt q fällt. Wir berechnen dann voraus, wie viele Geraden von denjenigen, die t unterteilen, unterhalb von q sind, durch rekursiven Besuch des Unterbaumes, der mit t zusammenhängt. Schließlich fügen wir die Zahl hinzu, die wir in dem rekursiven Aufruf bis zu der Zahl der Geraden unterhalb von t berechneten. Die Effizienz dieser Annäherung hängt von der Zahl der Geraden, die ein Dreieck unterteilen, ab: je kleiner die Zahl, desto weniger Geraden, über die wir wiederkehren müssen. Wir definieren nun formell die Art der Partitionierung die wir benötigen. Bild 7 Definition: Sei L eine Menge von n Geraden in der Ebene und sei r ein Parameter mit 1 r n . Es heißt: eine Gerade schneidet ein Dreieck, falls sie das 1 Innere des Dreiecks unterteilt. Ein -Schnitt von L ist eine Menge r L : t1 ,..., t m der möglicherweise unbegrenzten Dreiecke mit 13 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 disjunkten Inneren die zusammen die Ebene ergeben, mit der n r Geraden von L geschnitten wird. Die Größe des Schnittes L ist die Zahl der Dreiecke, aus der er besteht. Bild 6 zeigt ein Beispiel eines Schnittes. Eigenschaft, dass kein Dreieck der Partitionierung durch mehr als Theorem 3.1: Für eine beliebige Menge L von n Geraden in der Ebene, und beliebigen 1 Parameter r mit 1 r n , existiert ein - Schnitt der Größe O r 2 . Zudem r kann ein solcher Schnitt (wobei für jedes Dreieck im Schnitt die Teilmenge der Geraden von L, die ihn kreuzen) in Zeit O(nr) konstruiert werden. Ohne Beweis! Wir sollten uns nun damit beschäftigen, wie Schnitte benutzt werden können, um Datenstrukturen zu designen. Die Datenstruktur, die auf Schnitten basiert, heißt Schnittbaum. Die grundlegende Struktur eines Schnittbaumes für eine Menge L von n Geraden ist wie folgt: - Falls die Mächtigkeit von L 1 ist, dann besteht der Schnittbaum aus einem einzelnen Blatt, in dem L explizit gespeichert ist. Die Menge L ist die kanonische Teilmenge des Blattes. - Andernfalls ist die Struktur ein Baum T . Es besteht eine 1- zu- 1 Beziehung 1 zwischen den Kindern der Wurzel des Baumes und den Dreiecken eines r Schnittes L für die Menge L, wobei r eine genügend große Konstante ist. (Unten können wir sehen, wie r gewählt werden soll.) Das Dreieck des Schnittes, das mit einem Kind zusammenhängt, wird mit t bezeichnet. Die Teilmenge der Geraden in L, die unterhalb von t liegt, heißt die tiefere kanonische Teilmenge von ; geschrieben: L , analog: höhere kanonische Teilmenge: L . Die Teilmenge von Geraden, die t schneidet, heißt die Schnittteilmenge von t . Das Kind ist die Wurzel eines rekursiv definierten - Partitionierunsbaumes der Schnittteilmenge. Dieser Teilbaum wird mit T bezeichnet. Mit jedem Kind speichern wir das Dreieck t . Wir speichern auch Information über die tieferen und höheren kanonischen Teilmengen L und L ; um die Zahl der Geraden unterhalb des betrachteten Punktes zu zählen, müssen wir nur den Betrag der Menge L speichern, aber für andere Anwendungen sollten wir andere Information speichern. Bild 7 veranschaulicht den Begriff der tieferen kanonischen Teilmenge, der höhere kanonische Teilmenge und Schnittteilmenge. Wir beschreiben einen Algorithmus, um die Geraden von L, die unterhalb eines betrachteten Punktes in einer Zahl von kanonischen Teilmengen liegen, auszuwählen. Um die Zahl solcher Geraden zu zählen, müssen wir die Beträge der ausgewählten kanonischen Teilmengen aufsummieren. Sei q der betrachtete Punkt. Die Menge der ausgewählten Knoten wird mit bezeichnet. 14 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 =obere kanon. Teilmenge = Schnittteilmenge =untere kanon. Teilmenge Bild 8 Algorithmus: SELECTBELOWPOINT(q,T) Eingabe: Ein betrachteter Punkt q und ein Schnittbaum (oder Unterbaum davon) Ausgabe: Eine Menge von kanonischen Knoten für alle Geraden im Baum, die unterhalb von q liegen. 1. 0 2. if T aus einem einzigen Blatt besteht 3. then if die Gerade, die in gespeichert ist, unterhalb von q liegt, then 4. else for jedes Kind der Wurzel von T 5. do überprüfe, ob q in t liegt 6. Sei q das Kind, so dass q t q . then q SELECTBELOWPOINT(q, T q ) 7. 8. return Lemma 3.2: Sei L eine Menge von n Geraden in der Ebene. Benutzen wir einen Schnittbaum, können die Geraden von L unterhalb eines betrachteten Punktes in O(log n) Zeit aus O(log n) kanonischen Teilmengen ausgewählt werden. Folglich kann die Zahl solcher Geraden in O(log n) Zeit gezählt werden. Für beliebiges 0 kann ein Schnittbaum von L konstruiert werden, der O n 2 Speicherung benötigt. Beweis: Sei Q(n) die Suchzeit, die in einem Schnittbaum für eine Menge von n Geraden benötigt wird. Dann erfüllt Q(n) die Rekursion: O1, n 1 Qn n 2 O r Q r , n 1 Die Lösung für diese Rekursion ist Q(n)=O(log n) für beliebige Konstante r>1. 1 Sei 0 gegeben. Mit Theorem 3.1 können wir einen - Schnitt für L der r 2 Größe cr konstruieren, wobei c eine Konstante ist. Wir konstruieren einen 15 Seminararbeit Thema: Simplex Rang Searching Annette Böhm Matr.Nr.: 650274 1 1 Schnittbaum basierend auf - Schnitten für r : 2c . Die Höhe der r Speicherung, die vom Schnittbaum benötigt wird, M(n), erfüllt: O1, n 1 M n O r 2 M n , n 1 wobei wir über alle Kinder der Wurzel des Baumes summieren. Die Zahl der n Kinder der Wurzel ist cr 2 , und n für alle Kinder . Folglich ist die r Lösung der Rekursion mit unserer Wahl von r M n O n 2 . 16