Simplex Range Searching – Windowing Revisited

Werbung
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

Qn   r 
 Qn , 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 Qn   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
O1, 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 Tassoc 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     SELECTINHALFPLANEl  , Tassoc 
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
O1, n  1

M n    On   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 Tassoc von Knoten  auf die Art
 1  
konstruieren können, dass die Suchzeit in Tassoc 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:
O1, n  1

Qn     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:
O1, n  1

Qn   
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:
O1, 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

Herunterladen