• Keine Ergebnisse gefunden

1. 1-dim Bereichssuche: 1-dim Range Trees 2. 2-dim Bereichssuche: k-d-Bäume

N/A
N/A
Protected

Academic year: 2021

Aktie "1. 1-dim Bereichssuche: 1-dim Range Trees 2. 2-dim Bereichssuche: k-d-Bäume"

Copied!
27
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Orthogonale Bereichssuche

1. 1-dim Bereichssuche: 1-dim Range Trees 2. 2-dim Bereichssuche: k-d-Bäume

3. 2-dim Bereichssuche: 2-dim Range Trees

Bereichssuche in höheren Dimensionen

(2)

Bereichssuche

Alter

#Kinder Gehalt

120.000 60.000

20 50

Datenbankanfragen

Gegeben:

3 1

Menge von Datenbankpunkten orthogonaler Anfragebereich Gesucht: Knoten die in P liegen

P

(3)

Binärer Suchbaum (1-dim Fall)

(4)

Binärer Blattsuchbaum

(5)
(6)

Eindimensionale Bereichssuche

49 23

10 3

3 10 19 23 30 37 30

37 19 49

80

62 89

89 95

95 97 70

80 70 59

62 59

Anfrage: [18,77]

binärer Blattsuch- baum

SplitNode

FindSplitNode(T,x,x’) v=root(T)

while not Leaf(v) & (x’ <= v.x | x > v.x) if (x’ <= v.x) v = left(v) else v = right(v)

x x‘

return v

Laufzeit: O(log n)

Beachte: O(log n) ausgewählte Teilbäume

(7)

1-dimRangeQuery (T,[x,x’])

v_split= FindSplitNode(T,[x,x’])

if (Leaf(v_split) & v_split in R) write v_split, return v = lchild(v_split)

while (not Leaf(v))

if (x <= v.x) write Subtree(rchild(v)), v = lchild(v) else v = rchild(v)

if (v in R) write v v = rchild(v_split) ...

Algorithmus eindimensionale Bereichssuche

Satz: Laufzeit O(log n+k)n=#Punkte, k=#Ausgabepunkte Bew: FindSplitNode: O(log n), Blattsuche O(log n)

#grüne Knoten O(k), da #innere Knoten in O(k)

x x’

s

v rechts(v) p

(8)

Zusammenfassung:

Sei P eine Menge von n Punkten im 1-dim Raum.

Dann kann P in einem balancierten (Blatt-) Suchbaum gespeichert werden, der in Zeit O(n log n) und Platz O(n) konstruiert werden kann und so daß sich alle k in einem gegebenen Anfragebereich liegenden Punkte in Zeit O(log n + k) berichten lassen.

(9)

Zweidimensionale Bereichssuche

x

y Annahme: keine zwei Punkte

haben dieselbe x- oder y- Koordinaten

(10)

x

y Annahme: keine zwei Punkte

haben dieselbe x- oder y- Koordinaten

(11)

Konstruktion kd-Baum

1

5 1 7

2

8 3

4 6

9 4

4

5

5

9

9 10

10 8

8 6

6 3

3 2

2

7

1 7 7

3 6

2

1 2

3 4 5

6 7

8 9 10 1

1

4 5

8 9

1

1,2,3,4,5 6,7,8,9,10 P

P1 P2

(12)

BuildTree(P,depth)

if (|P| =1) return Leaf(p)

if (depth gerade) splitte P in P1,P2 via vertikalem Median else splitte P in P1,P2 via horizontalem Median

v1=BuildTree(P1,depth+1) v2=BuildTree(P2,depth+1)

return (v1,Median,v2)

Satz: O(n) Platz und O(n log n) Zeit

=O(n)+2T(n/2), n>1

Algorithmus Kd-Baum

Bew: Platz: Binärbaum mit n Leaves.

Zeit: T(n) = O(1), n=1 T(n) <= cn + 2T(n/2)

<= cn + 2(cn/2+T(n/4))

<= 2cn + T(n/4)

= O(n log n)

Tiefe:

O(n log n)

(13)

5 1 7 2

8 3

4 6

9

4 5 9

10 8 3 6

2

1 7 7

3 6

2

1 2

3 4 5

6 7

8 9 10 1

4 5

8 9

links rechts

unten oben

Suche in einem kd-Baum

Regionen:

Region(5) ist links von 1 und oberhalb von 2 Inkrementell gilt (hier gerade Tiefe):

Region(left(v)) = links(v) Region(v)∩

(14)

SearchTree(v,R)

if (Leaf(v) & v in R) write v, return

if (Region(left(v)) in R) write Subtree(left(v)), return if (Region(left(v)) R <> {}) SearchTree(left(v),R) if (Region(right(v)) in R) write Subtree(right(v)), return if (Region(right(v)) R <> {}) SearchTree(right(v),R)

Algorithmus Suche im 2-d-Baum

5 1 7

2

8 3

4 6

9

4 5 9

10 8 3 6

2

1 7 7

3 6

2

1 2

3 4 5

6 7

8 9 10 1

4 5

8 9

links rechts

unten oben

(15)

Bew:

Sei B = # blauer, G = # grüner Knoten G(n)=O(k).

= 2+2V(n/4), n>1

Bel. l schneidet root(T) links od. rechts B(n) <= # vertikaler Schnittregionen V

+ # horizontaler Schnittregionen H Es gilt die folgende Rekursion

V(n) = O(1), n=1

V(n) = 2 + 4 + 8 + 16 + ... + 2^log_4 n

= 2 + 4 + 8 + 16 + ... + n = O( )n

Algorithmus Suche in Kd-Baum

Satz: Eine orthogonale Bereichsanfrage in einem kd-Baum mit n Punkten kann in Zeit O( n + k) beantwortet werden.

(k=#Punkte im Anfragebereich)

(16)

V(n)=#Regionen in k-d-Baum mit n Punkten, die von vertikaler Gerade

geschnitten werden.

V(1)=1

V(n)=2+2V(n/4)

(17)

Zusammenfassung

Ein k-d-Baum zur Speicherung einer Menge von n Punkten in der Ebene kann in Zeit O(n log n) und Platz O(n)

konstruiert werden. Für einen beliebig gegebenen

Anfragebereich können alle im Bereich liegenden k Punkte in Zeit O(n lon n +k) berichtet werden.

(18)

Bereichsbäume (Range Trees)

Zweidimensionale Bereichssuche

x

y Annahme: keine zwei Punkte

haben dieselbe x- oder y- Koordinaten

(19)

vsplit v

P(v)=Menge der Punkte im Teilbaum von v

Kanonische Punktmenge eines Knotens

(20)

x

y assoziierter Baum

(21)

Bereichsbaum für Menge P

(1) Baum für die erste Schicht:

Balancierter Suchbaum T für die Punkte in P in x-Reihenfolge

(2) Assoziierte Bäume auf der zweiten Schicht:

Für jeden Knoten v von T wird die kanonische

Punktmenge von v in einem nach den y-Koordinaten sortierten balancierten Suchbaum Tassoc(v)

gespeichert.

(22)

Konstruktion Bereichsbaum

v

T’(v) T

(x-sortiert) (y-sortiert)

BuildRangeTree(P)

if (|P| = 1) return Leaf(p),T’(Leaf(p)) Splitte P in P1, P2 via Median x v1 = BuildRangeTree(P1)

v2 = BuildRangeTree(P2)

für alle Knoten in T speichert gesamte Punktinformation

p

Alle Knoten y-vorsortiert

1. Konstruiere assoziierten Baum T’

für die Wurzel von P 2.

sonst:

3. speichere x in, leftChild(v)=v1, rightChild(v)=v2, assoziiere T’ mit v

(23)

Konstruktion Bereichsbaum

v

T’(v) T

(x-sortiert) (y-sortiert)

BuildRangeTree(P)

if (|P| = 1) return Leaf(p),T’(Leaf(p)) Splitte P in P1, P2 via Median x

v1 = BuildRangeTree(P1) v2 = BuildRangeTree(P2)

return (v1,x,v2),T’(v1,x,v2)

für alle Knoten in T speichert gesamte Punktinformation

p

Alle Knoten y-vorsortiert

Satz: O(n log n) Platz und Zeit

Bew:Jeder Knoten in T ist maximal O(log n) mal in T’

=> Platz O(n log n)

Aufbau des binären Suchbaumes T’ (bottom-up) in Linearzeit, da y -vorsortiert => Zeit O(n log n)

(24)

Suche im Bereichsbaum

RangeQuery(T,[x,x’]x[y,y’])

v_split = FindSplitNode(T,x,x’)

if (Leaf(v_split) & v_split in R) write v, return v = left(v_split)

while not (Leaf(v))

if (x<=v.x) 1-dim RangeQuery(T’(right(v)),[y,y’]) v = left(v)

else v = right(v) if (v in R) write v v = right(v_split) ...

Satz: O(log^2 n + k) Zeit.

Bew: Die Zeit für die eindimensionale Suche an v ist durch O(log n + kv) beschränkt.

Σ

v

k = kv T(n) =

Σ

v

O(log n+kv) = k +

Σ

v

O(log n)

und Suchpfad zu x und x’ O(log n) =>

= O(log^2 n + k)

(25)

Höhere Dimensionen

T(2,n) = O(n log n)

T(d,n) = O(n log n)+O(log n) T(d-1,n)

=> T(d,n) = O(n log^d-1 n)

Q(2,n) = O(log^2 n)

Q(d,n) = O(log n) + O(log n) Q(d-1,n)

=> Q(d,n) = O(log^d n) Zeitbedarf für Konstruktion:

Zeitbedarf für Bereichsanfrage (ohne Ausgabe):

(26)

Suche in Untermengen

Gegeben: Zwei geordnete Arrays A1 und A2.

Schlüssel(A2) Schlüssel(A1)⊂ Anfrage [x,x’]

Gesucht: Alle Elemente e in A1 und A2 mit x <= Schluessel(e) <= x’

3 10 19 23 30 37 59 62 70 80 90 95

10 19 30 62 70 80 90 Beispielanfrage: [20:65]

Idee: Zeiger zwishen A1 und A2.

Laufzeit: O(log n+k) Laufzeit: O(1+k)

(27)

Fractional Cascading

Idee: P1 P P2 P

8 5

2 2 5

7 7 8

15

12 17

12 15 19 80 10 37 3 99

62

3 10 19 37 62 80 99

10 19 37 80 3 62 99

19 80 10 37 3 99 62

19 80 10 37 3 99

x-Werte

y-Werte

Satz: Anfragezeit kann auf O(log n + k)

gedrückt werden.

Bem: In d-Dimension Ersparnis um ein

log-Faktor

Referenzen

ÄHNLICHE DOKUMENTE

Es ist eine gute Übung (aber durchaus etwas schwerer), die Behauptung erst einmal zu „finden“ wenn sie nicht angegeben ist.. Zum Beispiel: in Aufgabe 6) muss die Formel für

[r]

[r]

Im Folgenden wird eine Visualisierung mit regelmäßigen n-Ecken versucht die jeweils in n Sektoren unterteilt sind.. Die Elemente werden durch

Wir bearbeiten die allgemeine Situation eines Turmes mit einem regelmäßigen n-Eck als Grundriss und nummerieren die Dachflächen mit k ∈ { 1, ..., n }!. Die aufgenommene Wassermenge

Auf dem einen Schenkel wählen wir einen belie- bigen Punkt P 0 und ergänzen zu einer Zickzacklinie der Seitenlänge 1 gemäß Abbil- dung 10.. 10: Winkel und Zickzacklinie

Es ist der Leserin oder dem Leser überlassen, wie ob sie oder er die Figur der Abbil- dung 5 als Folge von Rhomben mit dem Spitzenwinkel 72° oder als eine Ecke eines 5d-

Die erreichbaren Werte der Gr¨oße Cov(X , Y ) h¨angen nicht nur von der St¨arke der linearen Abh¨angigkeit ab, sondern (wie insbesondere aus Rechenregel 1 von Folie 284