30.01.2015 Aufrufe

Diskrete Mathematik 1 - CITS - Ruhr-Universität Bochum

Diskrete Mathematik 1 - CITS - Ruhr-Universität Bochum

Diskrete Mathematik 1 - CITS - Ruhr-Universität Bochum

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 ).

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!