Aufgabe (Hashing)
Gegeben sei eine Hashtabelle mit 10 Feldern für Einträge (Index 0 bis 9) und eine
Hashfunktion h(k) = k mod 10. Führen Sie für die folgenden Hashverfahren einen
Schreibtischtest durch, indem Sie jeweils die Werte 56, 34, 6, 13, 94, 27, 47 in dieser
Reihenfolge in eine leere Tabelle einfügen und diese nach jeder Einfügeoperation
ausgeben.
1
Hashing mit direkter Listenverkettung
Hierbei ist die Hashtabelle als Array von einfach verketteten Listen realisiert.
2
Offenes Hashing mit linearem Sondieren
Bei Kollisionen wird hier das einzufügende Element an der nächsten freien Stelle
links vom berechneten Hashwert eingefügt. Das heißt, die Sondierungsreihenfolge
(die Reihenfolge, in der die Plätze im Array durchgegangen werden, bis erstmals
ein freier Platz angetroffen wird) ist gegeben durch s(k, i) = (h(k) − i) mod 10
für i = 0, . . . , 9.
Aufgabe (Hashing)
Gegeben sei eine Hashtabelle mit 10 Feldern für Einträge (Index 0 bis 9) und eine
Hashfunktion h(k) = k mod 10. Führen Sie für die folgenden Hashverfahren einen
Schreibtischtest durch, indem Sie jeweils die Werte 56, 34, 6, 13, 94, 27, 47 in dieser
Reihenfolge in eine leere Tabelle einfügen und diese nach jeder Einfügeoperation
ausgeben.
3
Doppeltes Hashing
Das doppelte Hashing ist ein offenes Hashing, bei dem die Sondierungsreihenfolge
von einer zweiten Hashfunktion h0 (k) = 1 + (k mod 8) abhängt. Die Position für
das i-te Sondieren ist bestimmt durch s(k, i) = (h(k) − i · h0 (k)) mod 10 für
i = 0, . . . , 9.
4
Uniformes offenes Hashing
Hier erhält jeder Schlüssel mit gleicher Wahrscheinlichkeit eine der 10!
Permutationen von {0, 1, . . . , 9} als Sondierungsreihenfolge.
Als zufällige“ Permutationen nutzen Sie:
”
L(56) = 2, 9, 3, 0, 8, 7, 6, 1, 4, 5
L(94) = 6, 8, 4, 0, 9, 1, 5, 2, 3, 7
L(34) = 1, 5, 9, 3, 7, 4, 8, 6, 2, 0
L(27) = 4, 2, 7, 5, 1, 8, 9, 0, 3, 6
L(6) = 9, 8, 5, 2, 1, 7, 0, 6, 3, 4
L(47) = 1, 9, 6, 0, 3, 5, 2, 8, 7, 4
L(13) = 1, 4, 5, 2, 0, 7, 3, 6, 9, 8
Binäre Suchbäume (Definition)
Binärer Suchbaum:
(Geordneter gewurzelter) binärer Baum, der das Search Constraint erfüllt.
Search Constraint:
Für alle Knoten v gilt
alle Schlüssel im linken Teilbaum von v sind kleiner (oder gleich) dem
Schlüssel von v,
alle Schlüssel des rechten Teilbaum von v sind größer (oder gleich) dem
Schlüssel von v.
Binäre Suchbäume (Einfügen/Entfernen)
Führen sie die folgenden Operationen in der gegebenen Reihenfolge aus. Geben
sie nach jeder Operation den neuen Baum an.
1
insert(16), insert(11)
10
5
14
3
2
8
15
delete(24), delete(10)
20
10
2
24
18
15
12
14
30
19
25
40
Traversierungen von Bäumen
Pre-Order-Traversierung (w, L, R)
1
Besuche Wurzel w
2
Pre-Order-Traversierung auf linkem Teilbaum von Wurzel w
3
Pre-Order-Traversierung auf rechtem Teilbaum von Wurzel w
In-Order-Traversierung (L, w, R)
1
In-Order-Traversierung auf linkem Teilbaum von Wurzel w
2
Besuche Wurzel w
3
In-Order-Traversierung auf rechtem Teilbaum von Wurzel w
Post-Order-Traversierung (L, R, w)
1
Post-Order-Traversierung auf linkem Teilbaum von Wurzel w
2
Post-Order-Traversierung auf rechtem Teilbaum von Wurzel w
3
Besuche Wurzel w
Traversierungen von Bäumen (Aufgabe)
1
Welche der drei Traversierungen ist geeignet um die Schlüssel eines
Suchbaumes in sortierter Reihenfolge auszugeben?
2
Ein Suchbaum enthalte die Schlüssel 1, 3, 4, 7, 9, 13, 20, 22.
In der Pre-Order-Traversierung (w, L, R) werden die Schlüssel in der
folgenden Reihenfolge besucht: 4, 1, 3, 20, 9, 7, 13, 22.
Geben Sie den Suchbaum an.
AVL-Bäume (Definition)
AVL-Baum:
Binärer Suchbaum mit Height Constraint
Height Constraint:
Für alle Knoten v unterscheiden sich die Höhe des linken und des rechten
Teilbaums um maximal 1.
AVL-Bäume (Einfügen)
Einfügen eines Schlüssels:
1
Knoten einfügen (wie bei Suchbäumen)
2
Balancen berechnen:
Beginnend bei eingefügtem Knoten bis zur ersten Disbalance (+2 oder -2)
auf dem Pfad bis zu der Wurzel.
3
ggf. Rotation oder Doppelrotation um diese Disbalance auszugleichen
4
fertig (maximal eine Rotation oder Doppelrotation nötig)
AVL-Bäume (Entfernen)
Entfernen eines Schlüssels:
1
Knoten entfernen (wie bei Suchbäumen)
2
Balancen berechnen:
Beginnend bei entferntem Knoten (das ist ggf. der symmetrische
Vorgänger/Nachfolger) bis zur ersten Disbalance (+2 oder -2) auf dem
Pfad bis zu der Wurzel.
3
ggf. Rotation oder Doppelrotation um diese Disbalance auszugleichen
4
Wiederhole 2. und 3. (ab dem Knoten, wo vorher die Disbalance war),
solange bis Wurzel erreicht wurde.
(Es können mehrere Rotatationen oder Doppelrotationen nötig sein.)