11.07.2015 Aufrufe

Grundlagen: Algorithmen und Datenstrukturen Tutoraufgabe 1

Grundlagen: Algorithmen und Datenstrukturen Tutoraufgabe 1

Grundlagen: Algorithmen und Datenstrukturen Tutoraufgabe 1

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Technische Universität MünchenFakultät für InformatikLehrstuhl für Effiziente <strong>Algorithmen</strong>Dr. Hanjo TäubigJeremias WeihmannSommersemester 2013Lösungsblatt 714. Juni 2013<strong>Gr<strong>und</strong>lagen</strong>: <strong>Algorithmen</strong> <strong>und</strong> <strong>Datenstrukturen</strong><strong>Tutoraufgabe</strong> 1In dieser Aufgabe betrachten wir erneut die Laufzeitanalyse von MergeSort. In der Vorlesungwurde die Laufzeit rekursiv formuliert <strong>und</strong> das das Mastertheorem verwendet, umzu zeigen, dass die Laufzeit von MergeSort in O(n log n) liegt.Die rekursive Formulierung der Laufzeit war wie folgt:(⌊ n⌋) (⌈ n⌉)T (n) = T + T + Θ(n)2 2T (1) = Θ(1)Zeigen Sie ohne Verwendung des Master-Theorems, dass die Worst-Case-Laufzeit vonMergeSort angewandt auf Zahlenfolgen, deren Länge Zweierpotenzen sind, in O(n log n)liegt.(a) Verwenden Sie dazu die Methode des iterativen Einsetzens.(b) Verwenden Sie dazu (starke) vollständige Induktion.LösungsvorschlagZunächst wollen wir die rekursive Formulierung (1) betrachten <strong>und</strong> uns klar machen, wasgenau sie bedeutet, <strong>und</strong> warum es sinnvoll ist, diese Formulierung zu wählen <strong>und</strong> zuuntersuchen. Rekursion (1) ist, für geeignet gewählte a > 0 <strong>und</strong> f(n) ∈ Θ(n), äquivalentzur Formulierung:{T (⌊ ⌋) (⌈n2 + T n⌉)2 + f(n), falls n > 1T (n) =a, falls n = 1Es zwei Probleme bei dieser rekursiven Formulierung der Laufzeit:1. Verschiedene Eingaben derselben Länge können verschiedene Laufzeiten besitzen.Das heißt, es ist im Allgemeinen nicht möglich, von der Laufzeit bei einer Eingabeder Länge n zu sprechen. Daher ist T (n) als Worst-Case-Laufzeit aufzufassen, wennwir Untersuchungen zu oberen Laufzeitschranken vornehmen.2. Wenn T (n) die Worst-Case-Laufzeit ist, sagt die rekursive Formulierung aus, dassdie WC-Laufzeit über alle Eingaben der Länge n sich zusammensetzt aus den WC-Laufzeit von Eingaben der Längen ⌊n/2⌋ <strong>und</strong> ⌈n/2⌉ zuzüglich f(n). Problematischist, dass der Fall auftreten könnte, dass bei einer WC-Eingabe der Länge n diekorrespondierenden rekursiven Unteraufrufe der Längen ⌊n/2⌋ <strong>und</strong> ⌈n/2⌉ keine WC-Eingaben dieser Längen darstellen. Insofern ist diese rekursive Formulierung imAllgemeinen auch für die Worst-Case-Laufzeit T (n) nicht korrekt.(1)


Das zweite Problems lösen wir, indem wir die Worst-Case-Laufzeit T (n) wie folgt formulieren:(⌊ n⌋) (⌈ n⌉)T (n) ≤ T + T + cn, falls n > 12 2T (1) = aHierbei wurde c > 0 so gewählt, dass cn ≥ f(n) für alle n ∈ N gilt. Das eingeführte ≤“ ”führt nun aber dazu, dass die Funktion T (n) nicht mehr eindeutig definiert ist. Daher istes für die Anwendung des Master-Theorems sinnvoll, statt T (n) eine rekursiv formulierteobere Schranke F (n) von T (n) zu untersuchen:{F (⌊ ⌋) (⌈n2 + F n⌉)2 + cn, falls n > 1F (n) =a, falls n = 1Gilt überhaupt F (n) ≥ T (n)? Intuitiv scheint dies klar zu sein. Wir beweisen dies überstarke vollständige Induktion:Induktionsanfang: Für n = 1 gilt T (n) = a = F (n).Induktionsschritt: Sei n > 1. Unsere Induktionsannahme ist, dass T (n ′ ) ≤ F (n ′ ) für allen ′ ∈ [n − 1] gilt. Dann erhalten wir:(⌊ n⌋)T (n) = T + T2̌(⌈ n⌉)+ cn I.A. (⌊ n⌋) (⌈ n⌉)≤ F + F + cn = F (n) ̌2 2 2Wir beobachten, dass also streng genommen in der Vorlesung mit dem Master-Theorem für eine rekursiv formulierte obere Laufzeitschranke F (n) gezeigt wurde, dassF (n) ∈ O(n log n) gilt. In der Literatur spricht man dennoch oft von einer rekursivenFormulierung der Laufzeit, was mathematisch gesehen unsauber ist. Eine gewisse Rechtfertigungerhält diese Formulierung (1) dadurch, dass sie durch ”Θ(1)“ <strong>und</strong> ”+Θ(n)“ inkompakter Weise auch eine untere Schranke formuliert, <strong>und</strong> wir auch keine Konstantena, c angeben müssen. Nahezu dieselbe Argumentation wie zuvor können dann dazu verwenden,um zu zeigen, dass es eine untere Schranke für die Best-Case-Laufzeit gibt, die inΩ(n log n) liegt. Wenn obere <strong>und</strong> untere Schranke asymptotisch dasselbe Wachstumsverhaltenhaben (in diesem Fall O(n log n) <strong>und</strong> Ω(n log n)), sagt man auch, dass die Laufzeitin Θ(n log n) liegt.Kommen wir nun zur eigentlichen Aufgabe.(a) Iteratives Einsetzen: Lauf Aufgabenstellung betrachten wir nur Eingaben, bei denendie Anzahl der Elemente eine Zweierpotenz n = 2 m ≥ 1 ist. Dann gilt( n) ( ( n)T (n) ≤ 2T + cn ≤ 2 2T + c n ) ( n)+ cn = 4T + 2cn( 2 ( 4 24n)≤ 4 2T + c n )( n)+ 2cn = 8T + 3cn( 8 48n)≤ 2 m · T + m · cn ≤ n · a + ld(n) · cn ∈ O(n log n)2 mAus den Transitivitätsregeln der O-Notation folgt T (n) ∈ O(n log n).2


(b) Starke vollständige Induktion: Bei dieser Methode, rät man auf geschickte Weiseeine geeignete nicht rekursiv formulierte Funktion f(n), <strong>und</strong> zeigt dann induktiv,dass f(n) ≥ T (n) gilt. Da wir nicht besonders kreativ sind, raten wir z.B.f(n) := dn ld(dn) ∈ O(n log n), wobei wir die Konstante d > 0 aber zunächst nichtspezifizieren. Wir werden d später gerade so wählen, dass Induktionsanfang <strong>und</strong> Induktionsschrittgelingen.Zu zeigen ist T (n) ≤ dn ld(dn) für alle Zweierpotenzen n.Induktionsanfang: Für m = 0, also n = 2 0 = 1 giltsofern d ≥ max{a, 2} gewählt wird.T (1) = a ≤ d ld d = f(1),Induktionsschritt: Sei m > 0, also n = 2 m > 1 eine Zweierpotenz. Wir nehmen an,dass die Aussage für alle Zweierpotenzen zwischen 1 <strong>und</strong> n − 1 wahr ist (daher auchstarke vollständige Induktion). Dann giltsofern d ≥ c gewählt wird.( n)T (n) ≤ 2T + cn I.A.≤ 2(d n (2 2 ld d n ))+ cn2= dn ld(dn) − dn + cn ≤ dn ld(dn),Damit ist gezeigt, dass für d := max{2, a, c} <strong>und</strong> alle Zweierpotenzen n die Funktiondn ld(dn) ∈ O(n log n) eine obere Schranke von T (n) ist, woraus durch die TransitivitätsregelnT (n) ∈ O(n log n) folgt.Anmerkung: Wie kommt man überhaupt darauf, eine Funktion der Form dn ld(dn)zu wählen? Versucht man es mit etwas Naheliegenderem, wie beispielsweise dn ld n,funktioniert der Induktionsanfang für n = 1 nicht. Wenn man versucht, dieses Problemdurch die Wahl dn ld n+a zu umgehen, funktioniert der Induktionsschritt nicht.Für gewöhnlich ist ein Induktionsbeweis aber nicht nur mit einer einzigen (parametrisierten)Funktion möglich. In unserem Fall funktioniert die Induktion beispielsweiseauch mit der in der ersten Teilaufgabe verwendeten Funktion cn ld n + an.<strong>Tutoraufgabe</strong> 2Wir betrachten eine Funktion T (n), die für zwei Konstanten a, c > 0 die folgenden Eigenschaftenbesitzt:(⌊ n⌋) (⌈ n⌉)T (n) ≤ T + T + cn, falls n > 12 2T (1) = aIn der ersten <strong>Tutoraufgabe</strong> wurde gezeigt, dass T (n) ∈ O(n log n) für alle Zweierpotenzenn gilt. Zeigen Sie, dass dies auch dann gilt, wenn alle natürlichen Zahlen, <strong>und</strong> nicht nurZweierpotenzen, als Eingabe erlaubt sind. Was folgt daraus für die Worst-Case-Laufzeitvon MergeSort?3


LösungsvorschlagWir verwenden die in der ersten <strong>Tutoraufgabe</strong> hergeleitete obere Schranke F (n) ≥ T (n):{F (⌊ ⌋) (⌈n2 + F n⌉)2 + cn, falls n > 1F (n) =a, falls n = 1Für F zeigen wir Monotonie, d.h. wir zeigen F (n) ≤ F (n + 1) für alle n ≥ 1. Dies wirdspäter benötigt.Induktionsanfang: Falls n = 1, dann folgt(⌊ (⌈ 2 2F (2) = F + F + c2 = 2a + 2c > F (1). ̌2⌋)2⌉)Induktionsschritt: Sei n > 1 <strong>und</strong> F im Intervall [1, n − 1] monoton steigend. Dann gilt:(⌊ n⌋) (⌈ n⌉)F (n) = F + F + cn(⌊2 ⌋) 2 (⌈ ⌉)I.A. n − 1 n − 1≥ F+ F+ c(n − 1) = F (n − 1) ̌22Man mache sich klar, dass ein solcher Monotoniebeweis für die Funktion T nicht ohne weiteresdurchführbar ist. Mit derselben Herleitung wie in der ersten <strong>Tutoraufgabe</strong>, könnenwirF (n) ≤ dn ld dn (2)für alle Zweierpotenzen zeigen, wobei d > 0 eine geeignet gewählte Konstante ist (z.B.d = max{2, a, c}).Sei nun n ≥ 1 eine beliebige Zahl (nicht notwendigerweise eine Zweierpotenz) <strong>und</strong> seim ≥ 1 so gewählt, dass n ∈ (2 m−1 , 2 m ]. Aus 2 m−1 ≤ n folgtInsgesamt erhalten wir2 m ≤ 2n. (3)T (n) ≤ F (n) Monotonie≤ F (2 m ) (2)≤ d2 m ld(d2 m ) (3)≤ 2dn ld(2dn) ∈ O(n log n).Aus den Transitivitätsregeln folgt T (n) ∈ O(n log n).In Hinblick auf MergeSort bedeutet dieses Resultat, dass die Worst-Case-Laufzeit desAlgorithmus für Eingaben aller Längen in O(n log n) liegt, da die Worst-Case-Laufzeiteine rekursive Formulierung wie die betrachtete Funktion T (n) erlaubt.<strong>Tutoraufgabe</strong> 3Ein Hotelmanager hat n Buchungen für die nächste Saison. Sein Hotel hat k identischeRäume. Die Buchungen enthalten ein Ankunfts- <strong>und</strong> ein Abreisedatum. Er will herausfinden,ob er zu allen Zeiten genügend Räume für die Buchungen zur Verfügung hat.Entwickeln Sie einen Algorithmus, der dieses Problem in Zeit O(n + sort(n)) löst, wobeisort(n) die Worst-Case-Laufzeit eines beliebigen Algorithmus für das Sortieren von nZahlen ist.4


LösungsvorschlagFür jede Buchung i bezeichne A i das Anreisedatum <strong>und</strong> D i das Abreisedatum.Sei A = {A i | | 1 ≤ i ≤ n} die Menge aller Anreisedaten <strong>und</strong> D = {(D i −1) | | 1 ≤ i ≤ n}die Menge aller Abreisedaten. (Durch A i <strong>und</strong> D i − 1 werden die ”Nächte“ beschrieben,zu denen die Zimmer benötigt werden.) Die Funktion merge beschreibt ein Verfahren,das analog zu Mergesort zwei bereits sortierte Zahlenfolgen zu einer einzigen sortiertenZahlenfolge vereinigt, wobei bei Gleichheit eines Anreisedatums <strong>und</strong> eines Abreisedatumsdas Anreisedatum stets vor dem Abreisedatum einsortiert wird.〈s 1 , . . . , s 2n 〉 :=merge(sort(A),sort(D))int m = 0int i = 1while m ≤ k and i ≤ 2n doif s i Anreisedatum then m + +else m − −i + +if i < 2n then return ”zu wenig Zimmer zum Zeitpunkt s i−1 “else return ”genug Zimmer“Ein Detail am Rande: Warum kann man nicht einfach alle 2n Zahlen auf einmal sortieren?Im Prinzip wäre dies möglich, wenn wir davon ausgehen können, dass wirein Sortierverfahren verwenden, das beispielsweise Worst-Case-Laufzeit Θ(n k ) für eineKonstante k oder Θ(n log n) hat. Dann nämlich gilt (2n) k = 2 k · n k ∈ O(n k ) bzw.(2n) log(2n) = 2 · n(log(2) + log(n)) ∈ O(n log n). Das heißt, die Worst-Case-Laufzeitzum Sortieren einer Zahlenfolge der Länge 2n ist asymptotisch nicht größer als die Worst-Case-Laufzeit zum Sortieren einer Zahlenfolge der Länge n.Sollte der verwendete Sortieralgorithmus aber eine Worst-Case-Laufzeit wie zum BeispielΘ(2 n ) haben (was aus offensichtlichen Gründen in der Praxis nicht vorkommt), dann gilt2 2n = 4 n /∈ O(2 n ). In diesem Fall kann also keine Gesamtlaufzeit von O(n + sort(n))garantiert werden.Hausaufgabe 1Implementieren Sie in der Klasse UIsmsArray den MergeSort-Algorithmus, in der Funktionsort, der die Elemente in dem Feld A sortiert.Verwenden Sie für Ihre Implementierung die auf der Übungswebseite bereitgestellten Klassen<strong>und</strong> verändern Sie für Ihre Implementierung ausschließlich die Klasse UIsmsArray.Achten Sie bei der Abgabe Ihrer Aufgabe darauf, dass Ihre Klasse UIsmsArray heißt<strong>und</strong> auf den Rechnern der Linuxhalle (lxhalle.informatik.tu-muenchen.de) mit derbereitgestellten Datei main_m kompiliert werden kann. Anderenfalls kann eine Korrekturnicht garantiert werden. Achten Sie darauf, dass Ihr Quelltext ausreichend kommentiertist.Schicken Sie die Lösung per Email mit dem Betreff [GAD] Gruppe anIhren Tutor.5


LösungsvorschlagSiehe Übungswebseite.Hausaufgabe 2Wir betrachten die wie folgt definierte Funktion:{T (⌊ ⌋) (⌈n2 + T n⌉)2 + 2n, falls n > 1T (n) ≤1, falls n = 1(4)In der ersten <strong>Tutoraufgabe</strong> wurde mit (starker) vollständiger Induktion gezeigt, dassT (n) ≤ 2n ld(2n) (5)für alle Zweierpotenzen n ist. Daraus folgt natürlich automatisch, dassfür alle Zweierpotenzen n gilt.T (n) ≤ 2n ld(2n) + 1/n (6)Zeigen Sie am Beispiel der Funktion T <strong>und</strong> den genannten oberen Schranken, dass es beider Beweismethode über vollständige Induktion (analog wie in der ersten <strong>Tutoraufgabe</strong>durchgeführt) zu dem Phänomen kommen kann, dass der unmittelbare Beweis einer schwachenSchranke (6) fehlschlägt, während der unmittelbare Beweis einer starken Schranke(5) gelingt.LösungsvorschlagWir versuchen analog zur ersten <strong>Tutoraufgabe</strong>, die UngleichungT (n) ≤ 2n ld(2n) + 1 nfür alle Zweierpotenzen n über vollständige Induktion zu beweisen.Induktionsanfang: Für n = 2 0 = 1 gilt T (1) (4)≤ 1 < 2 · 1 + 1/1 = 2n ld(2n) + 1 n .Induktionsschritt: Sei n = 2 m > 1 eine Zweierpotenz. Wir nehmen an, dass die Aussagefür alle Zweierpotenzen in [n − 1] wahr ist. Dann gilt:T (n) (4) ( n) (≤ 2T + 2n I.A.≤ 2 2 · n (2 2 ld 2 · n )+ 2 )+ 2n2 n(= 2 n ld n + 2 )+ 2n = 2n ld n + 4 nn + 2n ld(2) = 2n ld(2n) + 4 ňEs gilt jedoch 1 < 4 , sodass der Induktionsschritt fehlschlägt. Wir sehen also: Die Abschwächungder zu zeigenden Schranke sorgt für einen leichter zu beweisenden Induktions-n nanfang, während gleichzeitig die Induktionsannahme ebenfalls schwächer wird. In diesemFall wird letztere so schwach, dass der Induktionsschritt nicht mehr zu beweisen ist.Daher kann der Versuch, eine stärkere Aussage über Induktion zu beweisen, in einigenFällen gelingen, selbst dann, wenn der Beweis einer schwächeren Aussage zuvor fehlgeschlagenist.6


Hausaufgabe 3Geben Sie ein Verfahren an, um 5 Elemente mit 7 Vergleichen zu sortieren.LösungsvorschlagWir beginnen mit 5 ungeordneten Elementen:Mittels zwei Vergleichen stellen wir eine Ordnung unter jeweils zwei Elementen her:Vergleichen wir die beiden größten Elemente so erhalten wir eine Ordnung unter dreiElementen:Mit zwei weiteren Vergleichen können wir das bisher noch unverglichene Element sicherin die drei korrekt geordneten Elemente einfügen (Binäre Suche). Wir erhalten Eine derbeiden Situationen:oderIn beiden Fällen können wir mit zwei Vergleichen das ”weiße“ Element durch die nochzwei verbleibenden Vergleiche korrekt einsortieren.7

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!