7. Übungsblatt zu Algorithmen I im SoSe 2016
Transcription
7. Übungsblatt zu Algorithmen I im SoSe 2016
Prof. Dr. Dennis Hofheinz Lukas Barth, Lisa Kohl K a r l s ru h e r I n s t i t u t f ü r T e c h n o l o g i e Institut für Theoretische Informatik 7. Übungsblatt zu Algorithmen I im SoSe 2016 https://crypto.iti.kit.edu/index.php?id=algo-sose16 {lisa.kohl,lukas.barth}@kit.edu Musterlösungen Aufgabe 1 (Binäre Heaps, 2 Punkte) Nehmen Sie die letzten 4 Ziffern Ihrer Matrikelnummer und bilden Sie daraus alle möglichen binären Min-Heaps. Stellen Sie dabei die Heaps als implizites Feld dar. Musterlösung: Wir verwenden beispielhaft die Matrikelnummer 1579534. Alle möglichen impliziten Heaps sind: h3, 4, 5, 9i, h3, 5, 4, 9i und h3, 4, 9, 5i. Aufgabe 2 (Radixsort, 3 Punkte) Führen Sie Least-Significant-Digit (LSD) Radixsort mit Dezimalziffern (Radix K = 10) auf dem folgenden Array durch. Verwenden Sie dazu als Untermethode die Methode KSortArray. Tragen Sie nach jeder Runde das Array in eine der Schablonen ein, markieren Sie die Bucketgrenzen der Ziffern durch Trennstriche im Array. Geben Sie zusätzlich jeweils den Zustand des Hilfsarrays c nach Durchlauf der zweiten for-Schleife in der Methode KSortArray an (vergleiche Vorlesung 30.05, Folie 5, c := [1, 3, 5, 6]). Eingabe: 1 31 2 3 4 5 6 13 64 52 91 69 7 8 19 7 9 10 11 12 13 14 15 16 57 29 58 78 9 91 11 44 13 14 Musterlösung: Hilfsarray c: 0 1 2 3 4 5 6 7 1 1 5 6 7 9 9 9 7 8 8 9 11 13 Ergebnis nach der 1. Runde: 1 31 2 3 4 5 6 91 91 11 52 13 64 44 9 10 11 12 7 57 58 78 15 16 69 19 29 9 13 16 Hilfsarray c: 0 1 2 3 4 5 1 3 6 7 8 9 6 7 8 9 12 14 15 15 Ergebnis nach der 2. Runde: 1 2 7 9 3 4 5 6 11 13 19 29 7 8 9 10 11 12 31 44 52 57 58 64 1 14 15 69 78 91 91 Aufgabe 3 ((a, b)-Bäume, 6 Punkte) Führen Sie auf dem folgenden (2, 5)-Baum die geforderten Operationen in der angegebenen Reihenfolge durch. Zeichnen Sie den Endzustand des Baums nach jeder der angegebenen Operationen. 23 30 50 75 1 2 10 1 2 10 23 29 31 42 47 58 73 86 92 98 29 30 31 42 47 50 58 73 75 86 92 98 ∞ a) Einfügen von 43, Einfügen von 45, Einfügen von 38. b) Beginnen Sie wieder beim Ausgangszustand. Löschen von 50, Löschen von 29, Löschen von 47. Musterlösung: a) Originalzustand 23 30 50 75 1 2 10 1 2 10 23 29 31 42 47 58 73 86 92 98 29 30 31 42 47 50 58 73 75 86 92 98 ∞ nach Einfügen von 43 23 30 50 75 1 2 10 1 2 10 23 29 31 42 43 47 58 73 86 92 98 29 30 31 42 43 47 50 58 73 75 86 92 98 ∞ nach Einfügen von 45 43 23 30 1 2 10 1 2 10 23 50 75 29 31 42 45 47 58 73 86 92 98 29 30 31 42 43 45 47 50 58 73 75 86 92 98 ∞ nach Einfügen von 38 43 23 30 1 2 10 1 2 10 23 50 75 29 31 38 42 45 47 58 73 86 92 98 29 30 31 38 42 43 45 47 50 58 73 75 86 92 98 ∞ 2 b) Originalzustand 23 30 50 75 1 2 10 1 2 10 23 29 31 42 47 58 73 86 92 98 29 30 31 42 47 50 58 73 75 86 92 98 ∞ nach Löschen von 50 23 30 47 75 1 2 10 1 2 10 23 29 31 42 58 73 86 92 98 29 30 31 42 47 58 73 75 86 92 98 ∞ nach Löschen von 29 30 47 75 1 2 10 23 1 2 10 23 30 31 42 58 73 86 92 98 31 42 47 58 73 75 86 92 98 ∞ 31 58 73 86 92 98 31 42 58 73 75 86 92 98 ∞ nach Löschen von 47 30 42 75 1 2 10 23 1 Aufgabe 4 2 10 23 30 (d-äre Heaps, 1 + 2 + 1 + 3 Punkte) In Vorlesung und Übung sind binäre Min-Heaps vorgestellt worden, also Heaps, bei dem jeder innere Knoten zwei größere (oder gleichgroße) Kinder hat. Analog dazu definieren wir einen d-ären Min-Heap als einen Min-Heap, bei dem jeder innere Knoten d größere (oder gleichgroße) Kinder hat. a) Sei zunächst d = 3. Erstellen Sie einen 3-ären Min-Heap aus folgenden Zahlen: 7, 59, 13, 47, 3, 17, 73, 19, 91, 71, 37, 83, 41 b) Sei nun wieder d unbestimmt. Wie würden Sie allgemein einen d-ären Min-Heap als Array darstellen? Geben Sie Funktionen zum Finden der Kinder und des Elternknotens eines Elements an. c) Wie ist die Höhe eines d-ären Heaps mit n Elementen? d) Geben Sie eine effiziente Implementation von deleteMin für einen d-ären Heap in Pseudocode an. Sie dürfen hierzu die Funktionen aus Teilaufgabe b) benutzen. Geben Sie die Laufzeit von deleteMin bezüglich n und d an. 3 Musterlösung: a) als Array zum Beispiel h3, 7, 13, 17, 19, 37, 41, 47, 59, 71, 73, 83, 91i in Baumdarstellung zum Beispiel 3 7 13 17 19 37 41 47 59 71 73 83 91 b) Analog zum binären Heap kann ein d-ärer Heap als Array A[1...n] repräsentiert werden. Die Kinder von A[1] sind A[2], A[3], . . . , A[d + 1], die Kinder von A[2] sind A[d + 2], A[d + 3], . . . , A[2d + 1] und so weiter. Allgemein gilt CHILDREN(i) = {di − d + 2, di − d + 3, . . . , di, di + 1}. Der Elternknoten von A[1] ist A[1]. Der Elternknoten von A[i] für 2 ≤ i ≤ d + 1 ist A[1]. Der Elternknoten von A[i] für d + 2 ≤ i ≤ 2d + 1 ist A[2]. Allgemein gilt i−1 . PARENT(i) = d c) Die Anzahl von Knoten in Level h ist höchstens hd. Die Anzahl von Knoten in einem Baum von Höhe h ist damit höchstens 1 + d + · · · + dh = Θ dh . Damit ergibt sich für n Elemente eine Höhe von Θ(logd n). d) Bei d-ären Heaps funktioniert deleteMin genauso wie bei binären Heaps, siehe z.B. die Vorlesungsfolien. Angepasst werden muss hier siftDown: Procedure siftDown(i : N) if d · i ≤ n then minChildIndex := CHILDREN(i)[0] for j in CHILDREN(i) do if h[j] < h[minChildIndex] then minChildIndex := j if h[i] > h[minChildIndex] then swap(h[i], h[minChildIndex]) siftDown(minChildIndex) – – i is not a leaf – – find minimum child – – heap property violated Für die Laufzeit von siftDown gilt: In jeder Ebene muss O(d) Arbeit für das Finden des minimalen Kindes verrichtet werden. Insgesamt ergeben sich logd (n) Ebenen. Somit hat siftDown die Laufzeitkomplexität O(logd (n) · d), was auch die Laufzeit von deleteMin bestimmt. 4