5. ¨Ubungsblatt zu Algorithmen I im SS 2015

KIT
Jun.-Prof. Henning Meyerhenke, Jun.-Prof. Dennis Hofheinz
Institut f¨
ur Theoretische Informatik
Christian Staudt, Christoph Striecks
¨
5. Ubungsblatt
zu Algorithmen I im SS 2015
https://crypto.iti.kit.edu/algo-sose15
{staudt,striecks}@kit.edu
Mit L¨
osungsvorschl¨
agen
Aufgabe 1
(Kombinatorik, 1 + 2 + 1 Punkte)
Aus der Vorlesung Grundbegriffe der Informatik wissen Sie, dass ein Wort w u
¨ber einem Alphabet Σ
eine Folge von Zeichen aus Σ ist.
a) Sei Σ = {x, y, z} gegeben. Betrachten Sie das Wort w1 = zxyx ∈ Σ4 . Wie viele verschiedene
W¨orter k¨
onnen durch Umstellen der Zeichen von w1 konstruiert werden? Geben Sie alle W¨
orter
an.
b) Sei Σ = {1, . . . , j}, f¨
ur j ∈ N, gegeben. Betrachten Sie das Wort w2 ∈ Σn , f¨
ur n ∈ N0 . Wie viele
verschiedene W¨
orter k¨
onnen durch Umstellen der Zeichen von w2 konstruiert werden? Begr¨
unden
Sie Ihre Antwort. Hinweis: 0! = 1.
c) Sei Σ = {A, b, g, h, i, l, m , n, o, r, t} gegeben. Betrachten Sie die W¨orter w3 = Algorithmen ∈
Σ11 und w4 = lAghhbAArAA ∈ Σ11 . Wie viele verschiedene W¨orter k¨onnen durch Umstellen der
Zeichen von w3 und w4 jeweils konstruiert werden? Tipp: Versuchen Sie nicht, alle anzugeben.
Nutzen Sie das Ergebnis aus b).
L¨
osungsvorschlag:
zxyx
a) Wir erhalten 12 verschiedene W¨
orter: zxxy
zyxx
xzyx
xzxy
yzxx
xyzx
xxzy
yxzx
xyxz
xxyz
yxxz.
b) Es gibt n! Permutationen von w2 . Durch das Mehrfachauftreten der Buchstaben sind diese aber
zum Teil untereinander identisch. F¨
ur eine feste Permutation gibt es nc ! M¨oglichkeiten, die nc
Zeichen c ∈ Σ an den gleichen Stellen zu permutieren, ohne das Wort zu ver¨andern. Daher m¨
ussen
wir durch diese Anzahl teilen und erhalten
n!
n1 ! · n2 ! · . . . · nj !
M¨oglichkeiten.
c) Die Anzahl der verschiedenen M¨
oglichkeiten f¨
ur w3 ergibt sich zu 11! = 39916800 und f¨
ur w4
erhalten wir 11!/(5!2!) = 11 · 10 · 9 · 8 · 7 · 3 = 166320. (Σ wurde hierbei um das Zeichen b erg¨
anzt.)
Aufgabe 2
(Sortieren, 1 + 1 + 2 + 2 Punkte)
Sortieren Sie die Ziffern Ihrer Matrikelnummer mittels den in den Teilaufgaben angegebenen Algorithmen
aus der Vorlesung. (Falls Sie zu zweit abgeben, gen¨
ugt eine von beiden.)
a) Bestimmen Sie die Anzahl von Inversionen in Ihrer Matrikelnummer.
1
b) Benutzen Sie Insertionsort. Geben Sie den Zustand des Feldes nach jedem Einf¨
uge-Schritt an.
c) Benutzen Sie Mergesort. Verwenden Sie das Schema aus dem Beispiel auf der Vorlesung-Folie
173.
d) Benutzen Sie Quicksort. Verwenden Sie das Schema aus dem Rekursions-Beispiel auf der VorlesungFolie 197. Als Pivot soll das erste Element verwendet werden.
L¨
osungsvorschlag:
Beispiel mit Matrikelnummer 1229203.
a) Diese Matrikelnummer hat 7 Inversionen.
b) 1 2,2,9,2,0,3
1,2 2,9,2,0,3
1,2,2 9,2,0,3
1,2,2,9 2 0,3
1,2,2,2,9 0,3
0,1,2,2,2,9 3
0,1,2,2,2,3,9
c) h1, 2, 2, 9, 2, 0, 3i
split
h1, 2, 2i h9, 2, 0, 3i
split
h1i h2, 2i h9, 2i h0, 3i
split
h1i h2i h2i h9i h2i h0i h3i
merge
h1i h2, 2i h2, 9i h0, 3i
merge
h1, 2, 2i h0, 2, 3, 9i
merge
h0, 1, 2, 2, 2, 3, 9i
d) 1 2 2 9 2 0 3
0|1|2 9 2 3 2
2 2|2|3 9
2|2| |3|9
Aufgabe 3
(Sortieralgorithmen sortieren – Doktor Meta l¨
asst gr¨
ußen, 2 Punkte)
Ordnen Sie die folgenden f¨
unf Sortieralgorithmen aufsteigend nach Average-case-Komplexit¨at: HeapSort, Merge-Sort, Quick-Sort, Insertion-Sort und Bucket-Sort f¨
ur Schl¨
usselwerte in O(n). Annotieren
Sie jeweils die Average-case-Komplexit¨
at.
Lo
¨sungsvorschlag:
Bucket-Sort O(n + |S|)
= O(n), Heap-Sort O(n log n), Merge-Sort O(n log n), Quick-Sort O(n log n),
2
Insertion-Sort O n .
2
Aufgabe 4
(In-place-Duplikaterkennung, 4 Punkte)
Gegeben ist ein Array A : Array[0..n − 1] der Gr¨oße n. Es enth¨alt Zahlen aus {0, . . . , n − 1}. Geben
Sie einen In-place-Algorithmus an, der eine Zahl ausgibt, die doppelt vorkommt oder ausgibt, dass
alle Zahlen verschieden sind. Die Laufzeit Ihres Algorithmus darf O(n) nicht u
¨ bersteigen. Geben Sie
auch die Best-Case-Laufzeit Ihres Algorithmus an. Hinweis: Es ist erlaubt, das urspr¨
ungliche Array
zu ver¨andern. F¨
ur einen In-place-Algorithmus steht nur O(1) zus¨atzlicher Speicher zur Verf¨
ugung.
L¨
osungsvorschlag:
1: procedure duplicates(A : Array [0..n − 1] of N, x ∈ N )
2:
for i = 0 to n − 1 do
3:
while A[i] 6= i
4:
if A[A[i]] == A[i] then print “Duplikat gefunden:”, A[i]; return
5:
else swap(A, i, A[i])
6:
print “keine Duplikate”
7: return
Die Best-Case-Laufzeit ist O(1). Erreicht wird diese zum Beispiel bei einem Array, das mit 0, 0, . . .
anf¨angt.
3