7.4 Transformation des Definitions- bzw. Wertebereichs Beispiel 9
f 0 = 1 f 1 = 2
f n = f n − 1 · f n − 2 f¨ ur n ≥ 2 . Setze
g n := log f n . Dann gilt
g n = g n − 1 + g n − 2 f¨ ur n ≥ 2
g 1 = log 2 = 1, g 0 = 0 (f¨ ur log = log 2 ) g n = F n (n-te Fibonacci-Zahl)
f n = 2 F
nEADS 7.4 Transformation des Definitions- bzw. Wertebereichs 44/600
©Ernst W. Mayr
Beispiel 10
f 1 = 1 f n = 3f
n2
+ n; f¨ ur n = 2 k ; Setze
g k := f 2
k.
EADS 45/600
©Ernst W. Mayr
Beispiel 10 Dann gilt:
g 0 = 1
g k = 3g k − 1 + 2 k , k ≥ 1
Damit ergibt sich:
g k = 3 k+1 − 2 k+1 , also f n = 3 · 3 k − 2 · 2 k
= 3(2 log 3 ) k − 2 · 2 k
= 3(2 k ) log 3 − 2 · 2 k
= 3n log 3 − 2n .
EADS 7.4 Transformation des Definitions- bzw. Wertebereichs 45/600
©Ernst W. Mayr
Kapitel II H¨ ohere Datenstrukturen
1. Grundlegende Operationen
Es sei U das Universum von Schl¨ usseln mit einer (totalen) Ordnung ≤ . S ⊆ U sei eine Teilmenge der Schl¨ ussel. Gegeben seien eine Menge von Datens¨ atzen x 1 , · · · , x n , wobei jeder Datensatz x durch einen Schl¨ ussel k(x) ∈ S gekennzeichnet ist.
Jeder Datensatz x besteht aus seinem Schl¨ ussel k(x) und seinem eigentlichen Wert v(x).
EADS 1 Grundlegende Operationen 46/600
©Ernst W. Mayr
IsElement(k, S ): ist k ∈ S, wenn ja, return v(k) Insert(k, S): S := S ∪ { k }
Delete(k; S): S := S \ { k } FindMin(S): return min S FindMax(S): return max S DeleteMin(S): S := S \ min S
ExtractMin(S): return min S, S := S \ min S DecreaseKey(k, ∆, S): ersetze k durch k − ∆ Union(S 1 , S 2 ): S 1 := S 1 ∪ S 2
Find(k): falls k ∈ S, so finde x mit k = k(x) Merge(S 1 , S 2 ): S 1 := S 1 ∪ S 2 , falls S 1 ∩ S 2 = ∅ Split(S 1 , k, S 2 ): S 2 := { k 0 ∈ S 1 | k 0 ≥ k }
S 1 = { k 0 ∈ S 1 | k 0 < k } Concatenate(S 1 , S 2 ): S 1 := S 1 ∪ S 2 ;
Vorauss.: FindMax(S 1 ) ≤ FindMin(S 2 )
EADS 1 Grundlegende Operationen 47/600
©Ernst W. Mayr
Datenstrukturklasse mindestens angebo- realisiert in tene Funktionen
W¨ orterbuch IsElement(), Hashtable, (Dictionary) Insert(), Delete() Suchb¨ aume Vorrangwarteschlange FindMin(), Insert(), balancierte, leftist (Priority Queue) Delete(), B¨ aume, Binomial
[IsElement()] Queues Mergeable heaps FindMin(), 2-3-B¨ aume,
Insert(), Delete(), Binomial Queues, Merge() Leftist-B¨ aume Concatenable queues FindMin(), 2-3-B¨ aume
Insert(), Delete(), Concatenate()
EADS 1 Grundlegende Operationen 48/600
©Ernst W. Mayr
Definition 11
Bei einem externen Suchbaum werden die Schl¨ ussel nur an den Bl¨ attern gespeichert, die inneren Knoten enthalten Verwaltungsinformationen.
Bei internen Suchb¨ aumen liegen die Schl¨ ussel an den internen Knoten, die Bl¨ atter sind leere Knoten. Zeiger auf Bl¨ atter sind daher NIL-Pointer und werden gew¨ ohnlich nicht angegeben.
EADS 1 Grundlegende Operationen 49/600
©Ernst W. Mayr
2. (Balancierte) Suchb¨ aume
Wir betrachten zun¨ achst zwei Familien h¨ ohenbalancierter externer Suchb¨ aume.
2.1 (a,b)-B¨ aume Definition 12
Ein (a, b)-Baum ist ein externer Suchbaum mit folgenden Eigenschaften:
1
alle Bl¨ atter haben die gleiche Tiefe;
2
die Anzahl der Kinder eines jeden internen Knoten ist ≤ b und
≥ a (f¨ ur die Wurzel: ≥ 2);
3
es gilt b ≥ 2a − 1.
4
(a, b)-B¨ aume mit b = 2a − 1 heißen auch B-B¨ aume.
EADS 2.1 (a,b)-B¨aume 50/600
©Ernst W. Mayr
Bei jedem internen Knoten v mit d = d(v) Kindern werden d − 1 Schl¨ ussel k 1 , . . . , k d − 1 gespeichert, so dass (mit k 0 := −∞ , k d = + ∞ ) gilt:
k i − 1 < alle Schl¨ ussel im i-ten Unterbaum von v ≤ k i .
Also z.B.: k i := maximaler Schl¨ ussel im i-ten Unterbaum von v.
Weiter gilt (wie in jedem Suchbaum)
max { Schl¨ ussel im i-ten UB } ≤ min { Schl¨ ussel im i + 1-ten UB } .
EADS 2.1 (a,b)-B¨aume 51/600
©Ernst W. Mayr
Beispiel 13
1 2 3 4 5 6
1 3 4 5
2
(2, 4)-Baum
EADS 2.1 (a,b)-B¨aume 52/600
©Ernst W. Mayr
Lemma 14
Sei T ein (a, b)-Baum mit n Bl¨ attern und der H¨ ohe h (H¨ ohe definiert als Anzahl der Kanten auf einem Pfad von der Wurzel zu einem Blatt). Dann gilt:
1
2a h − 1 ≤ n ≤ b h ;
2
log b n = log log n b ≤ h ≤ 1 + log a n 2 .
Beweis:
1
n ist maximal f¨ ur vollst¨ andigen Baum mit Verzweigungsgrad b und minimal f¨ ur einen Baum, wo die Wurzel Grad 2 und alle anderen internen Knoten Grad a haben.
2
folgt durch Umformung aus (1).
EADS 2.1 (a,b)-B¨aume 53/600
©Ernst W. Mayr
Operationen:
1. IsElement(k, S ) v := Wurzel von T ; while v 6 = Blatt do
i = min { s; 1 ≤ s ≤ (#Kinder von v) und k ≤ k s } ; v := i-tes Kind von v;
if k = k(v) then return v(k) else return false fi ; Zeitbedarf: θ(h) = θ(log n)
EADS 2.1 (a,b)-B¨aume 54/600
©Ernst W. Mayr
2. Insert(k, S)
F¨ uhre IsElement(k, S) aus; Blatt w;
if k 6 = k(w) then
co falls k < max S, enth¨ alt w den kleinsten Schl¨ ussel ∈ S, der > k ist oc
f¨ uge k if k < max S then links else rechts fi von w ein;
v := Vater von w;
if v hat nun mehr als b Kinder then Rebalancierung(v)
fi fi
EADS 2.1 (a,b)-B¨aume 55/600
©Ernst W. Mayr
1 2 3 4 5 6 7 8
4 5 7
3 6
1 2 1
⇓
1 3 4 5 7 8
1 4 5 7
3
2 6
2
EADS 2.1 (a,b)-B¨aume 56/600
©Ernst W. Mayr
Rebalancierung(v):
spalte v in zwei Knoten v 1 und v 2 , v 1 ¨ ubernimmt die linke
” H¨ alfte“ der Kinder von v, v 2 den Rest; da a ≤ b b + 1
2 c ≤ d b + 1
2 e ≤ b und b ≥ 2a − 1 , erf¨ ullen v 1 und v 2 die Gradbedingung;
Vereinfachung: Falls ein unmittelbarer Nachbar v 0 von v Grad
< b hat, ¨ ubernimmt v 0 das ¨ außerste linke/rechte Kind von v.
Falls nun der Vater u von v mehr als b Kinder hat, f¨ uhre Rebalancierung(u) aus;
Falls u die Wurzel des Baums ist, kann dadurch eine neue Wurzel geschaffen werden und die H¨ ohe des (a, b)-Baums wachsen.
Kosten O (log n)
EADS 2.1 (a,b)-B¨aume 57/600
©Ernst W. Mayr
3. Delete(k, S):
F¨ uhre IsElement(k, S) aus. Blatt w. Sei k(w) = k;
v := Vater von w;
L¨ osche w;
if v hat nunmehr < a Kinder then
f¨ uhre rekursiv aufsteigend Rebalancierung 0 (v) durch fi
EADS 2.1 (a,b)-B¨aume 58/600
©Ernst W. Mayr
1 2 4 5 6 7
1 2 5 6
4
1 2 4 5 6 7
1 4 6
2 5
1 2 3 4
1 3
5 6 7
5 6 2 4
. oder &
EADS 2.1 (a,b)-B¨aume 59/600
©Ernst W. Mayr
Rebalancierung 0 (v):
Falls ein unmittelbarer Nachbar v 0 von v Grad > a hat, adoptiert v das n¨ achste Kind von v 0 ;
Ansonsten wird v mit einem unmittelbaren Nachbarn verschmolzen; die Gradbedingung f¨ ur den dadurch entstehenden Knoten ist erf¨ ullt; die Rebalancierung wird rekursiv/iterativ f¨ ur den Vaterknoten fortgesetzt.
Zeitbedarf: O (log n)
EADS 2.1 (a,b)-B¨aume 60/600
©Ernst W. Mayr
Spezialf¨ alle von (a, b)-B¨ aumen:
(2, 3)-B¨ aume;
(2, 4)-B¨ aume;
(a, 2a − 1)-B¨ aume: B-B¨ aume
EADS 2.1 (a,b)-B¨aume 61/600
©Ernst W. Mayr
Bemerkungen:
1
zur Wahl von a:
Daten in RAM ⇒ a klein, z.B. a = 2 oder a = 3.
Daten auf Platte ⇒ a groß, z.B. a = 100.
2
Zur Wahl von b:
b ≥ 2a liefert wesentlich bessere amortisierte Komplexit¨ at (ohne Beweis, siehe Mehlhorn).
EADS 2.1 (a,b)-B¨aume 62/600
©Ernst W. Mayr
Top-Down-Rebalancierung: b ≥ 2a.
Bei der Restrukturierung nach der Top-Down-Strategie folgen wir wie gewohnt dem Pfad von der Wurzel zum gesuchten Blatt. Beim Einf¨ ugen stellen wir jetzt jedoch f¨ ur jeden besuchten Knoten sicher, dass der Knoten weniger als b Kinder hat.
Wenn der gerade betrachtete Knoten ein b-Knoten ist, dann spalten wir ihn sofort auf. Weil der Vater kein b-Knoten ist (das haben wir ja bereits sichergestellt), pflanzt sich der
Aufspaltungsprozess nicht nach oben hin fort. Insbesondere kann das neue Element ohne Probleme eingef¨ ugt werden, wenn die Suche das Blattniveau erreicht hat.
Damit diese Strategie m¨ oglich ist, muss b mindestens 2a sein (und nicht nur 2a − 1), da sonst nach der Spaltung nicht gen¨ ugend Elemente f¨ ur die beiden Teile vorhanden sind.
EADS 2.1 (a,b)-B¨aume 63/600
©Ernst W. Mayr
Beim L¨ oschen verfahren wir analog. F¨ ur jeden besuchten Knoten, außer der Wurzel des (a, b)-Baumes, stellen wir sicher, dass er mindestens a + 1 Kinder hat. Wenn der gerade betrachtete Knoten nur a Kinder hat, so versuchen wir zuerst, ein Element des rechten oder linken Nachbarknoten zu stehlen.
Haben beide Nachbarknoten nur jeweils a Kinder, so verschmelzen wir unseren Knoten mit einem der beiden Nachbarn. Ist der Vater nicht die Wurzel, so hatte er aber vorher mindestens a + 1 Kinder, und dieser Verschmelzungsprozess kann sich nicht nach oben fortsetzen. Andernfalls erniedrigt sich der Grad der Wurzel um 1, wenn die Wurzel Grad > 2 hat, oder die alte Wurzel wird gel¨ oscht und der soeben verschmolzene Knoten wird zur neuen Wurzel.
EADS 2.1 (a,b)-B¨aume 64/600
©Ernst W. Mayr
Restrukturierung nach der Top-Down-Strategie sorgt nicht f¨ ur eine bessere Laufzeit, sondern erleichtert die Synchronisation, wenn mehrere Prozesse gleichzeitig auf einen (a, b)-Baum zugreifen wollen.
Bei herk¨ ommlichen (a, b)-B¨ aumen schreiten die Such- und die Restrukturierungsoperationen in entgegengesetzter Richtung fort, was dazu f¨ uhrt, dass sich oft Prozesse gegenseitig behindern (der eine will im Baum absteigen, der andere muss auf dem gleichen Pfad aufw¨ arts restrukturieren).
Bei der Top-Down-Strategie gibt es nur Operationsfolgen, die den Baum hinabsteigen. Mehrere Prozesse k¨ onnen so in einer Art Pipeline gleichzeitig einen Pfad mit kurzem Abstand begehen.
EADS 2.1 (a,b)-B¨aume 65/600
©Ernst W. Mayr