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