Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen 186.172 Algorithmen und Datenstrukturen 1 VL 4.0 2. Übungstest WS 2007 11. Jänner 2008 Machen Sie die folgenden Angaben bitte in deutlicher Blockschrift: Nachname: Vorname: Matrikelnummer: Studienkennzahl: Anzahl abgegebener Zusatzblätter: Legen Sie bitte Ihren Studentenausweis vor sich auf das Pult. Sie können die Lösungen entweder direkt auf die Angabeblätter oder auf Zusatzblätter schreiben, die Sie auf Wunsch von der Aufsicht erhalten. Es ist nicht zulässig, eventuell mitgebrachtes eigenes Papier zu verwenden. Die Verwendung von Taschenrechner, Mobiltelefonen, Skripten, Büchern, Mitschriften, Ausarbeitungen oder vergleichbaren Hilfsmitteln ist unzulässig. Die Arbeitszeit beträgt 55 Minuten. Erreichbare Punkte: A1: A2: A3: Summe: 18 15 17 50 Erreichte Punkte: Viel Erfolg! Aufgabe 1.A: Lineare Listen (18 Punkte) Die Waggons eines Zuges A werden als Elemente ai einer doppelt verketteten Linearen Liste gespeichert. Die Zeiger A.begin bzw. A.end verweisen auf den ersten bzw. letzten Waggon des Zuges. A.begin Zug A a1 ··· an−1 A.end an−1 a1 an an ··· Schreiben Sie detaillierten Pseudocode inklusive aller notwendigen Zeigeroperationen für eine Prozedur split and concat(A, x, B), welche die ersten x Waggons des Zuges A vorne an den Zug B hängt. Zug A a1 ··· an ··· b1 Zug B bm split and concat(A, x, B) Zug A ax+1 ··· an Zug B a1 ··· ax b1 ··· bm Beachten Sie folgende Punkte: • Ein Listenelement a speichert neben verschiedenen anderen Daten jeweils einen Zeiger auf seinen Vorgänger (a.pred) und Nachfolger (a.next). Es gilt: A.begin→pred = A.end→next = NULL. • Besteht Zug A aus weniger als x + 1 Waggons, dann darf die Aktion nicht durchgeführt werden (Fehlermeldung). • Die Länge einer Liste kann nur durch selbständiges Abzählen der Listenelemente bestimmt werden. • Achten Sie darauf, dass der Algorithmus so effizient wie möglich ist. • Sie können davon ausgehen, dass beide Züge aus jeweils zumindest einem Waggon bestehen. Aufgabe 2.A: Hash-Verfahren (15 Punkte) a) (3 Punkte) Welchen Nachteil haben Offene Hashverfahren gegenüber der Methode mit Verkettung der Überläufer ? b) (8 Punkte) Gegeben sei eine Hashtabelle H (m = 8) mit den Einträgen T [2] = 10, T [6] = 6 und T [7] = 23. 10 6 23 Fügen Sie nun die Zahlen 14, 9, 18 und 19 in genau dieser Reihenfolge mittels Double Hashing unter der Verwendung der Verbesserung nach Brent in H ein. Verwenden Sie dazu die folgenden Hashfunktionen: h1 (k) = k mod 8 h2 (k) = 1 + (k mod 5) Geben Sie alle Zwischenschritte, d.h. alle Werte der Hashfunktion h(k, i) bei der Sondierung, an und tragen Sie die konkrete Belegung von H nach jeder Einfügeoperation in die hier zur Verfügung gestellten leeren Tabellen ein: c) (4 Punkte) Bei der Erstellung einer Hashtabelle gilt es, einige Parameter geschickt zu wählen, unter anderem die Tabellengröße oder die verwendeten Hashfunktionen. Welche Parameter sind bei der Hashtabelle H aus Punkt b) problematisch? Begründen Sie Ihre Antwort kurz in maximal 2-3 Sätzen. Aufgabe 3.A: Suchbäume (17 Punkte) a) (4 Punkte) Welche Durchmusterungsreihenfolgen für binäre Suchbäume sind Ihnen bekannt? In welcher Reihenfolge werden dabei jeweils die Wurzel eines Baumes sowie deren linker/rechter Unterbaum besucht? Welche Durchmusterungsreihenfolge(n) führt bzw. führen zu einer aufsteigend sortierten Ausgabe der gespeicherten Schlüssel? b) (4 Punkte) Welche der vier Bäume sind AVL-Bäume? Markieren Sie deutlich alle Knoten, in denen eine notwendige Bedingung verletzt ist. r f c g b A: m e i k j h d a AVL-Baum: ¤ ja B: ¤ nein C: 1 5 AVL-Baum: ¤ ja ¤ nein 3 4 2 8 1 D: 3 AVL-Baum: ¤ ja q l 7 4 t p n 6 2 s o ¤ nein 6 5 7 AVL-Baum: ¤ ja 8 ¤ nein c) (3 Punkte) Wie viele Schlüssel kann ein B-Baum der Ordnung 3 und Höhe 2 minimal bzw. maximal in seinen Knoten – mit Ausnahme der Blätter (Vorsicht: Blätter zählen aber zur Höhe des Baumes) – aufnehmen? Begründen Sie Ihre Antwort kurz! d) (6 Punkte) Fügen Sie nacheinander die Werte h4, 10, 9, 13, 22, 24i in einen anfangs leeren AVL-Baum ein. Skizzieren Sie alle dafür notwendigen Rotationen. Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen 186.172 Algorithmen und Datenstrukturen 1 VL 4.0 2. Übungstest SS 2008 6. Juni 2008 Machen Sie die folgenden Angaben bitte in deutlicher Blockschrift: Nachname: Vorname: Matrikelnummer: Studienkennzahl: Anzahl abgegebener Zusatzblätter: Legen Sie bitte Ihren Studentenausweis vor sich auf das Pult. Sie können die Lösungen entweder direkt auf die Angabeblätter oder auf Zusatzblätter schreiben, die Sie auf Wunsch von der Aufsicht erhalten. Es ist nicht zulässig, eventuell mitgebrachtes eigenes Papier zu verwenden. Die Verwendung von Taschenrechnern, Mobiltelefonen, Skripten, Büchern, Mitschriften, Ausarbeitungen oder vergleichbaren Hilfsmitteln ist unzulässig. Die Arbeitszeit beträgt 55 Minuten. Erreichbare Punkte: A1: A2: A3: Summe: 16 16 18 50 Erreichte Punkte: Viel Erfolg! Aufgabe 1.A: Hashverfahren (16 Punkte) a) (7 Punkte) Gegeben ist eine Hashtabelle mit Tabellengröße m = 13 und der Hashfunktion h′ (k) = k mod 13. Zur Kollisionsbehandlung wird quadratisches Sondieren mit den Konstanten c1 = 3 und c2 = 2 verwendet. • Fügen Sie den Wert 18 in die folgende Tabelle ein: 0 1 2 3 4 5 6 7 8 9 10 30 32 20 11 12 25 • Fügen Sie den Wert 17 in die folgende Tabelle ein: 0 1 2 3 4 5 6 7 8 9 10 30 32 20 11 12 25 • Fügen Sie den Wert 7 in die folgende Tabelle ein: 7 8 9 0 1 2 3 4 5 6 30 32 20 11 12 25 10 b) (9 Punkte) Gegeben ist eine Hashtabelle mit Tabellengröße m = 7, die Double Hashing mit der Verbesserung nach Brent benutzt mit h1 (k) = k mod 7 h2 (k) = (2k + 1) mod 5 • Fügen Sie den Wert 21 in die folgende Tabelle ein: 0 1 2 3 4 5 6 14 24 19 • Fügen Sie den Wert 5 in die folgende Tabelle ein: 0 1 2 3 4 5 6 14 24 19 • Welches Problem kann beim Einfügen in die Hashtabelle bei der Verwendung der oben angegebenen Hashfunktionen auftreten? Wie müssen die Funktionen h1 (k) und/oder h2 (k) abgeändert werden, um dieses Problem zu beheben? Aufgabe 2.A: Suchverfahren (16 Punkte) a) (12 Punkte) • Schreiben Sie detaillierten Pseudocode für eine effiziente rekursive Prozedur, die die Höhe x.heigth und die Balancierung x.bal jedes Knotens x eines natürlichen binären Suchbaumes T berechnet. Geben Sie unter Umständen notwendige Initialisierungen an sowie den ersten Aufruf mit allen Parametern, um die Rekursion zu starten. Auf die Wurzel des Baumes kann mithilfe von T zugegriffen werden. Zu jedem Knoten x werden folgende Daten gespeichert: x.key: x.lef t: x.right: x.heigth: x.bal: Schlüssel von x Verweis auf linkes Kind von x Verweis auf rechtes Kind von x Höhe des Teilbaumes mit Wurzel x Balancierung des Teilbaumes mit Wurzel x Hinweis: Die Werte x.heigth und x.bal sind zu Beginn nicht initialisiert, sondern sollen von Ihrer Prozedur berechnet werden! • Geben Sie die Laufzeit ihres Algorithmus in Θ-Notation in Abhängigkeit der Anzahl der Knoten n an. • Auf welchem aus der Vorlesung bekannten allgemeinen Verfahren basiert ihre Implementierung? b) (4 Punkte) • Fügen Sie folgende Werte in genau dieser Reihenfolge in einen Anfangs leeren natürlichen binären Suchbaum ein. Zeichnen Sie lediglich den resultierenden Baum, Zwischenschritte müssen nicht angegeben werden. h34, 15, 50, 7, 30, 40, 80, 3, 10, 20, 33, 38, 99i • Handelt es sich bei dem resultierenden Baum um einen gültigen AVL-Baum? Begründen Sie Ihre Antwort. Aufgabe 3.A: Graphen (18 Punkte) Gegeben ist die folgende Adjazenzmatrix eines ungerichteten Graphen G: A B C D E F G H I J A B 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 C D 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 E F G 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 H 0 0 0 0 1 0 0 0 0 1 I J 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 a) (4 Punkte) Zeichnen Sie den Graphen G in die gegebene Vorlage ein und geben Sie G in Adjazenzlistendarstellung an. Kreuzen Sie außerdem die zutreffenden Eigenschaften des Graphen G an: ist Baum ist Wald ist zusammenhängend enthält Kreis b) (4 Punkte) Ein ungerichteter Graph heißt bipartit, wenn man die Knotenmenge V in zwei disjunkte Teilmengen U und W so aufspalten kann, dass für alle Kanten (u, w) aus der Kantenmenge E gilt: u ∈ U und w ∈ W . Ist der Graph G bipartit? Wenn ja, markieren Sie die Knoten von G entsprechend mit U und V . Wenn nein, geben Sie eine beliebige aber möglichst kleine Teilmenge von Knoten an, die einen Konflikt verursachen. Begründen Sie Ihre Antwort. c) (10 Punkte) Kreuzen Sie an, ob die unten angegebenen Listen einer möglichen Abarbeitungsreihenfolge der Knoten bei einer Tiefen- oder Breitensuche entsprechen (Hinweis: Auch Mehrfachnennungen sind möglich und nur vollständig richtige Zeilen werden gewertet!). Tiefensuche A, J, E, H, G, D, B, F, C, I C, F, I, B, D, H, J, G, A, H A, G, J, E, H, B, D, C, I, F G, E, H, J, A, F, I, C, D, B A, B, C, D, E, F, G, H, I, J Breitensuche Keines Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen 186.172 Algorithmen und Datenstrukturen 1 VL 4.0 2. Übungstest WS 2008 16. Jänner 2009 Machen Sie die folgenden Angaben bitte in deutlicher Blockschrift: Nachname: Vorname: Matrikelnummer: Studienkennzahl: Anzahl abgegebener Zusatzblätter: Legen Sie bitte Ihren Studentenausweis vor sich auf das Pult. Sie können die Lösungen entweder direkt auf die Angabeblätter oder auf Zusatzblätter schreiben, die Sie auf Wunsch von der Aufsicht erhalten. Es ist nicht zulässig, eventuell mitgebrachtes eigenes Papier zu verwenden. Die Verwendung von Taschenrechnern, Mobiltelefonen, Skripten, Büchern, Mitschriften, Ausarbeitungen oder vergleichbaren Hilfsmitteln ist unzulässig. Die Arbeitszeit beträgt 55 Minuten. Erreichbare Punkte: A1: A2: A3: Summe: 16 19 15 50 Erreichte Punkte: Viel Erfolg! Aufgabe 1.A: Hashverfahren (16 Punkte) a) (8 Punkte) Gegeben ist jeweils eine Hashtabelle mit Tabellengröße m = 7, die Double Hashing mit der Verbesserung nach Brent benutzt mit h1 (k) = k mod 11 h2 (k) = 2 + (k mod 5). • Fügen Sie den Wert 7 in die folgende Tabelle ein: 0 1 2 3 4 5 6 22 4 • Fügen Sie den Wert 14 in die folgende Tabelle ein: 0 1 2 3 4 5 6 2 10 15 • Sind die gegebene Tabellengröße sowie die beiden Hashfunktionen eine gute Wahl oder können dabei Probleme auftreten? Begründen Sie Ihre Antwort kurz. b) (8 Punkte) Betrachten Sie die folgende Hashtabelle der Größe 5: Index Element Status 0 4 W 1 F 2 7 B 3 3 B 4 12 B Die Hashfunktion, die zum Einfügen der Elemente verwendet wurde, lautet h(k) = k mod 5 und als Kollisionsbehandlung wurde lineares Sondieren mit der Schrittweite 1 verwendet. In der Zeile Status steht F für frei, W für wieder frei und B für besetzt. In die leere Hashtabelle wurden zu Beginn die Elemente mit den Schlüsseln 3, 7 und 12 eingefügt (nicht notwendigerweise in dieser Reihenfolge) und in weiterer Folge nicht wieder entfernt. Über weitere Einfüge- und Löschoperationen anderer Schlüssel danach gibt es keine genauen Angaben. Kreuzen Sie an, ob die folgenden Aussagen wahr oder falsch sind: Wahr Falsch Es wurde nie ein Schlüssel gelöscht. Es ist möglich, dass 1 eingefügt und wieder gelöscht wurde. 7 wurde definitiv vor 12 eingefügt. Es ist möglich, dass 12 vor 3 eingefügt wurde. Ein Element mit Schlüssel 5 würde aktuell in der Hashtabelle an Index 1 eingefügt werden. Aufgabe 2.A: Suchverfahren (19 Punkte) a) (10 Punkte) • Schreiben Sie detaillierten Pseudocode für eine Funktion, die die RechtsRotation für einen Teilbaum mit Wurzel u (wird als Parameter übergeben) innerhalb eines AVL-Baumes durchführt. Als Rückgabewert soll ihre Funktion den neuen Wurzelknoten des rebalancierten Teilbaumes zurückliefern. Zu jedem Knoten x werden folgende Daten gespeichert: x.key: x.parent: x.lef t: x.right: x.height: Schlüssel von x Verweis auf Vaterknoten von x Verweis auf linkes Kind von x Verweis auf rechtes Kind von x Höhe des Teilbaumes mit Wurzel x Hinweis: Beachten Sie, dass Ihre Rebalancierungsfunktion so ausgelegt ist, dass alle oben angeführten Daten eines Knotens nach der Rebalancierung korrekt sind! • Geben Sie die Laufzeit ihres Algorithmus in Θ-Notation in Abhängigkeit einer geeigneten Größe an. b) (9 Punkte) • Fügen Sie folgende Werte in genau dieser Reihenfolge in einen Anfangs leeren B-Baum der Ordnung 3 ein. Zeichnen Sie lediglich den resultierenden B-Baum, Zwischenschritte müssen nicht unbedingt angegeben werden. h42, 1, 19, 10, 11, 7, 32, 3, 13i • Löschen Sie nun die Schlüssel 32 und 19 in genau dieser Reihenfolge aus dem B-Baum und zeichnen Sie jeweils den resultierenden B-Baum, Zwischenschritte der Löschoperationen müssen nicht angegeben werden. • Geben Sie die Laufzeit in Θ-Notation in Abhängigkeit der Anzahl der gespeicherten Elemente n für das Suchen eines Schlüssels k in einem B-Baum der Ordnung 5 an. Aufgabe 3.A: Graphen (15 Punkte) Gegeben ist die folgende Adjazenzmatrix eines ungerichteten Graphen G: A B C D E F G H A ∞ ∞ 1 3 6 ∞ 12 ∞ B ∞ ∞ ∞ ∞ 9 11 ∞ ∞ C 1 ∞ ∞ ∞ ∞ ∞ 4 ∞ D 3 ∞ ∞ ∞ 5 ∞ 2 ∞ E 6 9 ∞ 5 ∞ ∞ 7 13 F ∞ 11 ∞ ∞ ∞ ∞ ∞ 8 G 12 ∞ 4 2 7 ∞ ∞ 10 H ∞ ∞ ∞ ∞ 13 8 10 ∞ a) (2 Punkte) Zeichnen Sie den Graphen G in die gegebene Vorlage ein und geben Sie die Adjazenzliste des Knotens E an. Die Zahlen in der Matrix bezeichnen die Kantenkosten. Ein ∞ bedeutet, dass keine Kante zwischen den entsprechenden Knoten existiert. b) (7 Punkte) Führen Sie in dem Graphen G den Algorithmus von Kruskal zum Finden eines minimalen Spannbaums durch. Notieren Sie die genaue Reihenfolge, in der die Kanten in den Baum aufgenommen wurden (die Liste der Kanten ist ausreichend, der MST muss nicht gezeichnet werden). Falls Sie einen Startknoten benötigen, verwenden Sie dazu den Knoten A. c) (3 Punkte) Ist der resultierende minimale Spannbaum aus Punkt (b) eindeutig? Liefern die Algorithmen von Kruskal und Prim im Allgemeinen immer den selben minimalen Spannbaum (bezogen auf Gesamtkosten und Kanten)? Begründen Sie Ihre Antwort kurz! d) (3 Punkte) Nehmen Sie an, Sie programmieren einen Algorithmus für ungerichtete Graphen, bei denen kein Knoten mehr als 5 Nachbarn besitzt. Welche Darstellungsform für den Graphen ist aus Effizienzgründen zu wählen: Adjazenzmatrix oder -liste? Begründen Sie Ihre Antwort, indem Sie für beide Datenstrukturen eine Abschätzung des Aufwands zum Finden aller Nachbarn eines Knotens v ∈ V in Θ-Notation angeben, jeweils in Abhängigkeit einer dafür geeigneten Größe. Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen 186.172 Algorithmen und Datenstrukturen 1 VL 4.0 2. Übungstest SS 2009 09. Juni 2009 Machen Sie die folgenden Angaben bitte in deutlicher Blockschrift: Vorname: Nachname: Matrikelnummer: Studienkennzahl: Anzahl abgegebener Zusatzblätter: Legen Sie bitte Ihren Studentenausweis vor sich auf das Pult. Sie können die Lösungen entweder direkt auf die Angabeblätter oder auf Zusatzblätter schreiben, die Sie auf Wunsch von der Aufsicht erhalten. Es ist nicht zulässig, eventuell mitgebrachtes eigenes Papier zu verwenden. Die Verwendung von Taschenrechnern, Mobiltelefonen, Skripten, Büchern, Mitschriften, Ausarbeitungen oder vergleichbaren Hilfsmitteln ist unzulässig. Die Arbeitszeit beträgt 55 Minuten. Erreichbare Punkte: A1: A2: A3: Summe: 18 16 16 50 Erreichte Punkte: Viel Erfolg! Aufgabe 1.A: Graphen (18 Punkte) a) (12 Punkte) Ein ungerichteter Graph G = (V, E) heißt bipartit, wenn man die gesamte Knotenmenge V in zwei disjunkte Untermengen U und W so aufspalten kann, dass für alle Kanten (u, w) ∈ E gilt: u ∈ U und w ∈ W . Schreiben Sie einen möglichst effizienten Algorithmus, der berechnet, ob ein Graph G bipartit ist. Geben Sie weiters die Laufzeit ihres Algorithmus in Abhängigkeit der Anzahl der Knoten n im Worst-Case an. b) (6 Punkte) Auf dem gegebenen Graphen wird die aus dem Skriptum bekannte Tiefensuche durchgeführt. Welche der folgenden Listen von besuchten Knoten können dabei in genau dieser Reihenfolge entstehen. Hinweis: Die Nachbarn eines Knotens können in beliebiger Reihenfolge abgearbeitet werden. Reihenfolge: A B C D E F G H I K ja nein Reihenfolge: A B D C G H I K F E ja nein Reihenfolge: B A D C G H I K F E ja nein Reihenfolge: A B C D H K F E I H ja nein Reihenfolge: K E F H I G C D A B ja nein Reihenfolge: C G I K E F H B D A ja nein Aufgabe 2.A: Optimierung (16 Punkte) Gegeben ist der folgende gewichtete ungerichtete Graph G: a) (6 Punkte) Führen Sie in dem Graphen G den Algorithmus von Prim zum Finden eines minimalen Spannbaums durch (die Zahlen bei den Kanten bezeichnen die jeweiligen Kantenkosten). Zeichnen Sie den Spannbaum direkt im Graphen ein und notieren Sie die genaue Reihenfolge, in der die Kanten in den Baum aufgenommen wurden. Falls Sie einen Startknoten benötigen, verwenden Sie dazu den Knoten B. b) (10 Punkte) Gegeben Sei folgender Algorithmus WasBinIch, der auf einen Graphen G(V, E) angewendet wird und zusätzlich zwei Knoten s, t ∈ V als Parameter erhält. Algorithmus 1 WasBinIch(G(V, E), s, t) 1: fuer alle v ∈ V : d[v] = ∞; 2: d[s] = 0; Q = V ; 3: solange Q nicht leer { 4: Entnimm jenes u aus Q mit minimalem d[u]; 5: falls d[u] = ∞ dann Ausgabe: Fehler & Abbruch des Algorithmus; 6: falls u = t dann Ausgabe: d[t] & Abbruch des Algorithmus; 7: für alle e = (u, v) mit v ∈ N (u) { 8: falls d[v] > d[u] + we dann { 9: d[v] = d[u] + we ; 10: } 11: } 12: } • Beschreiben Sie kurz, was der Algorithmus WasBinIch in einem Graphen berechnet und auf welchem aus der Vorlesung bekannten Prinzip dieser Algorithmus beruht. • Wenden Sie diesen Algorithmus auf den oben angeführten Graphen G an (die Kantenbeschriftungen entsprechen dem Kantengewicht we zwischen den verbundenen Knoten). Geben Sie die Ausgabe des Algorithmus an, wenn dieser durch den Aufruf von WasBinIch (G(V, E), D, A) gestartet wird. Tragen Sie weiters den Zustand des Feldes d nach der Ausführung des Algorithmus in folgender Tabelle ein: v∈V A B C D E F G d[v] Aufgabe 3.A: Hash und Suchverfahren (16 Punkte) a) (8 Punkte) Gegeben ist ein Feld, das die folgenden Strings in der angegebenen Reihenfolge enthält: halgodat, alt, hans, haselnuss, heinz, herbert, opa, petzii. Führen Sie in diesem Feld eine Binärsuche nach dem String petzi durch. Geben Sie dabei in jedem Schritt die jeweiligen Bereichsgrenzen an. Das erste Element des Feldes hat Index 1, falls notwendig wird bei Indexberechnungen abgerundet. Geben Sie die Laufzeit des Worst-Case für das Suchen eines Strings mit Binärsuche innerhalb einer sortierte Folge in Θ-Notation an, und zwar in Abhängigkeit der Anzahl der Elemente n und der maximalen Stringlänge k. b) (8 Punkte) Gegeben ist eine Hashtabelle mit Tabellengröße m = 7, die zur Kollisionsbehandlung Double Hashing einsetzt. h1 (k) = k mod 7 h2 (k) = (k + 1) mod 7 • Fügen Sie den Wert 14 in die folgende Tabelle ein: 0 1 2 3 4 5 6 21 24 12 • Fügen Sie den Wert 12 in die folgende Tabelle ein: 0 1 2 3 4 5 6 7 3 11 5 • Welches Problem kann beim Einfügen in die Hashtabelle bei der Verwendung der oben angegebenen Hashfunktionen auftreten? Wie müssen die Funktionen h1 (k) und/oder h2 (k) abgeändert werden, um dieses Problem zu beheben?