Das Grid-File

Werbung
Raumbezogene Zugriffsverfahren
• Das Grid-File
• Der Lineare Quadtree
Motivation
• Bearbeitung einer mehrdimensionalen
Suchanfrage soll in möglichst kurzer Zeit,
zum Beispiel Punktsuche in einer
Punktedatenbank, erfolgen.
 Vorbereitung der Datenbank
Das Grid-File
• Einteilung des n-dimensionalen
Datenraums mit orthogonalen Gitter
Das Grid-File
Einfacheres Beispiel
• Einteilung des n-dimensionalen
Datenraums mit orthogonalen Gitter
•  Zellen, denen die
Dateneinträge (Punkte) zugeordnet
werden
• Festlegung der maximalen Anzahl von
Einträgen in einer Zelle
Das Grid-File
• Abspeicherung der Positionen der
Teilungslinien in zwei Vektoren:
y2
y1
X
x0
Y
y0
x1
y1
x2
y2
y0
x0
x1
x2
genauere Betrachtung
Das Grid-File
• Abspeicherung der Zelleninhalte
in Buckets.
 Jede Zelle ist eindeutig einem
Bucket zugeordnet.
Das Grid-File
•Einem Bucket hingegen
können aber mehrere
Zellen zugeordnet sein.
Das Grid-File
• Die Buckets werden
samt Inhalt auf einem
Massenspeicher
abgelegt.
• Zum Auffinden
werden Pointer
benötigt.
• Da jede Zelle einem Bucket zugeordnet ist,
wird für jede Zelle ein Pointer zu ihrem
Bucket angelegt.
2.1
2.2
1.1
1.2
P2,1 P2,2
P1,1 P1,2
• Die Pointer werden in einer
Matrix ( „ Grid-Directory“)
so abgespeichert, dass ihre
Zeilen- und Spaltennummer
mit der Zeilen- und
Spaltennummer ihrer Zelle
übereinstimmt.
1.2
• Das Auffinden von
Einträgen umfasst also 3
Arbeitsschritte:
• Ermittlung von
Zeilen- und
Spaltennummer der
Zelle, in deren
Bereich der Eintrag
liegt.
1.2
P2,1 P2,2
P1,1 P1,2
• Das Auffinden von
Einträgen umfasst also 3
Arbeitsschritte:
• Aufsuchen des
entsprechenden
Pointers im GridDirectory
1.2
P2,1 P2,2
P1,1 P1,2
• Das Auffinden von
Einträgen umfasst also 3
Arbeitsschritte:
• Aufsuchen des
Buckets, in dem der
Eintrag liegt
• Hinweis: Die
Zellen müssen
nicht
quadratisch sein.
• Der Datenraum
auch nicht.
• Einzelne Zellen
können wieder als
eigenständiger
Datenraum
aufgefasst werden,
für den sich wieder
ein Grid-File anlegen
lässt.
• Grid-Files können
auch n-dimensional
sein
Aufbau eines Grid-Files und
Abspeichern im Grid-File
• Die Größe der Buckets wird
vor dem Aufbau des GridFiles willkürlich festgelegt.
• Wird ein weiterer Eintag
gemacht, so kann der
Bucket überlaufen
• Im Folgenden sei die
maximal mögliche Anzahl
von Einträgen in einem
Bucket zwei.
Aufbau eines Grid-Files und
Abspeichern im Grid-File
• Einfacher Fall: Bucket
enthält Einträge aus
mehreren Zellbereichen:
Für eine Zelle neues
Bucket einrichten oder
finden.
Aufbau eines Grid-Files und
Abspeichern im Grid-File
• Einfacher Fall: Bucket
enthält Einträge aus
mehreren Zellbereichen:
Für eine Zelle neues
Bucket einrichten oder
finden.
Aufbau eines Grid-Files und
Abspeichern im Grid-File
• Schwieriger Fall: Einträge
liegen im Bereich einer
einzigen Zelle.
•  Teilung der Zelle, was
eine weitere Teilung des
gesamten Datenraumes
bedeutet.
Aufbau eines Grid-Files und
Abspeichern im Grid-File
• Schwieriger Fall: Einträge
liegen im Bereich einer
einzigen Zelle.
•  Teilung der Zelle, was
eine weitere Teilung des
gesamten Datenraumes
bedeutet.
Richtig teilen
Löschen eines Eintrags
• Beim Löschen von Einträgen
ergeben sich oft (fast) leere
Buckets.
• Deswegen prüfen, ob die
Buckets mit denen von
benachbarten Zellbereichen
vereinigt,
• oder Zellteilungen aufgehoben
werden sollten.
Der Quadtree
• Aufteilen des Datenraums in der Mitte
• Es entstehen 4 Rechtecke:
0,1,2,3.
0
1
2
3
Der Lineare Quadtree
• Weitere Verfeinerung der Zellen:
Der Lineare Quadtree
• Somit entsteht eine Hierarchie wie in einer
Baumstruktur.
Der Lineare Quadtree
• Mögliche Bezifferung der Quadranten:
00
0
1
2
3
02
01
0
20
00 01 02 03 10 11 12 13
20 21 22 23
30 31 32 33
22
2
10
03
12
21
30
23
32
11
1
13
31
3
33
Der Lineare Quadtree
• Mögliche Bezifferung der Quadranten:
00
02
01
0
20
22
03
21
2
23
10
12
11
1
30
32
13
31
3
33
300
301
30
302
303
Der Lineare Quadtree
• Beispiel: Quadtree der Tiefe 3
10
0
0
10 11
13
30 31 32 33
120 121 122 123
120 121
122 123
2
11
13
30
31
32
33
2
Der Lineare Quadtree
• Kein Quadrant hat mehr als 4 Einträge
10
0
11
120 121
122 123
13
30
31
32
33
2
Der Lineare Quadtree
• Die Blätter des Baumes erhalten dann Platz
im Speicher für die abzuspeichernden
Objekte.
0
2
10 11
13
30 31 32 33
120 121 122 123
Der Lineare Quadtree
• Für den Speicherzugriff werden Pointer mit
den Nummern ihrer Blätter angelegt.
0
2
10 11
13
30 31 32 33
120 121 122 123
Der Lineare Quadtree
12
• Es soll nun die Abspeicherung der Pointer
in einem B+ Baum dargestellt werden.
• Ein B+ Baum ist ein B-Baum, der durch die
Art des Einfügens und Löschens immer
ausgeglichen ist.
B+-Baum
Der Lineare Quadtree
• Für die Sortierung der Pointer denkt man
sich vor jede Nummer eine Null und ein
Komma, z.B. 13  0,13 u.s.w., so dass z.B.
gilt:
(0,)13 < (0,) 2
oder
(0,) 102 < (0,) 11
Der Lineare Quadtree
• Für die Sortierung der Pointer denkt man
sich vor jede Nummer eine Null und ein
Komma, z.B. 13  0,13 u.s.w., so dass z.B.
gilt:
13 < 2
oder
102 < 11
Der Lineare Quadtree
• Möglicher B+ Baum für unser Beispiel mit
mehr als 2 (mit Ausnahme der Wurzel) und
weniger als 4 Einträgen pro Knoten:
2
10 121
0 10
11 120 121
31
122 123 13 2
30 31
32 33
Der Lineare Quadtree
• Weitere Möglichkeit:
10 121 2 31
0 10
11 120 121
122 123 13 2
30 31
32 33
Der Lineare Quadtree
• Die Pointer wurden dabei alle in der
untersten Ebene abgespeichert.
10 121 2 31
0 10
11 120 121
122 123 13 2
30 31
32 33
Der Lineare Quadtree
Eine Punktanfrage kann also in 3
Arbeitsschritten abgearbeitet werden:
• 1.Berechne das Quadrat, in dem der gesuchte Eintrag liegt.
Hierzu kann ein Hilfsgitter verwendet werden, das überall
gleichmäßig und mindestens so fein unterteilt ist wie das
eigentliche Gitter. Dann wird einfach das entsprechende
Quadrat des Hilfsgitters berechnet.
Tiefe : 3
Tiefe Hilfsgitter : 3
Der Lineare Quadtree
Eine Punktanfrage kann also in 3
Arbeitsschritten abgearbeitet werden:
• 1.Berechne das Quadrat, in dem der gesuchte Eintrag liegt.
Hierzu kann ein Hilfsgitter verwendet werden, das überall
mindestens so fein unterteilt ist wie das eigentliche Gitter.
• 2.Suche im B+ Baum den Pointer zu diesem Quadrat.
Wenn kein Pointer die berechnete Nummer hat, kann der
Pointer genommen werden, dessen Nummer komplett in
den Anfangsziffern der berechneten Nummer auftaucht.
• 3. Hole die zum Quadrat abgespeicherten Daten aus dem
Speicher.
Der Lineare Quadtree
Eine rechteckige Bereichsanfrage kann durch eine
Eigenart der gewählten Numerierung der Quadrate
vereinfacht werden:
Die linke obere Ecke liege im Quadrat mit der Nummer A,
und die rechte untere Ecke im Quadrat mit der Nummer B.
Der Lineare Quadtree
Beispiel:
A=0
10
0
B = 31
11
120 121
122 123
13
30
31
32
33
2
Der Lineare Quadtree
Die Bereichsanfrage kann durch eine Eigenart der
gewählten Numerierung der Quadrate vereinfacht
werden:
Die linke obere Ecke liege im Quadrat mit der Nummer A,
und die rechte untere Ecke im Quadrat mit der Nummer B.
Dann gilt für alle Quadrate, die den Suchbereich
überlappen, das ihre Nummern zwischen A und B liegen.
Dies gilt auch beim Hilfsgitter.
Der Lineare Quadtree
Eine Bereichsanfrage kann also in 4
Arbeitsschritten abgearbeitet werden:
• 1. Berechne A und B (optional im Hilfsgitter).
• 2. Berechne, welche Quadrate mit den Nummern zwischen
A und B sich mit dem Suchbereich überlappen.
• 3. Suche im B+ Baum die Pointer zu diesen Quadraten.
Wenn kein Pointer die berechnete Nummer eines
Quadrates hat, kann der Pointer genommen werden, dessen
Nummer komplett in den Anfangsziffern der berechneten
Nummer auftaucht.
• 4. Hole die zum Quadrat abgespeicherten Daten aus dem
Speicher.
Der Lineare Quadtree
Abspeicherung
• Die Abspeicherung von Objekten ist meist vergleichbar mit
der beschriebenen Anfragetechnik. Allerdings gibt es
Ausnahmen:
• Der Inhalt eines Quadrates kann überlaufen. Dies hat eine
Teilung des Quadrates zur Folge, wodurch 3 neue Quadrate
entstehen, die wieder mit Speicherbereichen und Pointern
ausgestattet werden.
• Das Einfügen von Pointern in den B+ Baum kann zum
Überlauf eines Knotens führen. Die resultierende
Umordnung wurde im Exkurs bereits beschrieben.
Vielen Dank für die
Aufmerksamkeit
Der Lineare Quadtree
• An dieser Stelle sei an einem Beispiel das
Prinzip des B+Baums dargestellt :
7
2 3 7
9 10 13 15
Der Lineare Quadtree
• Wir setzen dabei die Anzahl maximal
möglicher Einträge in einem Knoten auf
vier.
7
2 3 7
9 10 13 15
Der Lineare Quadtree
• Wir fügen einen Eintrag mit dem Schlüssel
23 ein:
7
2 3 7
9 10 13 15
Der Lineare Quadtree
• Man stellt fest, das gilt 23 > 7 gilt. Somit ist
zu prüfen, ob der Eintrag im rechten
Teilbaum gemacht werden sollte.
7
2 3 7
9 10 13 15
Der Lineare Quadtree
• Das Blatt im rechten Teilbaum ist aber voll
und muß daher geteilt werden.
7
2 3 7
9 10 13 15
Der Lineare Quadtree
• Das Blatt im rechten Teilbaum ist aber voll
und muß daher geteilt werden.
7 13
2 3 7
9 10 13
15 23
Der Lineare Quadtree
• Dabei ist eine wichtige Eigenschaft des
B+Baums festzustellen: er ist nach wie vor
ausgeglichen!
7 13
2 3 7
9 10 13
15 23
Der Lineare Quadtree
• Somit kann also eine Suchanfrage an den B+
Baum immer in logarithmischer und
konstanter Zeit bearbeitet werden!
7 13
2 3 7
9 10 13
15 23
Das Grid-File
? ?
? ?
• Nun soll untersucht
werden, im Bereich von
welcher Zelle sich ein
gesuchter Eintrag
befindet.
• Die Suche kann mit Hilfe
der zwei Vektoren
geschehen, sofern X- und
Y-Koordinate bekannt
sind.
Das Grid-File
PX , PY
X
x0
x1
x2
• Der Punkt habe die
Koordinaten PX und PY.
• Nun wird anhand des X Vektors untersucht,
wieviele Gitternetzlinien
links vom Punkt liegen,
• womit die
Spaltennummer der Zelle
ermittelt wäre.
Das Grid-File
PX , PY
X
x0
x1
x2
PX
• Es gelte als Beispiel:
x0 < x1 <Px < x2.
Die gesuchte
Zelle liegt in der
2ten Spalte des
Datenraumes
Das Grid-File
• Es gelte als Beispiel:
x0 < x1 <Px < x2.
y2
Die gesuchte
Zelle liegt in der
2ten Spalte des
Datenraumes
y1
y0
x0
x1
x2
PX
Das Grid-File
PX , PY
Y
y0
y1
y2
• Nun wird anhand des Y Vektors untersucht, wieviele
Gitternetzlinien unterhalb vom
Punkt liegen,
• womit die Zeilennummer der
Zelle ermittelt wäre.
• Achtung: die Zeilen werden von
unten nach oben numeriert.
Das Grid-File
• Es gelte als Beispiel:
y0 < PY < y1 < y2.
PX , PY
Y
y0
y1
y2
PY
Die gesuchte
Zelle liegt in der
ersten Zeile des
Datenraumes
Das Grid-File
• Es gelte als Beispiel:
y0 < PY < y1 < y2.
y2
Die gesuchte
Zelle liegt in der
ersten Zeile des
Datenraumes
y1
PY
y0
x0
x1
x2
Das Grid-File
• Somit ist die
gesuchte Zelle
gefunden .
y2
y1
PY
1.2
y0
x0
x1
x2
PX
• Sie erhält als
Nummer ihre
Zeilen- und
Spaltennummer.
Das Grid-File
• Auf diese Weise
werden auch die
übrigen Zellen
numeriert.
y2
2.1
2.2
1.1
1.2
y1
y0
x0
x1
x2
• Da jede Zelle einem Bucket
zugeordnet ist, wird für jede
Zelle ein Pointer zu ihrem
Bucket angelegt.
P2,1
P2,2
P1,1
P1,2
Aufbau eines Grid-Files und
Abspeichern im Grid-File
• Schwieriger Fall: Die Einträge
liegen nur im Bereich einer
einzigen Zelle.
• Ein anderes Beispiel macht
deutlich, das es Sinn macht, die
Unterteilung so einzurichten,
das möglichst viele bereits
volle Zellen geteilt werden,
damit für diese ggf. keine
Unterteilung gemacht werden
muß, wenn ihr Bucket
überläuft.
Aufbau eines Grid-Files und
Abspeichern im Grid-File
• Es entsteht eine Menge kaum
gefüllter oder leerer Zellen, die
kein eigenes Bucket haben
sollten, um Speicherplatz zu
sparen.
• Daher gilt es zu prüfen, ob der
Zelleninhalt auch in einem Bucket
der Nachbarzellen abgespeichert
werden kann
Herunterladen