Algorithmen und Datenstrukturen SS09 - Foliensatz 11

Werbung
Algorithmen und Datenstrukturen SS09
Foliensatz 11
Michael Brinkmeier
Technische Universität Ilmenau
Institut für Theoretische Informatik
Sommersemester 2009
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 1 / 30
Mehrweg-Suchbäume
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 2 / 30
Mehrweg-Suchbäume
Idee
Statt binärer Bäume sollen Bäume mit variablem Ausgangsgrad verwendet
werden.
x1
xl
···
T0
T1
Tl−1
Tl
x1 < x2 < · · · < xl .
Für y ∈ T0 gilt y < x1
Für y ∈ Ti mit 0 < i < l gilt xi < y < xi +1
Für y ∈ Tl gilt y < xl
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 3 / 30
Ein Beispiel
Wurzel
7
1
2
4
10
9
16
11
29
13
21
12
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 4 / 30
27
39
35
36
25
38
45
41
48
50
Mehrweg-Suchbäume
Definition (Mehrweg-Suchbäume)
Mehrweg-Suchbäume (MSBe) über der total geordneten Menge U sind
induktiv definiert:
Der leere Baum ist ein U-MSB
Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und sind
T0 , T1 , . . . , Tl U-MSB so dass
y < x1 für alle y ∈ T0 ,
xi < y < xi +1 für alle y ∈ Ti mit 1 < i < l und
xl < y für y ∈ Tl
dann ist auch (T0 , x1 , T1 , x2 , . . . , xl−1 , Tl−1 , xl , Tl ) ein U-MSB.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 5 / 30
Implementierung von MSB
Variante 1:
Zwei Listen/Arrays, eine für die Einträge und eine für die Bäume.
keys:
10
11
13
trees:
l: 3
T0
T2
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 6 / 30
Implementierung von MSB
Variante 2:
Eine Liste, die die Paare (Ti −1 , xi ) enthält und den Baum Tl einzeln.
keys:
10
11
13
last:
l: 3
T0
T2
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 7 / 30
2-3-Bäume
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 8 / 30
2-3-Bäume
Definition (2-3-Bäume)
Ein MSB T heißt 2-3-Baum, wenn
Jeder Knoten enthält 1 oder 2 Schlüssel (hat also 2 oder drei Kinder)
Hat ein Knoten v einen leeren Unterbaum, so sind alle seine
Unterbäume leer, d.h. er ist ein Blatt
Alle Blätter von T haben dieselbe Tiefe.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 9 / 30
Ein Beispiel
I
G
A
O
H
L
M
2-3-Baum
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 10 / 30
T
R
S
U
Ein Beispiel
I
G
A
B
C
O
H
L
T
M
R
S
U
Kein 2-3-Baum, denn ein Knoten enthält zu viele Schlüssel
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 11 / 30
Ein Beispiel
I
G
O
L
M
T
R
S
U
Kein 2-3-Baum, denn die Blätter sind nicht auf dem gleichen Level.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 12 / 30
Ein Beispiel
I
G
O
A
L
M
T
R
S
U
Kein 2-3-Baum, denn ein Knoten hat einen leeren und einen
nicht-leeren Unterbaum.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 13 / 30
Die Tiefe von 2-3-Bäumen
Lemma
Für die Tiefe D eines 2-3-Baumes mit n Einträgen gilt
⌈log3 (n + 1)⌉ − 1 ≤ D ≤ ⌊log(n + 1)⌋ − 1
Beweis: Übungsaufgabe
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 14 / 30
Suche in 2-3-Bäumen
lookup(T , x)
Eingabe: 2-3-Baum T , Schlüssel x;
Ausgabe: true falls der Schlüssel gefunden wurde, sonst false;
if T = then return false;
if T = (T0 , x1 , T1 ) or T = (T0 , x1 , T1 , x2 , T2 ) then
if x == x1 or x == x2 then return true;
if x < x1 then return lookup(T0 , x);
if (x2 existiert nicht) oder (x < x2 ) then return lookup(T1 , x);
return lookup(T2 , x);
end
Alle Vergleiche mit x2 und T2 werden nur gemacht, wenn die beteiligten
Werte definiert sind
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 15 / 30
Suche in 2-3-Bäumen
Wenn x im Knoten vx vorhanden ist, dann benötigt die Suche für jeden
Knoten u auf dem Weg von der Wurzel zu vx Zeit O(1).
Da der Baum Tiefe O(log n) hat, benötigt die Suche somit insgesamt
O(log n) Zeit.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 16 / 30
Einfügen in 2-3-Bäume
Zum Einfügen in 2-3-Bäume benutzen wir die Funktion insert(T , x, r ), die
den geänderten Baum T ′ und ein Flag higher zurürck gibt.
Dabei gilt
higher =
(
true
false
falls T ′ höher als T ist
falls T ′ nicht höher als T ist
Für den Algorithmus benutzen wird die folgende Invariante:
Invariante (I)
Ist T ′ höher als T , dann hat T ′ in der Wurzel nur einen Schlüssel.
D.h. wir werden insert so gestalten, dass bei einer Zunahme der Höhe
sichergestellt ist, dass die Wurzel des jeweiligen Baumes nur einen Schlüssel
enthält.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 17 / 30
Einfügen in 2-3-Bäume
Fall 1: T = , d.h. wir fügen in einen leeren Baum ein.
Erzeuge einen neuen 2-3-Baum-Knoten T ′ mit dem Eintrag (x, r ) und 2
leeren Unterbäumen.
Gebe T ′ und true zurürck.
Wie man leicht sieht ist die Invariante (I) erfüllt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 18 / 30
Einfügen in 2-3-Bäume
Fall 2: Die Wurzel von T enthält einen Schlüssel x1 und hat die Unterbäume
T0 und T1 .
Fall 2.1: x < x1
(T0 , sub higher) = insert(T0 , x, r );
if sub higher == false then return T , false;
else T ′ wie unten und higher = false;
Wegen der Invariante (I) hat T im zweiten Fall die Form
T
T0′
x1
T′
⇒
z
x1
z
T1
′
T00
′
T00
′
T01
T1
′
T01
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 19 / 30
Einfügen in 2-3-Bäume
Fall 2: Die Wurzel von T enthält einen Schlüssel x1 und hat die Unterbäume
T0 und T1 .
Fall 2.2: x = x1 ⇒ Update
data(T ) = r ;
higher = false;
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 20 / 30
Einfügen in 2-3-Bäume
Fall 2: Die Wurzel von T enthält einen Schlüssel x1 und hat die Unterbäume
T0 und T1 .
Fall 2.3: x1 < x
(T1 , sub higher) = insert(T1 , x, r );
if sub higher == false then return T , false;
else T ′ wie unten und higher = false;
Wegen der Invariante (I) hat T im zweiten Fall die Form
x1
T
⇒
z
T0′
x1
T′
z
T0
T0
′
T11
′
T10
′
T11
′
T10
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 21 / 30
Einfügen in 2-3-Bäume
Fall 3: Die Wurzel von T enthält zwei Schlüssel x1 < x2 und hat die
Unterbäume T0 , T1 und T2 .
Fall 3.1: x < x1
Falls sub higher = false ändert sich nichts und man setzt
higher = false.
Im anderen Fall hat wegen der Invariante (I) T die Form
T
T0′
x1
x2
⇒
z
T1
′
T00
T′
′
T01
x1
x2
z
T2
′
T00
′
T01
higher = true und wie man sieht ist (I) anschließend erfüllt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 22 / 30
T1
T2
Einfügen in 2-3-Bäume
Fall 2: Die Wurzel von T enthält einen Schlüssel x1 und hat die Unterbäume
T0 und T1 .
Fall 3.2: x = x1 oder x = x2 ⇒ Update
data(T ) = r ;
higher = false;
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 23 / 30
Einfügen in 2-3-Bäume
Fall 3: Die Wurzel von T enthält zwei Schlüssel x1 < x2 und hat die
Unterbäume T0 , T1 und T2 .
Fall 3.3: x1 < x < x2
Falls sub higher = false ändert sich nichts und man setzt
higher = false.
Im anderen Fall hat wegen der Invariante (I) T die Form
x1
T
T0′
x2
T′
⇒
z
T0
z
x1
x2
T2
′
T10
′
T11
T0
′
T10
′
T11
higher = true und wie man sieht ist (I) anschließend erfüllt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 24 / 30
T2
Einfügen in 2-3-Bäume
Fall 3: Die Wurzel von T enthält zwei Schlüssel x1 < x2 und hat die
Unterbäume T0 , T1 und T2 .
Fall 3.4: x2 < x
Falls sub higher = false ändert sich nichts und man setzt
higher = false.
Im anderen Fall hat wegen der Invariante (I) T die Form
T
x1
x2
T0′
T0
T′
⇒
z
x2
x1
z
T1
′
T20
′
T21
T0
T1
′
T20
T21
higher = true und wie man sieht ist (I) anschließend erfüllt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 25 / 30
Einfügen in 2-3-Bäume
Beobachtung
Die Tiefe von 2-3-Bäumen wächst durch das Spalten der Wurzel.
Lemma
Die Prozedur insert für 2-3-Bäume ist korrekt, d.h. sie erhält die
2-3-Baum-Struktur.
Das Einfügen eines Schlüssels in einen 2-3-Baum mit n Schlüsseln
benötigt Zeit O(log n) und bewirkt die Erzeugung von höchstens log2 n
neuen Knoten.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 26 / 30
Einfügen in 2-3-Bäume
Beweis
Zu 1): Man kontrolliert in jedem Fall des Algorithmus, dass die
2-3-Baum-Struktur wiederhergestellt wird.
Zu 2): Für die Bearbeitung eines Levels in insert wird Zeit O(1) benötigt.
Auf jedem der ≤ log n Levels wird höchstens 1 Knoten neu gebildet.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 27 / 30
Löschen aus 2-3-Bäumen
Vorgehensweise
Falls x gelöscht werden soll, suche den kleinsten Schlüssel y ≥ x, der in
einem Blatt gespeichert ist. (y ist der Inorder-Nachfolger von x.)
Setze y an die Stelle von x und entferne y .
Also wie bei AVL-Bäumen.
Fazit
Man muss sich nur um das Löschen eines Eintrags y in einem Blatt
kümmern.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 28 / 30
Löschen aus 2-3-Bäumen
Falls das Blatt noch einen weiteren Eintrag enthält, ist das Löschen einfach,
da keine Umstrukturierung nötig ist.
Falls das Blatt nur den zu löschenden Schlüssel enthält, ist eine
Rebalacierung erforderlich.
Ähnlich wie bei den Einfügungen werden flacher gewordene Teilbäume durch
lokale Umstellung wieder auf die Höhe der anderen Teilbäume gebracht.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 29 / 30
Herunterladen