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.)