AuD - Algorithmen und Datenstrukturen Übungsaufgaben zur Prüfungsvorbereitung Wintersemester 2015/16 Frank Heitmann ([email protected]) Nachfolgend sind beispielhafte Aufgaben wie sie in der Klausur gestellt werden könnten. Die Aufgabensammlung dient der Prüfungsvorbereitung, ist aber nicht zwingend vollständig! Es lohnt sich daher sich z.B. zu überlegen, welche ähnlichen Aufgaben gestellt werden könnten, noch einmal die Folien und die Aufgabenzettel zu studieren und weitere Aufgaben z.B. aus dem Buch von Cormen et al. zu bearbeiten. O-Notation und Laufzeitanalyse 1. Begründen Sie formal, warum folgende Größenabschätzungen gelten bzw. nicht gelten: (a) (b) (c) (d) (e) (f) 4n2 + 12n3 − 50n + 83 ∈ O(n2 ) n · log n ∈ Ω(n2 ) n2 + 5n − 13 ∈ Θ(n2 ) n2 · log n ∈ O(n4 ) n − 5 ∈ o(n) n2 − 5n ∈ ω(n) 2. Ordnen Sie (ohne Begründung) die folgenden Funktionen nach ihrem Wachstumsgrad in aufsteigender Reihenfolge, d.h. folgt eine Funktion g(n) einer Funktion f (n), so soll f (n) ∈ O(g(n)) gelten. √ 3 1 n, log n, 4, n2 , n 2 , n · log n, n , 2n , 1000 Mit log ist hier der Logarithmus zur Basis 2 gemeint. 3. Beweisen oder widerlegen Sie: (a) Wenn f (n), g(n) ∈ O(h(n)), dann f (n) + g(n) ∈ O(h(n)) (b) Wenn f (n), g(n) ∈ O(h(n)), dann f (n)/g(n) ∈ O(h(n)) (c) f (n) ∈ O(g(n)) genau dann, wenn g(n) ∈ Ω(f (n)) 4. Betrachten Sie folgende Code-Fragmente und geben Sie eine möglichst dichte asymptotische obere Schranke für ihre Laufzeit in Abhängigkeit von N an. Begründen Sie diese. Alg1() for i = 0 to N for j = N downto 1 sum = sum + j Alg2() i=1 while i · i < N sum = sum + 2 i = i+1 1 Alg3() for i = 1 to N j =N while j > 1 sum = sum + j j = j/2 5. Geben Sie für die folgenden drei Codefragmente eine möglichst genaue obere Schranke für die Laufzeit an. Für das zweite und dritte Codefragment nehmen Sie an, dass Q eine Queue ist, die mittels einer einfach verketteten Liste implementiert ist. Q hat zu Beginn die Länge n. Beim zweiten Codefragment sei ferner A ein Array mit m Elementen. Alg1() for i = 1 to n for j = 0 to 4 for k = j · (n/5) to (j + 1) · (n/5) print k Alg2() for i = 1 to m Q.enque(A[m]) Alg3() for i = 1 to n Q.dequeue() Rekurrenzgleichungen und Laufzeitanalyse 1. Gegeben sei folgender Algorithmus, der ein Array A als Eingabe erwartet (dessen genaue Funktionsweise nachfolgend aber nicht wichtig ist): FUNC(A) 1 if A.länge < 4 2 return 5 3 else 4 x = A.länge/4 5 y = FUNC(A[1 . . x]) 6 z = FUNC(A[3 · x + 1 . . A.länge]) 7 r=0 8 for i = 1 to A.länge 9 for j = i + 1 to A.länge 10 r = r + A[i] · A[j] 11 return r Leiten Sie eine Rekurrenzgleichung für die Laufzeit der Methode FUNC in Abhängigkeit von der Arraygröße n von A ab. Begründen Sie Ihre Gleichung. 2. Sei ( c, für n = 1 T (n) := n 9 · T ( 3 ) + n, sonst eine Rekurrenzgleichung (c ist dabei eine Konstante). Bestimmen Sie die Größenordnung der Funktion T : N → N mittels des Mastertheorems. 2 3. Sei ( 0, für n = 0 T (n) := 4 · T (n − 1) + 3, sonst eine Rekurrenzgleichung. Bestimmen Sie die Größenordnung der Funktion T : N → N mittels der Substitutionsmethode. Führen Sie an geeigneter Stelle eine induktiven Beweis zum Beleg ihrer Behauptung. Intermezzo Denken Sie sich zu allen bisherigen Aufgabentypen (O-Notation, Rekurrenzgleichungen, Laufzeitanalyse bei iterativen und bei rekursiven Code) je eine eigene Aufgabe aus und geben Sie diese einem Kommilitonen zum Bearbeiten. Korrigieren Sie im Anschluss den Lösungsvorschlag. Suchen & Sortieren 1. Geben Sie nacheinander die binären Suchbäume an, die man nach Einfügen der Elemente 10, 13, 11, 7, 12, 1, 9, 8, 14 in dieser Reihenfolge (beginnend mit 4) erhält, wenn man mit einem leeren Baum startet. Geben Sie dann den Baum ein, den man erhält wenn man die 10 löscht und zuletzt den Baum, den man erhält wenn man im Anschluss die 7 löscht. Welche Laufzeit hat die Lösch-Operation bei binären Suchbäumen? 2. Gegeben sei folgendes Array A = [1, 3, 15, 13, 1, 4, 2, 8, 7, 19, 12, 5, 11, 9] Geben Sie das Array als Baum an, wie bei einem Heap. Wenden Sie dann die Operation BuildM axHeap auf A an und geben Sie den Baum nach jeder Ausführung der Methode M axHeapif y an. Welche Laufzeit hat BuildM axHeap? 3. Ist jeder Heap auch ein binärer Suchbaum? Ist jeder binärer Suchbaum auch ein Heap? Begründen Sie ihre Antwort! 4. Welcher der folgenden Aussagen stimmen Sie zu? Begründen Sie Ihre Antwort! (a) Es existiert ein vergleichendes Sortierverfahren, dass in Θ(n) arbeitet! (b) Es existiert ein Sortierverfahren, dass in Θ(n) arbeitet! (c) QuickSort ist schneller als MergeSort! 5. Wann nennt man ein Sortierverfahren stabil ? Nennen Sie ein Ihnen bekanntes stabiles Sortierverfahren aus der Vorlesung. Graphen 1. Beschreiben Sie in groben Zügen das Vorgehen bei einer Breiten- und bei einer Tiefensuche (in einem Graphen). Welche Laufzeit haben diese Verfahren? 2. Gegeben Sei der folgende Graph. Wenden Sie das in der Vorlesung behandelte Verfahren an, um eine topologische Sortierung zu gewinnen. Notieren Sie die nötigen Werte in oder an den Knoten. Geben Sie dann auch die gewonnene topologische Sortierung an. 3 a b e c d f 3. Beschreiben Sie kurz was strenge Zusammenhangskomponenten sind. Markieren Sie dann in dem folgenden Graphen die strengen Zusammenhangskomponenten. Bestimmen Sie im Anschluss mit dem Verfahren aus der Vorlesung die strengen Zusammenhangskomponenten. a b e c f d g 4. Wozu dient der Algorithmus von Prim? Was ist die Kernidee? Welche Laufzeit hat er? 5. Welche Algorithmen kennen Sie, um kürzeste Pfade zu bestimmen? Was unterscheidet diese Algorithmen voneinander, worin ähneln sie sich? 4 6. Ermitteln Sie mit dem Algorithmus von Kruskal in dem folgenden Graphen einen minimalen Spannbaum. Machen Sie dabei auch deutlich wann etwas passiert (wann z.B. welcher Teil des Graphen betrachtet wird). 7 A 8 5 3 B 2 C E 4 3 7 D G 6 6 I F K 2 5 H 1 5 J 5 7. Gegeben sei folgendes Flussnetzwerk G mit Fluss f , Quelle A, Senke F (der Knoten links unten soll D statt B heißen): 4 A 2 4/4 1/1 B 1/2 B 6 3/3 C 3/6 2/5 E F 1/1 Bestimmen Sie wie in einer Iteration des Edmonds-Karp-Algorithmus zunächst das Restnetzwerk Gf und zeichnen Sie dieses. Bestimmen Sie dann einen Erweiterungspfad wie im Algorithmus von Edmonds-Karp, geben Sie diesen an und zeichnen Sie dann erneut das Flussnetzwerk mit dem nun neuen Fluss. Intermezzo Denken Sie sich wieder zu den obigen Aufgabentypen (Suchbäume, Heaps, Topologisches Sortiern, Bestimmung strenger Zusammenhangskomponenten, Anwendung von Kruskals Algorithmus, Anwendung von Dijkstras Algorithmus, Flüsse) je eine eigene Aufgabe aus und geben Sie diese einem Kommilitonen zum Bearbeiten. Korrigieren Sie im Anschluss den Lösungsvorschlag. 5 Komplexitätstheorie 1. Gegeben sei das folgende Probleme: Definition “Hamilton-Kreis” HC: Gegeben: Gesucht: Antwort: Ungerichteter Graph G = (V, E) Gibt es einen Kreis, in dem jeder Knoten genau einmal auftritt? („Hamilton-Kreis“) JA oder NEIN Zeigen Sie, dass HC in N P liegt. 2. Gegeben sei das folgende Probleme: Definition “Kreis-Problem” CP : Gegeben: Gesucht: Antwort: Ungerichteter, kantenbewerteter Graph G = (V, E), eine Gewichtsfunktion g : E → N und eine Schranke k ∈ N Gibt es einen einfachen Kreis (einen Kreis der keinen Kreis als echten Teilgraphen enthält) p in G mit g(p) ≥ k? JA oder NEIN Zeigen Sie, dass CP in N P liegt. 3. Sei L ein Problem von dem Sie bereits wissen, dass es N P -schwierig ist. Was ist noch zu tun, wenn man zeigen will, dass L auch N P -vollständig ist? 4. Beweisen Sie: Sind L1 , L2 ∈ P , so ist auch L1 ∪ L2 ∈ P . 5. Beweisen Sie: Sind L1 , L2 ∈ N P , so ist auch L1 ∩ L2 ∈ N P . 6. Folgt aus coN P 6= N P auch P 6= N P ? (Begründen Sie Ihre Antwort!) 7. Sei G = (V, E) ein ungerichteter Graph. Bei einer k-Färbung von G wird jedem Knoten v ∈ V eine Farbe c ∈ [k] = {1, 2, . . . , k} zugewiesen. Die Färbung ist korrekt, wenn zwei benachbarte Knoten nie die gleiche Farbe haben. Formal ist eine k-Färbung dann also eine Abbildung f : V → [k] und eine korrekte k-Färbung f erfüllt f (x) 6= f (y) für jede Kante {x, y} ∈ E. Wir definieren folgendes Problem: k-col = {hGi | G besitzt eine korrekte k-Färbung} Angenommen Sie wissen, dass 4-col N P -vollständig ist. Zeigen Sie, dass auch 8-col N P vollständig ist. 8. Betrachten Sie das folgende Problem: Gegeben: Zwei Graphen G1 = (V1 , E1 ) und G2 = (V2 , E2 ). Frage: Gibt es Teilmengen V ⊆ V1 und E ⊆ E1 derart, dass |V | = |V2 | und |E| = |E2 | gilt und eine bijektive Abbildung f : V2 → V existiert mit {u, v} ∈ E2 genau dann, wenn {f (u), f (v)} ∈ E? (a) Zeigen Sie, dass das Problem in N P liegt, indem Sie einen N P -Algorithmus angeben, der das Problem löst. 6 (b) Beweisen Sie, dass das Problem N P -hart (und damit insgesamt N P -vollständig) ist, indem Sie eine Reduktion von einem Ihnen bekannten N P -vollständigen Problem angeben. 9. Betrachten Sie noch einmal das obige Hamilton-Kreisproblem HC und das oben ebenfalls gegebene Kreis-Problem CP . Es ist gegeben, dass HC N P -vollständig ist und dass CP ∈ N P gilt. Zeigen Sie nun, dass auch CP N P -vollständig ist, indem Sie HC ≤p CP zeigen, also HC in Polynomialzeit auf CP reduzieren. Intermezzo Suchen Sie sich einen Kommilitonen und erklären Sie ihm, was P ist, was N P ist und wann ein Problem N P -vollständig ist. Stellen Sie ihm die Zusammenhänge zwischen diesen drei Klassen dar und nennen Sie ihm mehrere Probleme, die in P liegen, mehrere, die in N P liegen, und mehrere N P -vollständige Probleme. Algorithmenentwurf Gegeben ist ein Array A von n sortierten, natürlichen Zahlen und eine weitere natürliche Zahl x. Entwerfen Sie einen Algorithmus, der true zurück liefert, wenn in A zwei Zahlen a und b mit x = a + b existieren (und f alse sonst). Ihr Algorithmus soll das Problem in O(n) lösen. (Beschreiben Sie zunächst Ihre Idee. Geben Sie dann den Algorithmus im Pseudocode an und begründen Sie zuletzt die Korrektheit ihres Algorithmus und die richtige Laufzeit.) 7