Stand: March 23, 2015 1 Schleifeninvariante Zeige die Korrektheit folgender Algorithmen mittels geeigneter Schleifeninvarianten. 1.1 Fakultät Folgender Algorithmus eignet sich für die Berechnung der Fakultät einer natürlichen Zahl k: fakultät(int k) f =j=k while j > 1 do j =j−1 f =f ∗j return f 1.2 Maximum Sei L eine nichtleere, einfach verkettete Liste (reeller) Zahlen. f indM ax liefert den Wert des größten gespeicherten Elements. findMax(Liste L von natürlichen Zahlen) x = L.head max = x.key while x.next 6= nil do x = x.next if x.key > max then max = x.key return max 2 O-Notation 2.1 Beweise oder widerlege die Behauptungen. 1. f (n) = 12 n − 2 ∈ Ω(log2 n)) 2. f (n) = nn + n2 ∈ O(nn−1 ) 3. f (n) = n4 −4n2 2n+7 ∈ / O(n3 ) 2 4. f (n) = log3 (n5 · 9n ) ∈ Ω(n log3 n) 5. f (n) = loga n ∈ Θ(logb n) für beliebige a, b > 1 6. f (n) = 1 2 100 n + n sin n ∈ Θ(n2 ) 7. f (n) = n4 − 10n3 + 2n ∈ O(n3 ) 8. f (n) = 9 n ∈ / Ω( √1n ) 2.2 Wir betrachten folgendes Problem. Aus einem Eingabefeld A von ganzen Zahlen sollen die k kleinsten Zahlen ausgegeben werden. Beweisen Sie, dass jeder Algorithmus mit Eingabeparametern A und k, der dieses Problem löst, eine Worst-Case-Laufzeit von Ω(n) hat. Kann man eine noch ”bessere” (also asymptotisch größere) untere Schranke angeben? Beweisen Sie Ihre Behauptung! 1 3 Rekursionsgleichungen 3.1 Gleichungen lösen Finde für die nachstehenden Rekursionsgleichungen jeweils eine Funktion f, für die T ∈ Θ(f ) gilt. √ 1. T (n) = 4T (bn/2c) + 12 n2 n 2. T (n) = 4T bn/2c) + n2 log n + n 3. T (n) = T (n − 3) + 2n √ 4. T (n) = 2T (bn/4c) + 3 n 5. T (n) = 3T (bn/2c) + n 6 6. T (n) = 3T (bn/5c) + 1√ 2 n 7. T (n) = 12T (bn/2c) + n4 8. T (n) = T (bn/2c) + T (dn/2e) + O(n log n) 3.2 Gleichungen aufstellen Stelle Rekursionsgleichungen für die Worst-Case-Laufzeit folgender Algorithmen auf und löse diese anschließend. Algo1(Feld vom Typ int A, int l = 1, int r = A.length) if l < r then m = b(l + r)/2c Algo1(A, l, m) Algo1(A, m + 1, r) InsertionSort(A, l, r) 4 Sortierverfahren Sei A ein Feld mit 10.000.000 ganzen Zahlen aus dem Bereich [1, 231 −1], das aufsteigend sortiert ist. Nun wird es mit k Vertauschungen für k << 10.000.000 von Zahlenpaaren durcheinander gebracht. Warum ist hier QuickSort schlecht geeignet? Welches Sortierverfahren bietet sich an? Sei die Reihenfolge der Zahlen in A nun zufällig. Ist die Anwendung von Counting-Sort hier sinnvoll? Welches andere Sortierverfahren ist geeignet? Nun enthalte A 10.000.000 zufällige Zahlen aus dem Bereich [1,1000]. Warum ist hier QuickSort schlecht geeignet? Wie kann man besser sortieren? Nenne jeweils ein Sortierverfahren, das stabil ist, in situ arbeitet und unter gewissen Voraussetzungen (welchen?) in Linearzeit abläuft. 5 5.1 Elementare Datenstrukturen MinStack Gesucht ist eine Datenstruktur zum Verwalten einer dynamischen Menge S von Zahlen. Es sollen wie bei einem Stapel die Methoden Push(key k) und Pop() zur Verfügen stehen, zusätzlich eine Methode Minimum(), welche die kleinste Zahl der Menge S ausgibt und diese nicht aus der Menge entfernt. Alle Operationen sollen in konstanter Zeit ablaufen. (Hinweis: zwei Stapel verwenden) 2 5.2 Hashing Welche der Funktionen h1 eignen sich beim doppelten Hashing (d.h. hi (k) = (h0 (k) + ih1 (k)) mod 25) für eine Hashtabelle der Länge 25 mit Hashfunktion h0 (k) = (4k + 2) mod 25? Warum? • h1 (k) = 1 • h1 (k) = 9 − (k mod 4) • h1 (k) = k mod 17 • h1 (k) = (3 + 5k) mod 25 • h1 (k) = (4k − 1) mod 13 Welche Vor- und Nachteile hat es, Kollisionen durch Verkettung aufzulösen? Was versteht man unter primärem, was unter sekundärem Clustering? Bei welcher Sondierungsvariante treten diese Probleme auf? 6 Binäre Suchbäume 6.1 Grenzfälle und Beispiele Gib für folgende Fälle jeweils ein Beispiel an: • ein Rot-Schwarz-Baum der Höhe 3 mit minimaler Knotenanzahl • ein binärer Suchbaum der Höhe 3 mit maximaler Knotenanzahl, welcher aber kein Rot-SchwarzBaum ist (d.h. für den keine gültige Färbung existiert) • die Reihenfolge der Elemente, sodass durch Einfügen in einen binären Suchbaum ein Baum der Höhe 3 entsteht, bei dem alle Ebenen vollständig gefüllt sind • Zeigen Sie, dass in jedem binären Suchbaum, die Anzahl der Knoten mit zwei Kindern um 1 kleiner als die Anzahl der Blätter ist! Tipp: Verwenden Sie vollständige Induktion und achten Sie darauf, dass Sie in Ihrem Beweis auch die folgenden Grenzfälle abgedeckt haben: A: Jedes Blatt hat keine Geschwister. B: Jedes Blatt hat einen Geschwisterknoten. 6.2 Suche im Binärbaum In einem binären Suchbaum soll ein Element gesucht werden. A enthält die Elemente in der Reihenfolge in der sie dabei besucht werden, d.h. A[1] ist die Wurzel des Baumes, A[2] das erste Kind auf dem Pfad den die Suche durch den Baum geht. Welche dieser Folgen kann auf diese Weise entstehen? • A = h2; 252; 401; 398; 330; 344; 397; 363i • A = h924; 220; 911; 244; 898; 258; 362; 363i • A = h935; 278; 347; 621; 299; 392; 358; 363i 6.3 Balancierte Bäume 1. Was versteht man unter einem (binären) balancierten Suchbaum? Welchen Vorteil bietet er gegenüber allgemeinen Suchbäumen? 2. Es sei ein binärer Suchbaum T gegeben, bei dem die Wurzel und alle ihre Kinder rot sind. Sonst erfülle T die Eigenschaften eines Rot-Schwarz-Baumes. Wie kann man durch Umfärben von Knoten einen gültigen Rot-Schwarz-Baum erhalten? Halten Sie dabei die Anzahl an Umfärbungen so klein wie möglich! Beweisen Sie Ihre Behauptungen! 3 7 Augmentierung Ein Rot-Schwarz-Baum zur Verwaltung einer dynamischen Menge verschiedener ganzer Zahlen soll so augmentiert werden, dass man zu jeder Zeit bestimmen kann, für welche zwei Zahlen i, j der Menge mit i < j die Differenz j − i am kleinsten ist. Gib die Methode M inGap in Pseudocode an, die das gesuchte Zahlenpaar in konstanter Zeit liefert. Welche Extrainformationen speicherst du im Baum und wie lassen sich diese beim Einfügen, Löschen und Suchen aufrechterhalten, ohne die Laufzeiten der entsprechenden Methoden zu verschlechtern? Lässt sich das Problem auch mit konstantem Zusatzspeicher lösen, wenn man auf die Delete-Methode verzichtet (d.h. nur Elemente einfügen kann)? 8 8.1 Graphen Zweifärbung Ein Graph G = (V, E) heißt genau dann zweifärbbar, wenn eine Abbildung c : V → {schwarz, weiss} existiert, so dass es keine Kante {u, v} ∈ E gibt mit c(u) = c(v). Anders ausgedrückt können wir die Knoten so färben, dass keine zwei benachbarten Knoten dieselbe Farbe bekommen – das geht nicht, wenn der Graph nicht zweifärbbar ist. Welches ist der kleinste Graph, der nicht zweifärbbar ist? Gib einen Algorithmus in Pseudocode an, der für einen gegebenen Graphen G = (V, E) und eine gegebene Färbung c testet, ob es zwei benachbarte Knoten mit derselben Farbe gibt. Was ist die asymptotische Worst-Case-Laufzeit des Algorithmus? Gib außerdem einen Algorithmus an, der einen gegebenen Graphen G = (V, E) auf Zweifärbbarkeit testet. Die Laufzeit soll in O(|V | + |E|) liegen. Beachte, dass G nicht zusammenhängend sein muss. 8.2 Dijkstra Ermittle im nachstehenden Graphen unter Verwendung von Dijkstras Algorithmus einen Baum kürzester Wege bezüglich v. Eine Voraussetzung für die Korrektheit von Dijksta war, dass der Graph nur Kantengewichte ≥ 0 hat. Gib einen (gerichteten) Graph an, in dem negative Kantengewichte vorkommen, bei dem der Algorithmus kein korrektes Ergebnis liefert. Gib andererseits auch einen Graphen an, der gerichtete Kanten negativer Länge enthält, für den der Algorithmus trotzdem funktioniert. 9 Weiteres - zur amortisierten Laufzeitanalyse: die Aufgaben am Ende des Skripts zu diesem Thema - die Aufgaben aus den Kurztests und der Klausur, die auf Wuecampus2 in der Klausurensammlung Informatik zu finden sind 4