Diskrete Mathematik 1 - CITS - Ruhr-Universität Bochum
Diskrete Mathematik 1 - CITS - Ruhr-Universität Bochum
Diskrete Mathematik 1 - CITS - Ruhr-Universität Bochum
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Ruhr</strong>-<strong>Universität</strong> <strong>Bochum</strong><br />
Lehrstuhl für Kryptologie und IT-Sicherheit<br />
Prof. Dr. Alexander May<br />
M. Ritzenhofen, M. Mansour Al Sawadi, A. Meurer<br />
Lösungsblatt zur Vorlesung<br />
<strong>Diskrete</strong> <strong>Mathematik</strong> 1<br />
WS 2008/09<br />
Blatt 13 / 27. Januar 2009 / Abgabe bis 02. Februar 2009, 08.00 Uhr, in<br />
die Kästen auf NA 02<br />
AUFGABE 1 (4 Punkte):<br />
Geben Sie die folgende lineare Rekursionsgleichung in expliziter Form an, d.h. stellen Sie die<br />
Erzeugende Funktion auf und formen diese zu einer Reihendarstellung um, aus der Sie die<br />
explizite Darstellung der a n ablesen können:<br />
wobei a 0 = 0, a 1 = 1 .<br />
a n := 2a n−1 − a n−2 , n ≥ 2 ,<br />
Lösungsvorschlag:<br />
Verwenden der Rekursionsgleichung und der Anfangsbedingungen ergibt:<br />
∑<br />
a n x n = ∑ 2a n−1 x n − ∑ a n−2 x n + 1 · x + 0<br />
n≥0 n≥2 n≥2<br />
= 2x ∑ a n x n − x ∑ 2 a n x n + x<br />
n≥1<br />
n≥0<br />
( )<br />
∑<br />
= 2x a n x n − 0 − x ∑ 2 a n x n + x<br />
n≥0<br />
n≥0
Einsetzen von A(x) = ∑ n≥0 a nx n ergibt:<br />
A(x) = 2xA(x) − x 2 A(x) + x<br />
⇔ A(x) =<br />
x<br />
x 2 − 2x + 1<br />
= x − 1<br />
(x − 1) + 1<br />
2 (x − 1) 2<br />
=<br />
1<br />
(x − 1) + 1<br />
(x − 1) 2<br />
= − ∑ n≥0<br />
= ∑ n≥0<br />
nx n<br />
x n + ∑ n≥0<br />
(n + 1)x n<br />
Es gilt also a n = n.<br />
AUFGABE 2 (6 Punkte):<br />
Bestimmen Sie die asymptotischen oberen und unteren Schranken für T (n) unter der Annahme,<br />
dass T (n) konstant ist für n ≤ 2.<br />
(a) T (n) = 3T ( n<br />
2<br />
)<br />
+ n log n<br />
(b) T (n) = 2T ( n<br />
4<br />
)<br />
+<br />
√ n<br />
(c) T (n) = 9T ( n<br />
10)<br />
+ n<br />
(d) T (n) = T ( √ n) + 1<br />
Lösungsvorschlag:<br />
(a) Mit den Bezeichnungen des Master-Theorems ist hier f(n) = n log n, a = 3 und b = 2.<br />
Sei log 2 3 − 1 > δ > 0. Dann existiert ein n 0 ∈ N so, dass log n ≤ n δ gilt für alle n ≥ n 0 ,<br />
denn:<br />
log n<br />
lim<br />
n→∞ n δ<br />
= lim<br />
1<br />
n<br />
n→∞<br />
= lim<br />
δnδ−1 n→∞<br />
1<br />
δn δ = 0.<br />
Also folgt f(n) = n log n ≤ n 1+δ ≤ n log 2 3−ɛ für ein 0 < ɛ < log 2 3 − 1 − δ. Damit ist<br />
f(n) = O(n log 2 3−ɛ ) und mit dem Master-Theorem (Fall 1) folgt:<br />
T (n) = Θ(n log 2 3−ɛ ).<br />
(b) Mit den Bezeichnungen des Master-Theorems ist hier f(n) = √ n = n 1 2 , a = 2 und<br />
b = 4. Also ist f(n) = n 1 2 = n log 4 2 = Θ(n log 4 2 ). Mit dem Master-Theorem (Fall 2) folgt<br />
T (n) = Θ(n log 4 2 log n).
(c) Mit den Bezeichnungen des Master-Theorems ist hier f(n) = n, a = 9 und b = 10. Es<br />
gilt log 10 9 < 1. Also ist f(n) = n = Ω(n log 10 9+ɛ ) für ein 0 < ɛ < 1 − log 10 9. Außerdem<br />
gilt 9f( n ) = 9 n = 9 f(n) < f(n). Mit dem Master-Theorem (Fall 3) folgt daher<br />
10 10 10<br />
T (n) = Θ(n).<br />
(d) Auf diese Rekursion lässt sich das Master-Theorem nicht anwenden, so dass wir die<br />
Rekursion explizit durchführen.<br />
T (n) = T ( √ n) + 1<br />
= T (n 1 4 ) + 2 · 1<br />
= T (n 1<br />
2 j ) + j · 1<br />
Die Rekursion kann abgebrochen werden, sobald das Argument kleiner oder gleich 2<br />
ist, also falls n 1<br />
2 j ≤ 2. Dies ist äquivalent zu j ≥ log log n. Einsetzen ergibt:<br />
1<br />
T (n) = T (n 2 log log n ) + log log n · 1<br />
= Θ(1) + log log n<br />
= Θ(log log n).<br />
AUFGABE 3 (4 Punkte):<br />
Wir betrachten das Problem, n Dollar-Cent aus Münzen so zusammenzusetzen, dass möglichst<br />
wenige Münzen benötigt werden. Geben Sie einen Greedy-Algorithmus an, der eine solche Zusammensetzung<br />
aus Quarters (25Cent), Dimes (10Cent), Nickels (5Cent) und Pennys (1Cent)<br />
erstellt. Zeigen Sie, dass Ihr Algorithmus eine optimale Lösung ausgibt.<br />
Lösungsvorschlag:<br />
Algorithm 1 Optimize Coins<br />
Eingabe: n ∈ N<br />
c := [0, 0, 0, 0] % initialiere alle Anzahlen von Münzen mit 0<br />
while n ≥ 25 do<br />
c[1] ← c[1] + 1; n ← n − 25;<br />
end while<br />
while n ≥ 10 do<br />
c[2] ← c[2] + 1; n ← n − 10;<br />
end while<br />
while n ≥ 5 do<br />
c[3] ← c[3] + 1; n ← n − 5;<br />
end while<br />
c[4] ← n;<br />
Um die Korrektheit des Algorithmus zu zeigen, genügt es zu zeigen, dass eine optimale Lösung<br />
immer die Münze mit größtmöglichem Wert g enthalten muss. Induktiv folgt dann die Optimalität<br />
von c, da sich c aus einer optimalen Lösung für den Fall n − g und einer Münze mit
Wert g zusammensetzt. Sei also nun n die Eingabe des Algorithmus mit n ≥ 25 und c die<br />
optimale Lösung, n in wenigen Münzen darzustellen. Angenommen c[1] = 0, das heißt, in c<br />
komme kein Quarter vor.<br />
1.Fall: c[2] ≥ 3. Dann ersetze man 3 Dimes durch ein Quarter und ein Nickel und erhält eine<br />
Lösung mit weniger Münzen, was einen Widerspruch zur Optimalität von c bildet.<br />
2.Fall: c[2] = 2 und c[3] ≥ 1: Man ersetze zwei Dimes und ein Nickel durch ein Quater, was<br />
wiederum einen Widerspruch zur Optimalität von c bildet.<br />
3.Fall: c[2] = 2 und c[3] = 0: Wegen n ≥ 25 folgt dann c[4] ≥ 5 und man ersetze zwei Dimes<br />
und fünf Pennys durch ein Quater, wieder ein Widerspruch zur Optimalität von c.<br />
4.Fall: c[2] = 1: Dann gilt c[3] + c[4] ≥ 3, da mindestens drei Nickels erforderlich sind, um<br />
den Wert n ≥ 25 zu erreichen. Man ersetze den Dime und die passenden Nickels und/oder<br />
Pennys durch ein Quater, was einen Widerspruch zur Optimaltät von c bildet.<br />
5.Fall: c[2] = 0: Dann ist c[3] + c[4] ≥ 5, da mindestens fünf Nickels erforderlich sind, um<br />
den Wert n ≥ 25 zu erreichen. Man ersetze den Dime und die passenden Nickels und/oder<br />
Pennys durch ein Quater, was einen Widerspruch zur Optimaltät von c bildet.<br />
Analog lässt sich in den Fällen 25 > n ≥ 10 und 10 > n ≥ 5 argumentieren. Damit ist die<br />
Optimalität von c gezeigt.<br />
AUFGABE 4 (6 Punkte):<br />
Geben Sie einen Algorithmus zur Lösung des Scheduling-Problems mittels Dynamischer Programmierung<br />
an. Zeigen Sie dessen Korrektheit und bestimmen Sie die Laufzeit.<br />
Lösungsvorschlag:<br />
Es bezeichne J[l, r] eine optimale kompatible Menge aus den Mengen mit Indizes l bis r.<br />
Algorithm 2 Dyn-Scheduling<br />
Eingabe: s[1..n] und f[1..n], n ∈ N mit f[1] ≤ f[2] ≤ . . . , ≤ f[n]<br />
for i = 1 to n do<br />
J[i, i] → i<br />
end for<br />
for l = 2 to n do<br />
for i = 1 to n − (l − 1) do<br />
j → i + (l − 1)<br />
J[i, j] → Max(Kombiniere(J[i, k], J[k + 1, j]), k = i, . . . , j − 1)<br />
end for<br />
end for<br />
Ausgabe: J[1, n]<br />
Die Funktion Max ist dabei eine Funktion, die über die Kardinalität der Mengen optimiert.<br />
In jedem Schritt wird also J[i, j] so gewählt, dass es möglichst viele Elemente enthält. Bei<br />
gleicher Kardinalität wird das erste Element gewählt.<br />
Die Hilfsfunktion Kombiniere funktioniert folgendermaßen:
Algorithm 3 Kombiniere<br />
Eingabe: J[l, k] und J[k + 1, r]<br />
m1 ← max{m ∈ J[l, k]}<br />
m2 ← min{m ∈ J[k + 1, r]}<br />
if f m1 < s m2 then<br />
J[l, r] → J[l, k] ∪ J[k + 1, r]<br />
else<br />
J[l, r] → Max(J[l, k], J[k + 1, r])<br />
end if<br />
Ausgabe: J[l, r]<br />
Korrektheit des Algorithmus: Der Algorithmus terminiert, da über vorgegebene Paramter<br />
iteriert wird, also keine Endlossschleifen entstehen können.<br />
Durch den Parameter l wachsen die Intervalllängen stetig. Außerdem werden so nur bekannte<br />
Mengen verwendet. Zu zeigen bleibt, dass sich eine optimale kompatible Menge durch Kombiniere<br />
aus zwei optimalen kompatiblen Mengen ergibt. Dann entsteht in jedem Schritt<br />
beim Zusammensetzen eine neue optimale kompatible Menge, da die Anfangsmengen J[i, i]<br />
optimale kompatible Mengen sind.<br />
Sei also J[l, r] eine optimale kompatible Menge aus {l, . . . , r}. Sei zunächst |J[l, r]| = 1. Dann<br />
gilt s t < f l ≤ f s für t = l + 1, . . . , r und s = l + 1, . . . , r, da J[l, r] sonst nicht optimal und<br />
kompatibel wäre. Somit enthält jedes beliebige J[l, k] oder J[k + 1, r] nur ein Element und<br />
ist damit optimal. Also ergibt sich J[l, r] als Kombiniere von zwei optimalen kompatiblen<br />
Mengen.<br />
Sei nun |J[l, r]| ≥ 2 und m1, m2 seien zwei aufeinanderfolgende Elemente aus J[l, r].<br />
Behauptung: Dann ist J[l, r] = (J ∩ {l, . . . , t − 1})<br />
} {{ }<br />
J 1<br />
∪ (J ∩ {t, . . . , r})<br />
} {{ }<br />
J 2<br />
für ein m1 ≤ t < m2,<br />
wobei J 1 und J 2 optimale kompatible Mengen sind.<br />
Zunächst einmal gilt s m2 ≥ f m1 , da sonst nicht m1 und m2 Elemente in J wären.<br />
Außerdem gilt für alle m1 < n < m2, dass s n < f m1 oder f n > s m2 . Sonst könnte man n zu<br />
J hinzufügen, was einen Widerspruch sowohl zur Optimalität von J als auch zur Definition<br />
von m1 und m2 bildet.<br />
Wir wählen nun t minimal mit f t > s m2 .<br />
Angenommen, J 1 sei nicht optimal, das heißt es existiert ein J ′ 1 ⊂ {l, . . . , t−1} mit |J ′ 1| > |J 1 |.<br />
Da nach Wahl von t für alle m ∈ J ′ 1 gilt f m ≤ s m2 , ergibt sich ein Widerspruch zur Optimalität<br />
von J[l, r] durch Ersetzen von J 1 durch J ′ 1.<br />
Angenommen, J 2 sei nicht optimal, das heißt es existiert ein J ′ 2 ⊂ {t, . . . , r} mit |J ′ 2| > |J 2 |.<br />
Dann gilt für alle m ∈ J ′ 2, dass m ≥ m2 ist. Sonst ergibt sich ein Widerspruch zur Definition<br />
von m1 und m2 und J[l, r].<br />
Ersetzen von J 2 durch J ′ 2 in J[l, r] ergibt aber wieder eine kompatible Menge J ′ [l, r] mit<br />
|J ′ [l, r]| > |J ′ [l, r]|. Dies bildet einen Widerspruch zur Optimalität von J[l, r].<br />
Laufzeit des Algorithmus: Der Durchlauf der ersten FOR-Scheife benötigt Laufzeit O(n),<br />
da Wertzuweisungen in O(1) liegen. Die zweite FOR-Schleife wird ∑ n<br />
n(n−1)<br />
l=2<br />
(n − l + 1) = -<br />
2
mal aufgerufen. Darin werden j − 1 ≤ n Aufrufe von Kombiniere getätigt. Die Laufzeit von<br />
Kombiniere ist wiederum O(1).<br />
Die Gesamtlaufzeit ist daher O(n 3 ).