1 Folie/Blatt - Chair 11: ALGORITHM ENGINEERING

Werbung
Kap. 6: Geometrische Algorithmen
6.1 Mehrdimensionale Suchstrukturen
Professor Dr. Petra Mutzel
Lehrstuhl für Algorithm Engineering, LS11
Fakultät für Informatik, TU Dortmund
23.-26. VO A&D WS 08/09 20./22./27./29.01.2009
Petra Mutzel
Alg. & Dat.
WS 08/09
1
Überblick:
6.1 Mehrdimensionale Suchstrukturen
6.1.1 Einführung in mehrdimensionale
Suchstrukturen
6.1.2 Point-region quad trees
6.1.3 Point quad trees
6.1.4 K-d trees
6.1.5 Range trees
Petra Mutzel
Alg. & Dat.
WS 08/09
2
Literatur: Bücher
•  M. de Berg, O. Cheong, M. van Krefeld, und M.
Overmars: Computational Geometry, Springer 2008,
Kap. 5: Orthogonal Range Searching, Kap. 14:
Quadtrees
•  H. Samet: The Design and Analysis of Spatial Data
Structures. Addison-Wesley, Reading, MA, 1990
•  F. P. Preparata und M. I. Shamos: Computational
geometry: an introduction, 1985, Springer, Kap. 2.3
Range-Searching Problems
Petra Mutzel
Alg. & Dat.
WS 08/09
3
Literatur: Paper
•  R. A. Finkel und J. L. Bentley: Quad trees: A data
stucture for retrieval on composite keys, Acta Informatica
4, 1974, S. 1-9
•  J. L. Bentley: Multidimensional binary search trees used
for associative searching, Communications of the ACM,
vol. 18, no. 9, 1975, S. 509-517
•  J. L. Bentley and H. A. Maurer: Efficient Worst-Case
Data Structures for Range Searching, Acta Informatica,
vol. 13, no. 2, 1980, S. 155-168
•  G.S. Lueker: A data structure for orthogonal range
queries, Proc. 19th Annual IEEE Symposium on
Foundations of Computer Science, 1978, S. 28-34
Petra Mutzel
Alg. & Dat.
WS 08/09
4
6.1.1 Einführung in
mehrdimensionale Suchstrukturen
•  Gegeben:
–  Menge S von N Punkten in Rk
–  Familie U von Untermengen von Rk (Ranges)
–  δ∈U
•  Gesucht:
–  Vorverarbeitung von S, so dass Abfragen der Art:
``Berichte alle Punkte in S∩δ´´ effizient berichtet
werden können.
•  Beispiel: Datenbankabfragen
Petra Mutzel
Alg. & Dat.
WS 08/09
5
Anwendungsbereiche
• 
• 
• 
• 
• 
• 
• 
• 
• 
Datenbanken
Computergraphik / Computer Vision
Computer-Aided Design
Geographische Informationssysteme
Bildverarbeitung
Mustererkennung
Document-Retrieval
Data Mining
...
Petra Mutzel
Alg. & Dat.
WS 08/09
6
Charakterisierung (1)
•  Welche Datentypen werden gespeichert?
–  S ist ungeordnete Menge (z.B. Index)
–  S ist kartes. Produkt S1х S2 х...х Sk geordn.
Mengen
•  Dimension:
–  k ist kleiner gleich 10
•  Operationen:
–  Find, Insert, Delete, (Pred., Succ., Min, Max)
•  Welche Speichermedien?
–  intern vs. extern
Petra Mutzel
Alg. & Dat.
WS 08/09
7
Charakterisierung (2)
•  Welche Objekttypen werden gespeichert?
–  Punkte, Container (z.B. Quader in 3D), komplexere
–  Lage fixiert oder beweglich?
•  Welche Abfragen und wie oft?
–  Ist Punkt enthalten?
–  Aufzählung aller Punkte, die in gewünschtem k-dim.
Bereich liegen
–  Welche Punkte liegen in der Nähe eines Punktes?
–  Finde die n nächsten Nachbarn eines Punktes
–  Exakte vs. partielle Abfragen
–  Einmalige vs. viele Abfragen
Petra Mutzel
Alg. & Dat.
WS 08/09
8
Wir betrachten folgende
Abfragen:
•  Punkt-Abfrage (Point Query):
–  Ist ein gegebener Datenpunkt in S∈Rk enthalten, und
falls ja, dann finde diesen.
•  Bereichsabfrage (Range Query):
–  Berichte alle Punkte aus S, deren k Schlüssel in den
gewünschten Bereichen liegen.
•  Orthogonale (bzw. rechteckige) Bereichsabfrage:
–  Wie Bereichsabfrage und zusätzlich ist der Bereich
rechteckig
Petra Mutzel
Alg. & Dat.
WS 08/09
9
Einfache Datenstrukturen
•  Sequentielle Liste
–  Aufwand: O(N k)
•  Invertierte Liste (Knuth 1973)
–  Sortierte Liste pro Schlüssel
–  Durchschnittlicher Aufwand:
O(N1-1/k)
–  Aufwand: O(N k)
Petra Mutzel
Name
X-key
Y-key
D
5
45
C
35
40
O
25
35
M
50
10
X-key
Y-key
D
M
O
O
C
C
M
D
Alg. & Dat.
WS 08/09
10
``Fixed Grid´´ Methode
•  Suchraum wird in gleiche Teile (Buckets) der Größe r
aufgeteilt, wobei r der Suchradius ist
•  Realisiert als k-dim. Array mit einem Eintrag per Bucket;
jeder Bucket enthält Punkte in Form einer einfachen Liste
•  Durchschnittlicher Suchaufwand für Bereichssuche
(Bentley 1977): O(F 2k), wobei F die Anzahl der
berichteten Punkte ist
•  Effizient, wenn fixer Radius und Datenpunkte gleichmäßig
im Raum verteilt sind (Kartographie)
•  Teilt den Raum auf
Petra Mutzel
Alg. & Dat.
WS 08/09
11
„Trie“
Region Quadtrees
•  Repräsentation eines 2-dim. Binärbildes (Region Data)
•  Rekursive Teilung eines 0/1-Bereiches in vier gleich große
Quadranten, STOP falls Block nur 0 oder nur 1 enthält
•  Suchbaum mit Grad 4 (s. Beispiel)
•  Jedes Kind eines Knotens repräsentiert Quadranten
(NW,NE,SW,SE)
•  Blätter → Aufteilung nicht weiter notwendig
•  Blätter sind entweder ``weiß´´ oder ``schwarz´´, innere
Knoten sind ``grau´´
Petra Mutzel
Alg. & Dat.
WS 08/09
12
6.1.2 Point-Region Quadtrees
voneines
Punkten
in einem
k-dim. Bereich
•  Repräsentation
Repräsentation
2-dim.
Binärbildes
(Region Data)
•  Rekursive Teilung eines quadratischen
0/1Bereiches in vier
gleich große Quadranten, STOP falls Block nur 0 oder nur
1 Punkt enthält
•  Jedem Feld wird ein Knoten in einem Suchbaum mit
Maximal- Grad 4 zugeordnet
•  Jedes Kind eines Knotens repräsentiert Quadranten
(NW,NE,SW,SE)
•  Blätter ← Aufteilung nicht weiter notwendig
•  Blätter sind entweder ``weiß´´ (falls kein Punkt enthalten
ist) oder ``schwarz´´ (sonst), innere Knoten sind ``grau´´
Petra Mutzel
Alg. & Dat.
WS 08/09
13
(0,100)
(100,100)

k=2
Point-Region Quadtrees:
Beispiel N=10 Punkte
y
(0,0)
x
(100,0)
PR Quadtree für Beispiel
(50,50)
(75,75)
(25,25)
Petra Mutzel
(75,25)
Alg. & Dat.
WS 08/09
15
k=2:
Aufbau eines PR Quadtrees
Top-Down Aufbau:
•  Starte mit Feld B, das alle Knoten enthält
•  Sei vB der zugehörige Knoten im Suchbaum
•  Falls B mehr als einen Knoten enthält, dann
–  erzeuge 4 Kinder von vB im Suchbaum
–  weise jedem Kind-Feld Bi alle Knoten aus B zu, welche
in Bi enthalten sind
–  entferne leere Kind-Felder vBi im Baum
Alternativ: Insert-Aufbau:
•  Starte mit leerem Feld B und füge iterativ die Knoten ein
•  Einfügen geht ähnlich wie bei binären Suchbäumen:
suche das richtige Feld, Suche endet an Blatt, füge ein.
„Z-Order, DFS-Order“
Morton Order
[Morton 1966] space filling curve: bildet einen
k-dimensionalen Bereich auf eine Dimension ab
Abb. aus
Wikipedia
Laufzeit ?
Baum hat Tiefe N
→
Laufzeiten beider Aufbau-Algorithmen: O(N2)
(0,100)
(100,100)
1

1
2
y
2
3
3
5
(0,0)
4
x
(100,0)
4
5
6.1.3 Point Quad Trees
•  Eingeführt von Finkel & Bentley 1974
•  Multidimensionale Verallgemeinerung von binären
Suchbäumen
•  Verheiratung von ``Fixed Grid´´ mit binären Suchbäumen
•  Rekursive Teilung an Datenpunkten in jeweils vier Teile:
NW,NE,SW, SE
•  Hier Annahme:
–  k=2, Verallg. einfach
–  Jeder Punkt wird nur einmal besetzt
Petra Mutzel
Alg. & Dat.
WS 08/09
19
Beispiel:
G
H
K
F
D
J
C
B
L
I
E
A
M
N
Point Quadtree zu Beispiel
A
J
K
F
L
H
G
M
B
D
C
I
E
N
Point Quad Trees: Operation
Insert
•  Jeder innere Knoten enthält
–  Zeiger zu Kindern NW,NE,SW,SE
–  CHILD(P,I): gibt Kind im Quadranten I von Knoten P an
–  XCOORD, YCOORD: Koordinaten von Punkt
–  NAME: Information über Punkt (z.B. Name)
•  Ähnlich wie für binäre Suchbäume:
–  Suche den Punkt (nach x und y-key)
–  Wenn Blatt erreicht ist, dann bestimme Position, an die
eingefügt werden muss.
Petra Mutzel
Alg. & Dat.
WS 08/09
22
Beispiel: Insert Z
G
H
K
F
D
J
B
L
Z
C
I
E
A
M
N
Petra Mutzel
Alg. & Dat.
WS 08/09
23
Point Quadtree zu Beispiel:
Insert Z
A
J
K
F
L
H
G
M
B
D
C
I
E
Z
N
Point Quadtrees: Analyse Aufbau
•  Aufbau eines Point Quadtrees:
–  Aufwand ist äquivalent zur Gesamtpfadlänge = Kosten,
um nach allen Elementen einmal zu suchen
•  Gesamtpfadlänge:
–  Hängt von Reihenfolge der Einfügungen der Punkte ab
–  Empirisch: N log4 N (Finkel & Bentley)
–  Worst Case: θ(N2)
•  Aufwand für Insert und Search
–  Empirisch: O(log4 N)
–  Worst Case: O(N)
–  Re-Balancing Methoden sind möglich
Petra Mutzel
Alg. & Dat.
WS 08/09
27
Point Quadtrees: Deletion
•  Problem:
–  Geht nicht so leicht wie bei binären Suchbäumen
–  Beispiel: Entfernung von A
Petra Mutzel
Alg. & Dat.
WS 08/09
28
Beispiel: Deletion
Delete A:
G
H
K
F
D
J
C
B
L
I
E
A
M
N
Beispiel: Deletion
Delete A:
G
H
K
F
D
J
C
B
L
I
E
A
M
N
Point Quadtrees: Deletion
•  Problem:
–  Unterbäume des gelöschten Knotens müssen eventuell
neu eingefügt werden, denn sie sind nicht mehr im
richtigen Quadranten bzgl. der neuen Wurzel
–  Original-Vorschlag war daher: alle diese Unterbäume neu
einfügen
–  Besser: Vorschlag von Samet:
Petra Mutzel
Alg. & Dat.
WS 08/09
31
Point Quadtrees: Deletion
•  Problem:
–  Unterbäume des entfernten Knotens müssen neu
eingefügt werden
–  Alle Knoten mit deren Unterbäumen, die in der
Zwischenregion liegen, müssen neu eingefügt werden.
•  Idee:
–  Wähle in jedem Unterquadranten des zu entfernenden
Knotens einen Kandidaten aus, der am nächsten bei x
oder y-Koordinate ist.
–  Wähle aus diesen vier Kandidaten dann den besten aus.
Petra Mutzel
Alg. & Dat.
WS 08/09
32
Wunsch: Finde einen Punkt Z, so dass die
Zwischen-RegionBeispiel:
def. durch Z und A leer ist
G
H
K
F
D
J
C
B
L
I
E
A
M
N
Petra Mutzel
& Dat. WS 08/09
Problem: Z muss
nichtAlg.existieren!
33
Deletion:
FIND_CANDIDATE(P,Q)
Pointer node procedure FIND_CANDIDATE(P,Q)
// P pointer to the son in quadrant Q of the
node to be deleted. //
// OPQUAD(Q) gives quadrant 180 degrees
apart from Q //
1.  begin
2.  if not(null(P))
3. 
while not(null(CHILD(P,OPQUAD(Q)))) do
4. 
P  CHILD(P,OPQUAD(Q));
5.  return(P);
6.  end;
Petra Mutzel
Alg. & Dat.
WS 08/09
34
Kriterium 1: Wähle denjenigen, der am nächsten
Beispiel:
Kandidaten
bei A liegt
bzgl. x und y nach
Punkt mit Kriterium
1 muss nicht existieren: Bsp
FIND_CAND
G
H
K
F
D
J
C
B
L
I
E
A
M
N
Kriterium 1 garantiert, dass Zwischenregion leer ist
Kriterium 1: Wähle denjenigen, der am nächsten bei A liegt
bzgl. x und y
Kriterium 2 (NEU): Wähle denjenigen Punkt i mit kleinstem
Punkt
1 muss nichtmin
existieren:
Bsp
Abstandmit
zu Kriterium
einer Koordinatenachse:
(|xi-x|,|yi-y|)
Beispiel: Kandidaten nach
FIND_CAND
y
G
H
K
D
J
C
B
L
A
M
F
I
E
x
Denn: Punkt im Quadranten gegenüber
liegt sicher nicht in Zwischenregion
und mind. ein anderer Punkt ist auch
außerhalb.
Kriterium 1 garantiert, dass Zwischenregion
leer ist
N
Kriterium 2 garantiert, dass höchstens ein anderer
Kandidat innerhalb der Zwischenregion liegt
Point Quadtrees: Deletion - Vorgehen
•  Sei P der zu entfernende Punkt, R ist Wurzel
•  Falls P kein oder nur ein Kind hat: einfach
•  Sonst:
–  Bestimme die vier Kandidaten pro Quadrant
–  Bestimme den besten Kandidaten nach Kriterien 1,2
–  Sei J bester Kandidat, J liegt in Quadrant Q bzgl. P:
–  Kopiere xcoord, ycoord, name –  Rekursiver Umbau des nächsten Quadranten im
Uhrzeigersinn CQUAD(Q) mit Hilfe von ADJQUAD()
–  Rekursiver Umbau des nächsten Quadranten im Gegenuhrzeigersinn CCQUAD(Q) mit Hilfe von ADJQUAD()
–  Rekursiver Umbau des Quadranten Q mit Hilfe von
NEWROOT()
Delete Punkt A
Beispiel:
G
H
K
F
D
J
C
B
L
I
E
A
M
N
Beispiel nach Deletion von A
G
H
K
D
J
L
F
C
B
E
I
M
N
Quadtree zu Beispiel nach
Deletion von A
B
F
J
K
D
H
G
N
M
C
L
Petra Mutzel
E
Alg. & Dat.
I
WS 08/09
43
Point Quadtree vor Delete A
A
J
K
F
L
H
G
M
B
D
C
I
E
N
Point Quadtrees: Analyse
Deletion
•  Theoretisch (Bentley 1988):
–  Aufwand bei gleichmäßig verteilten Daten für die Anzahl der
Neueinfügungen geht um 83% zurück gegenüber der
Neueinfügung aller Teilbäume.
•  Empirisch (Bentley 1988):
–  Empirisch: N log4 N vs. deutlich größer in Original
–  Gesamtpfadlänge verringert sich leicht vs. deutlich Verlängerung in
Original
•  Worst Case:
–  O(N2)
•  Deletion sehr komplex!
•  Alternative: Pseudo Quadtrees
Petra Mutzel
Alg. & Dat.
WS 08/09
51
Pseudo Quadtrees
•  Overmars und van Leeuwen 1982
•  Idee:
–  Rekursive Aufteilung des Raumes an Punkten, die nicht
Datenpunkte sind, in Quadranten, Unterquadranten,
etc., bis jeder Unterquadrant höchstens einen
Datenpunkt enthält.
Petra Mutzel
Alg. & Dat.
WS 08/09
52
Pseudo Quadtrees: Beispiel
(0,100)
(100,100)
(60,75)
TORONTO

70,70
y
(80,65)
BUFFALO
(40,50)
(35,40)
(5,45)
DENVER CHICAGO
(25,35) (26,37)
OMAHA
(0,0)
(85,15)
ATLANTA
(65,12)
(50,10)
Mobile
x
(90,5)
MIAMI
(100,0)
Pseudo Quadtree für Beispiel
(40,50)
(70,70)
TORONTO
BUFFALO
(26,37)
(65,12)
OMAHA
DENVER
CHICAGO
Petra Mutzel
ATLANTA MIAMI
MOBILE
Alg. & Dat.
WS 08/09
54
Pseudo Quadtrees:
•  Aufbau:
–  Für je N Datenpunkte im k-dim. Raum existiert ein
Partitionierungspunkt, so dass jeder Quadrant
höchstens ┌N/(k+1)┐ Datenpunkte enthält.
•  Analyse:
–  Dann besitzt der Pseudo Quadtree eine Tiefe von
höchstens ┌logk+1N┐ und kann in Zeit O(N logk+1N)
gebaut werden.
Petra Mutzel
Alg. & Dat.
WS 08/09
55
Point Quadtrees: Diskussion
•  Nachteile bei höheren Dimensionen:
–  An jedem Knoten des Baumes sind k Vergleiche
notwendig (um den Quadranten zu bestimmen)
–  Hoher Speicherplatzverbrauch: Jedes Blatt benötigt k
viele NULL Pointer, auch jeder innere Knoten besitzt
immer wieder NULL Pointer
–  Speicherplatzverbrauch pro Knoten: k+2k+1 Wörter für
Koordinaten, Kinder und Info
Petra Mutzel
Alg. & Dat.
WS 08/09
56
6.1.4 K-D Trees
Ursprünglich bedeutete 2-d tree: „2-dimensional tree“
Heute aber ist k-d tree (oder auch kd-tree) ein feststehender
Begriff und man sagt: „2-dimensional k-d tree“
•  Jon Louis Bentley 1975
•  Idee:
–  Binärer Suchbaum mit der Eigenschaft, dass in jeder
Tiefe nach einer anderen Dimension orthogonal
aufgeteilt wird.
–  Z.B. k=2: nach x-Koordinaten auf den Schichten mit
gerader Nummer (Beginn bei Schicht 0), nach yKoordinaten auf den ungeraden Schichten.
–  Aufteilung basiert auf den Datenpunkten
–  BSP Trees (Fuchs, Kedem, Naylor 1980): K-D Trees,
bei denen nicht orthogonal aufgeteilt wird
Petra Mutzel
Alg. & Dat.
WS 08/09
57
K-D Tree: Beispiel
(0,100)
(100,100)

(60,75)
TORONTO
y
(80,65)
BUFFALO
(5,45)
DENVER
(25,35)
OMAHA
(0,0)
(85,15)
(35,40)
ATLANTA
CHICAGO
(50,10)
Mobile
(90,5)
MIAMI
x
(100,0)
Aufbau von K-D Trees:
BuildKDTree(P,depth)
Annahme: alle Koordinaten
sind verschieden!
1.  Falls P nur einen Punkt enthält dann
2. 
Return ein Blatt, das diesen Punkt enthält
3.  Sonst Falls (depth mod 2 == 0) dann
4. 
Splitte P in 2 Teilmengen mittels einer vertikalen
Linie l durch die x-Median-Koordinate von P. Sei P1 die
Menge der Punkte links von l oder auf l, und P2 rechts von l.
5. 
Sonst Splitte P ... horizontalen Linie ...
6.  Pleft = BuildKDTree(P1,depth+1)
7.  Pright = BuildKDTree(P2,depth+1)
8.  Erzeuge einen Knoten v, der l speichert mit vleft als linkes
Kind und vright als rechtes Kind von v
9.  Return v
Analyse des Aufbaus
•  Der Median wird hier als die n/2-kleinste Zahl
berechnet (so dass der Median von zwei Werten dem
kleineren entspricht).
•  Um die Medianfindung zu erleichtern, werden die Punkte
vorher einmal nach x-Koordinate und einmal nach yKoordinate sortiert.
•  Lemma: Annahme: Alle x- und y-Koordinaten sind
paarweise verschieden. Dann benötigt ein k-d tree für N
Punkte O(N) Speicherplatz und kann in Zeit O(N log N)
aufgebaut werden.
Petra Mutzel
Alg. & Dat.
WS 08/09
60
K-D Tree: Einfügen
(0,100)
(100,100)
(60,75)
TORONTO
(80,65)
BUFFALO

Z
y
(5,45)
DENVER
(25,35)
OMAHA
(0,0)
(85,15)
(35,40)
ATLANTA
CHICAGO
(50,10)
Mobile
(90,5)
MIAMI
x
(100,0)
K-D Trees: INSERT
•  Analog zu binären Suchbäumen:
–  Wir suchen den Punkt abwechselnd basierend auf den
k Schlüsseln
–  Wenn das Blatt erreicht ist, haben wir die EinfügePosition gefunden
•  Analyse:
–  Form des Baumes hängt von Einfügereihenfolge ab
–  Durchschnittliche Tiefe: O(log2 N)
–  Worst Case Tiefe: O(N), Aufbau: O(N2)
–  Optimierung ähnlich wie bei Quad Trees
–  Alternative: Adaptive K-D Tree
Petra Mutzel
Alg. & Dat.
WS 08/09
62
Adaptive K-D Trees
•  Idee:
–  Wie K-D Trees, ausser, dass die Aufteilung zwischen
(statt an) den Datenpunkten gemacht wird
–  Datenpunkte werden nur in den Blättern gespeichert
–  Jeder innere Knoten enthält den Median der Menge der
noch übrigen, in diesem Teil befindlichen Knoten (bzgl.
einem Schlüssel)
–  Aufteilung nicht mehr abwechselnd nach Schlüsseln,
sondern nach dem Schlüssel, der noch die größte
Differenz zwischen min und max besitzt.
Petra Mutzel
Alg. & Dat.
WS 08/09
63
Adaptiver K-D Tree: Beispiel
(0,100)
(100,100)

(60,75)
TORONTO
y
(5,45)
DENVER
(25,35)
OMAHA
(0,0)
(80,65)
BUFFALO
(35,40)
CHICAGO
(50,10)
Mobile
x
Petra Mutzel
(85,15)
ATLANTA
(90,5)
MIAMI
(100,0)
Alg. & Dat.
WS 08/09
64
Adaptive K-D Trees
•  Diskussion:
–  Ist nicht notwendigerweise balanciert
–  Statische Datenstruktur (alle Punkte müssen vorher
bekannt sein, sonst nicht sinnvoll)
–  Deletion ist sehr komplex
–  Suchen: ähnlich wie bei K-D Trees
Petra Mutzel
Alg. & Dat.
WS 08/09
65
K-D Trees Deletion
•  Datenstruktur:
–  LEFT, RIGHT: linkes und rechtes Kind
–  XCOORD, YCOORD, ...
–  NAME
–  DISC: Diskriminator bzgl. k-tem Schlüssel
–  Abmachung für Diskriminatoren: gleiche Schlüsselwerte
wie der Diskriminator befinden sich im rechten Teilbaum
Petra Mutzel
Alg. & Dat.
WS 08/09
66
K-D Trees: Deletion
•  Diskussion (k=2):
–  Deletion ist nicht so leicht wie bei binären Suchbäumen
–  Problem: nach Entfernung von Knoten aus Baum
stimmen die Diskriminatoren nicht mehr (z.B. 2 Mal xKoordinaten hintereinander)
•  Idee: Rekursiv:
–  DELETION(a,b)
–  Finde Ersatzknoten (c,d) in einem Unterbaum
–  Überschreibe (a,b) mit (c,d)
–  DELETION(c,d)
Petra Mutzel
Alg. & Dat.
WS 08/09
67
K-D Trees: Deletion
•  Kandidaten für Ersatzknoten:
–  Sei (a,b) x-Diskriminator, dann:
–  (1) Entweder Knoten im linken Teilbaum mit größter xKoordinate
–  (2) Oder Knoten im rechten Teilbaum mit kleinster
xKoordinate
–  (1) scheidet aus wegen Abmachung bzgl. gleicher
Schlüsselwerte, denn
–  Annahme: sei (c,d) aus linkem Teilbaum, dann könnte
ein anderer Knoten (c,z) in linkem Teilbaum existieren
Petra Mutzel
Alg. & Dat.
WS 08/09
68
K-D Trees: Deletion
•  Kandidaten für Ersatzknoten:
–  Sei (a,b) x-Diskriminator, dann ist Kandidat:
–  Knoten im rechten Teilbaum von a mit kleinster
x-Koordinate
•  Problem: rechter Teilbaum von (a,b) ist leer
•  Lösung:
–  Finde Knoten (c,d) mit kleinster x-Koordinate in linkem
Teilbaum von (a,b)
–  ersetze (a,b) durch (c,d)
–  der linke Teilbaum von (a,b) wird jetzt rechter Teilbaum
von (a,b) (bzw. neu (c,d))
–  Rekursiver Aufruf von DELETION(c,d)
Petra Mutzel
Alg. & Dat.
WS 08/09
69
Beispiel Deletion in K-D Tree
(0,60)
Entfernen von A(20,20)
(60,60)
C(25,50)
G(55,40)
E(30,45)

H(45,35)
B(10,30)
F(30,35)
I(50,30)
y
D(35,25)
A(20,20)
(0,0)
x
(60,0)
Beispiel Deletion in K-D Tree
Entfernen von A(20,20)
X (20,20)
Y (10,30)
(25,50)
X (35,25)
Y (30,45)
(55,40)
(45,35)
X (30,35)
vorher
(50,30)
Petra Mutzel
nachher
Alg. & Dat.
WS 08/09
71
K-D Trees: Deletion
•  Problem reduziert auf:
•  Bestimme den Knoten mit kleinster x- bzw. y-Koordinate in
Teilbaum von (a,b):
–  Muss im linken Teilbaum eines x-Diskriminators sein
–  Kann im linken oder rechten Teilbaum eines yDiskriminators sein
•  Analyse:
–  Dieser Aufwand kann in k-dim.k-d Bäumen O(N1-1/k)
betragen
•  Deletion eines Knotens in k-dim. k-d Bäumen kann Zeit
O(N1-1/k) dauern. Experimentell dauert Deletion in
zufälligen k-d trees jedoch nur O(log N).
K-D Trees: Bereichssuche
•  Orthogonale Bereichssuche: Ausgabe aller Knoten (x,y)
die sich innerhalb eines rechteckigen Gebiets R befinden
Der Algorithmus funktioniert aber genauso bei beliebigen
Regionen, z.B.
•  Ausgabe aller Knoten (x,y), die sich innerhalb des
Gebietes mit Radius d (euklidisch) um (a,b) befinden,d.h.
(a-x)2+(b-y)2≤d2
Petra Mutzel
Alg. & Dat.
WS 08/09
76
Beispiel Bereichssuche in K-D Tree
(0,100)
(100,100)

(60,75)
TORONTO
y
(80,65)
BUFFALO
(5,45)
DENVER
(25,35)
OMAHA
(0,0)
(85,15)
(35,40)
ATLANTA
CHICAGO
(50,10)
Mobile
(90,5)
MIAMI
x
(88,6),
d=3
(100,0)
Beispiel Orthogonale
Bereichssuche in K-D Tree
Y
E
B
S
W
P
R
D
A
G
Q
V
C
H
F
I
x
Petra Mutzel
Alg. & Dat.
WS 08/09
78
Bereichssuche in K-D Tree
•  Idee: Jeder Knoten v eines k-d tree entspricht einer
Region R(v) in der Ebene, z.B. Wurzelknoten: die ganze
Ebene, das linke Kind entspricht der linken Halbebene,
dessen Kinder dem unteren/oberen Quader, ... etc.
•  Ein Punkt P ist genau dann im Unterbaum mit Wurzel v
wenn P in R(v) liegt.
•  Traversiere also den k-d tree, besuche nur Knoten,
deren Region sich mit dem gesuchten Bereich
schneidet.
•  Falls eine Region ganz im Bereich enthalten ist, können
alle Punkte des dazugehörigen Unterbaums ausgegeben
werden ohne weiter in den Baum hinabzusteigen.
Petra Mutzel
Alg. & Dat.
WS 08/09
79
Bereichssuche in K-D Tree
Algorithmus SearchKDTree(v,R*)
1.  Falls v ist ein Blatt dann
2.  Falls der Punkt in R* liegt: Ausgabe
3.  Sonst
4. 
Falls R(LEFT(v)) ganz in R* enthalten ist dann
5. 
Ausgabe aller Punkte in LEFT(v)
6. 
Sonst
7. 
8. 
9. 
10. 
Falls R(LEFT(v)) ∩ R* ≠ ∅ dann
SearchKDTree(LEFT(v),R*) Falls
Falls R(Right(v)) ganz in R*... // (4-8 wie oben aber
// mit RIGHT)
Petra Mutzel
Alg. & Dat.
WS 08/09
80
Analyse Bereichssuche
Lemma: Eine orthogonale Bereichsabfrage in einem
ausgeglichenen k-d tree mit N Punkten geht in Zeit
O(N½ + F), wobei F die Anzahl der ausgegebenen
Punkte ist.
Beweisidee: Jede vertikale Linie schneidet bis zu O(N½) Regionen in einem k-d tree.
•  Deletion für den k-dimensionalen Fall:
–  Worst Case für vollständigen k-d Tree:
–  O(k N1-1/k)
Petra Mutzel
Alg. & Dat.
WS 08/09
81
Diskussion K-D Trees
•  An jedem Knoten muss nur jeweils ein Schlüsselvergleich
durchgeführt werden.
•  Speicherplatz:
–  Blätter: es gibt nur maximal zwei NULL-Pointer
–  Benötigter Speicherplatz pro innerer Knoten:
1+1+1+1+k für LEFT, RIGHT, NAME, DISC + k Wörter
für k Schlüssel
•  Adaptive K-D Trees:
–  Innere Knoten benötigen nur 5 Wörter
•  Nachteil gegenüber Quadtree:
–  Quadtree ist eine parallele Datenstruktur (k Schlüsselvergleiche), K-D Trees nicht
Petra Mutzel
Alg. & Dat.
WS 08/09
82
6.1.5 Range Trees
•  „Bereichsbäume“, Bentley und Maurer 1979/80
•  speichert Punkte und wurde dafür optimiert, alle Punkte zu
finden, die in einem gegebenen Bereich liegen
•  Idee für k=2:
Annahme: alle Koordinaten sind verschieden
–  Binärer Suchbaum, der aus binären Suchbäumen besteht
–  Sortiere alle Punkte nach x-Koordinate und speichere
diese als Blätter in balanciertem binärem Suchbaum T
(main tree)
–  Jeder innere Knoten I wird mit Punktmenge Pi assoziiert,
die zum Teilbaum von T mit Wurzel I gehören
–  Jeder innere Knoten I zeigt auf einen 1-dim. range tree Ti ,
der alle Punkte Pi enthält und nach y sortiert ist.
Petra Mutzel
Alg. & Dat.
WS 08/09
83
1-dimensionaler Range Tree
•  Ein 1-dimensionaler range tree ist ein balancierter binärer
Suchbaum mit den Datenpunkten in den Blättern.
•  Dabei sind die Blattknoten untereinander zusätzlich doppelt
verkettet verlinkt.
•  1-dimensionale Bereichssuche [L:R]: Suche den
kleinsten Wert ≥L und folge den Verlinkungen auf
Blattebene solange bis Wert >R ist.
•  Analyse der Suchzeit: O(log N + F), bei N Punkten im
Suchbaum und Ausgabe von F Punkten.
•  Speicherplatz: O(N)
•  Aufbau: O(N), falls die Punkte sortiert sind, sonst O(N log N)
Petra Mutzel
Alg. & Dat.
WS 08/09
84
Beispiel: [L:R]=[18:77]
Q
pR
pL
Petra Mutzel
Alg. & Dat.
WS 08/09
85
Alternative Suche nach [L:R]
im 1-dimensionalen Range Tree
•  Annahme: Blattknoten von T sind diesmal nicht
untereinander verlinkt.
•  Die Suche nach L ende an Blatt pL, die Suche nach R an pR
•  Sei Q (innerer Knoten) der nächste gemeinsame Vorgänger
von pL und pR in T
•  Bezeichne {Li} und {Ri} die Sequenzen der Knoten auf dem
Weg von Q nach pL bzw. pR.
•  Für jeden Knoten P aus {Li} für den auch LEFT(P) aus {Li}
ist: Ausgabe aller Knoten im Teilbaum mit Wurzel RIGHT(P)
•  Für jeden Knoten P aus {Ri} für den auch RIGHT(P) aus {Ri}
ist: Ausgabe aller Knoten im Teilbaum mit Wurzel LEFT(P).
Petra Mutzel
Alg. & Dat.
WS 08/09
86
Algorithmus SEARCH [L:R]
in 1-d range tree
1.  Q = FindSplitNode (T,L,R) // der nächste
gemeinsame Vorgänger von pL und pR in T
2.  Falls Q ein Blatt ist: Falls Punkt in [L:R], dann Ausgabe
STOP
3.  Sei P=LEFT(Q) 4.  Solange P kein Blatt ist:
5. 
Falls xkey(P)≥L dann
6. 
ReportSubtree(RIGHT(P))
7. 
P=LEFT(P)
8. 
Sonst P=RIGHT(P)
9.  Teste, ob Blatt P ausgegeben werden muss
10. Sei P=RIGHT(Q) und wiederhole 4-9 für P mit
vertauschten Rollen für LEFT und RIGHT.
Funktion FindSplitNode(T,L,R)
1.  P=root(T) 2.  Solange P kein Blatt ist AND (xkey(P)<L OR xkey(P)≥R)
3. 
Falls xkey(P)≥R dann
4. 
P=LEFT(P)
5. 
Sonst P=RIGHT(P)
6.  Return P
Beispiel: [L:R]=[18:77]
Q
pR
pL
Petra Mutzel
Alg. & Dat.
WS 08/09
89
Bereichssuche nach
[Lx:Rx][Ly:Ry] im 2-dim. Range Tree
•  Die Suche im main tree nach Lx ende an Blatt pL, die
Suche nach Rx an Blatt pR
•  Sei Q (innerer Knoten) der nächste gemeinsame
Vorgänger von pL und pR in T
•  Bezeichne {Li} und {Ri} die Sequenzen der Knoten auf
dem Weg von Q nach pL bzw. pR.
•  Für jeden Knoten P aus {Li} für den auch LEFT(P) aus
{Li} ist: starte 1-dim. Bereichssuche nach y für [Ly:Ry] im
Suchbaum, auf den RIGHT(P) zeigt.
•  Für jeden Knoten P aus {Ri} für den auch RIGHT(P) aus
{Ri} ist: starte 1-dim. Bereichssuche nach y für [Ly:Ry] im
Suchbaum, auf den LEFT(P) zeigt.
Petra Mutzel
Alg. & Dat.
WS 08/09
90
Algorithmus SEARCH [L
[L:R]
x:Rx][Ly:Ry]
in 1-d
2 range tree
1.  Q = FindSplitNode (T,L,R)
Lx,Rx // der nächste
gemeinsame Vorgänger von pL und pR in T
2.  Falls Q ein Blatt ist: Falls Punkt in [L:R],
[Lx:Rx] [Ly:Ry] dann
Ausgabe STOP
3.  Sei P=LEFT(Q) 4.  Solange P kein Blatt ist:
5. 
Falls LLx ≤ xkey(P) dann
6. 
ReportSubtree(RIGHT(P))
1DRangeQuery(T(RIGHT(P)),[Ly:Ry])
7. 
P=LEFT(P)
8. 
Sonst P=RIGHT(P)
9.  Teste, ob Blatt P ausgegeben werden muss
10. Sei P=RIGHT(Q) und wiederhole 4-9 für P mit
vertauschten Rollen für LEFT und RIGHT.
Beispiel: [L:R]=[18:77][Ly,Ry]
Q
 1DRangeTree
(30,37,49)
 1DRT
(59,62)
Teste, ob Blatt1DRangeTree(23)
ausgegeben
werden muss
Petra Mutzel
1DRangeTree(70)
Teste, ob Blatt
ausgegeben
werden muss
Alg. & Dat.
WS 08/09
92
Analyse der Bereichssuche
im 2-dim. Range Tree
Lemma: Eine Bereichssuche im 2-dim. Bereich [Lx:Rx]
[Ly:Ry] geht in einem 2-dim. range tree, der N Punkte
enthält, in Zeit O(log2 N+F), wobei F die Anzahl der
ausgegebenen Punkte ist.
Beweis: Ein Aufruf von 1DRangeQuery(T(RIGHT(P)),
[Ly:Ry])in Punkt P geht in Zeit O(log N+FP), wobei FP die
Anzahl der von diesem Aufruf ausgegebenen Punkte
bezeichnet. Abgesehen davon ist die Laufzeit des
Algorithmus in jedem besuchten Knoten P konstant.
Insgesamt ergibt dies: ∑O(log N+FP), wobei die Summe
über alle besuchten Knoten P läuft; diese sind durch
O(log N) beschränkt. Weiterhin gilt ∑FP =F.
Insgesamt ergibt dies Zeit O(log2 N+F).
Petra Mutzel
Alg. & Dat.
WS 08/09
93
Aufbau eines 2-dim. Range Tree:
Algorithmus Build2DRangeTree(P)
1.  Konstruiere einen balancierten binären Suchbaum Tass auf
der Menge Py, der y-Koordinaten aller Punkte in P. Speichere
an den Blättern auch die Punkte selbst.
2.  Falls P nur aus einem Punkt besteht, dann
3.  generiere ein Blatt v mit diesem Punkt und verlinke auf Tass
4.  Sonst: Splitte P in zwei Mengen Pleft und Pright, wobei Pleft alle
Punkte mit xCOORD ≤ xmedian enthält
5. 
vleftBuild2DRangeTree(Pleft)
6. 
vrightBuild2DRangeTree(Pright)
7. 
Generiere einen Knoten v, der xmedian enthält, mache
vleft zum linken Kind von v, vright zum rechten Kind von v und
verlinke auf Tass
Analyse des Speicherplatzes
•  Lemma: Ein 2-dim. range tree T mit N Punkten benötigt
O(N log N) Speicherplatz.
•  Beweis: Ein Punkt p wird genau dann in Tass gespeichert,
wenn er im main tree auf dem Weg von der Wurzel zu
dem Blatt, das p enthält, liegt.
•  Für alle Knoten v im main tree einer gegebenen Tiefe
gilt: diese werden in genau einem Tass dieser Tiefe
gespeichert. Alle Knoten einer Tiefe benötigen also
insgesamt Speicherplatz O(N).
•  Weil die Tiefe im main tree durch O(log N) beschränkt ist,
ergibt dies insgesamt O(N log N) Speicherplatz.
Petra Mutzel
Alg. & Dat.
WS 08/09
95
Analyse des Aufbaus
•  Lemma: Der Aufbau eines 2-dim. range tree mit N
Punkten benötigt O(N log N) Zeit.
•  Beweis: Wir halten die Menge der Punkte einmal nach
x-Koordinaten und einmal nach y-Koordinaten sortiert.
•  Ersteres erlaubt konstanten Zugriff auf den Median (Z.4)
und letzteres erlaubt den Aufbau des balancierten
Suchbaumes Tass mit N Punkten in linearer Zeit O(N).
•  Weiterhin gelten die gleichen Argumente wie beim
Lemma davor.
Petra Mutzel
Alg. & Dat.
WS 08/09
96
Range Trees in k≥2 Dimensionen
•  Idee
–  Konstruiere einen balancierten binären Suchbaum T1
bezüglich der 1.-ten Koordinate
–  Jeder innere Knoten P besitzt einen Zeiger auf einen
(k-1)-dimensionalen range tree;
–  dieser beginnt bei einem binären Suchbaum T2 bzgl. der
2.-ten Koordinate, der alle Punkte enthält, die in dem
Teilbaum mit Wurzel P enthalten sind.
–  In diesem Baum enthält wiederum jeder innere Knoten
einen Zeiger auf einen (k-2)-dim. range tree; dieser
beginnt bei einem binären Suchbaum T3 bzgl. der 3.-ten
Koordinate, der alle jetzt noch relevanten Punkte
enthält, etc.
Petra Mutzel
Alg. & Dat.
WS 08/09
97
Suche in Range Trees mit k≥2
Dimensionen
•  Idee
–  Suche im ersten Baum T1 O(log N) Knoten, die weiter
durchsucht werden. Diese enthalten alle Knoten, die im
korrekten x-Bereich liegen.
–  Nun durchsuche den Baum T2 nach dem 2.-ten Bereich;
auch hier ergeben sich O(log N) innere Knoten, die
weiter untersucht werden müssen; insgesamt sind dies
nun O(log2 N),
–  etc...
Petra Mutzel
Alg. & Dat.
WS 08/09
98
Analyse k-dim. range tree
Theorem (ohne Beweis): Sei P eine Punktmenge im kdimensionalen Bereich, k≥2.
•  Ein range tree für P benutzt O(N logk-1 N) Speicherplatz
und kann in Zeit O(N logk-1 N) Zeit aufgebaut werden.
•  Rechteckige Bereichssuche kann in Zeit O(logk n + F)
korrekt durchgeführt werden, wobei F die Anzahl der
ausgegebenen Punkte ist.
Petra Mutzel
Alg. & Dat.
WS 08/09
99
Bemerkungen zu Range Trees
•  Range trees sind asymptotisch schneller als point quad
tree und k-d tree.
•  Sie haben jedoch signifikant höherer Speicherbedarf.
•  Falls nicht alle Punkte unterschiedliche x-Koordinaten
(o.a.) besitzen, dann Trick: baue eine eindeutige Ordnung
der Punkte auf indem der Schlüssel durch einen zweiten
key ergänzt wird.
•  Die Suchzeit für 2-dim. Suchbäume kann von O(log2N+F)
auf O(log N+F) reduziert werden, z.B durch fractional
cascading.
•  Damit kann auch die Suchzeit für k-dim. range trees um
eine Dimension reduziert werden.
Petra Mutzel
Alg. & Dat.
WS 08/09
100
Fractional Cascading
[G.S Lueker 1978 and Willard 1978]
•  Laufzeitanalyse für range tree ergab pro Knoten P im
ersten Suchbaum O(log N+FP) •  Mit Hilfe von fractional cascading benötigt die erste
Suche O(log N+FP), aber die nachfolgenden nur O(1+FP)
•  Idee: Fractional Cascading hilft bei mehreren 1-dim.
Bereichsabfragen über den gleichen Bereich, wenn die
Ergebnisse einer Suchanfrage für die nächste verwendet
werden kann.
Petra Mutzel
Alg. & Dat.
WS 08/09
101
Einfaches Beispiel
•  Seien S1 und S2 zwei Mengen von Objekten mit einem
ganzzahligen Schlüssel key gespeichert in den Arrays A1
und A2. Wichtig: S2⊆S1.
•  Annahme: Wir wollen alle Objekte in S1 und S2
ausgeben, deren Schlüssel in dem Intervall [L:R] liegen.
•  Lösung: Binärsuche über A1 bis ein kleinstes Objekt x
gefunden wird, dessen Schlüssel ≥L ist; Wandere von
dort nach rechts bis ein Schlüssel >R kommt.
•  Statt Binärsuche über A2 wäre es jetzt gut, wenn wir von
x aus einen Zeiger zu A2 hätten, der auf kleinstes Objekt
in A2 zeigt, der ≥key(x) ist.
•  Es gibt also von jedem Objekt x in S1 einen Zeiger zu
dem kleinsten Objekt in S2, der ≥key(x) ist.
Petra Mutzel
Alg. & Dat.
WS 08/09
102
Einfaches Beispiel für
Fractional Cascading
Bild aus M. de Berg et al. 2000
Petra Mutzel
Alg. & Dat.
WS 08/09
103
Anwendung auf 2-dim. range tree
•  Beobachtung: Die Suchbäume bzgl. y der Tiefe t sind in
Tiefe t+1 aufgesplittet in den linken und den rechten Teil,
also T(LEFT(P))⊆T(P) und T(RIGHT(P))⊆T(P) •  Idee: Statt einen Suchbaum zu speichern, wird jeweils nur
ein bzgl. y-Koordinate sortiertes ARRAY gespeichert;
Ausnahme: die Wurzel hat weiterhin den Suchbaum
•  Man sucht genau einmal den Beginn Ly des Bereichs in Tass
zur Wurzel (Faktor log N); und von dort aus führen Zeiger
auf die korrespondierenden Knoten im linken und rechten
Unterbaum, u.s.w.
•  Hierzu benötigen wir für jeden Knoten in der Wurzel UND in
jedem ARRAY zu inneren Knoten P zwei Zeiger: einer zum
Nachfolger im Feld LEFT(P) und einer zum Nachfolger im
Feld RIGHT(P).
Petra Mutzel
Alg. & Dat.
WS 08/09
104
Anwendung auf 2-dim. range tree
Lemma: 2-dimensionale Bereichssuche kann mit Hilfe
von fractional cascading in Zeit O(log N+F) durchgeführt
werden.
•  Weil man sich von Schicht zu Schicht durchhangelt,
heißt dieser range tree auch layered range tree.
Petra Mutzel
Alg. & Dat.
WS 08/09
105
Beispiel für Fractional Cascading
Main tree: jeder innere
Knoten hat Zeiger auf
Array im nächsten Bild
Bild aus M. de Berg et al. 2000
Petra Mutzel
Alg. & Dat.
WS 08/09
106
Beispiel für Fractional Cascading
Auf dieses
Array verlinkt
Wurzel aus
Main tree
Achtung: nicht alle Links werden angezeigt!
Bild aus M. de Berg et al. 2000
Layered Range Tree
Theorem: Sei P eine Punktmenge im k-dimensionalen
Bereich, k≥2.
•  Ein layered range tree für P benutzt O(N logk-1 N)
Speicherplatz und kann in Zeit O(N logk-1 N) Zeit
aufgebaut werden.
•  Rechteckige Bereichssuche kann in Zeit O(logk-1 n + F)
korrekt durchgeführt werden, wobei F die Anzahl der
ausgegebenen Punkte ist.
Petra Mutzel
Alg. & Dat.
WS 08/09
108
Aktuelle Entwicklungen
•  Beste Datenstruktur für 2-dim. range trees benötigt nur
O(N log N / log log N) Speicherplatz mit Suchzeit O(log N+k).
Dies ist optimal.
•  Ähnliches gilt für k-dim. range trees: in O(N(log N/loglog N)k-1
Speicherplatz mit polylogarithmischer Suchzeit [beide
Resultate von Chazelle 1986, 1990]
•  Mehr Speicherplatz führt zu besseren Suchzeiten
•  Inzwischen gibt es auch dynamische range trees
•  Für große Datenmengen eignen sich spezielle Strukturen für
Externspeicher bzw. cache-oblivious
•  Trianguläre Bereichssuchprobleme können auch mit
„partition trees“ erfolgreich gelöst werden.
Petra Mutzel
Alg. & Dat.
ENDE
WS
Bereichsabfragen
08/09
109
Herunterladen