KIT Jun.-Prof. Henning Meyerhenke, Jun.-Prof. Dennis Hofheinz Institut f¨ ur Theoretische Informatik Christian Staudt, Christoph Striecks ¨ 5. Ubungsblatt zu Algorithmen I im SS 2015 https://crypto.iti.kit.edu/algo-sose15 {staudt,striecks}@kit.edu Mit L¨ osungsvorschl¨ agen Aufgabe 1 (Kombinatorik, 1 + 2 + 1 Punkte) Aus der Vorlesung Grundbegriffe der Informatik wissen Sie, dass ein Wort w u ¨ber einem Alphabet Σ eine Folge von Zeichen aus Σ ist. a) Sei Σ = {x, y, z} gegeben. Betrachten Sie das Wort w1 = zxyx ∈ Σ4 . Wie viele verschiedene W¨orter k¨ onnen durch Umstellen der Zeichen von w1 konstruiert werden? Geben Sie alle W¨ orter an. b) Sei Σ = {1, . . . , j}, f¨ ur j ∈ N, gegeben. Betrachten Sie das Wort w2 ∈ Σn , f¨ ur n ∈ N0 . Wie viele verschiedene W¨ orter k¨ onnen durch Umstellen der Zeichen von w2 konstruiert werden? Begr¨ unden Sie Ihre Antwort. Hinweis: 0! = 1. c) Sei Σ = {A, b, g, h, i, l, m , n, o, r, t} gegeben. Betrachten Sie die W¨orter w3 = Algorithmen ∈ Σ11 und w4 = lAghhbAArAA ∈ Σ11 . Wie viele verschiedene W¨orter k¨onnen durch Umstellen der Zeichen von w3 und w4 jeweils konstruiert werden? Tipp: Versuchen Sie nicht, alle anzugeben. Nutzen Sie das Ergebnis aus b). L¨ osungsvorschlag: zxyx a) Wir erhalten 12 verschiedene W¨ orter: zxxy zyxx xzyx xzxy yzxx xyzx xxzy yxzx xyxz xxyz yxxz. b) Es gibt n! Permutationen von w2 . Durch das Mehrfachauftreten der Buchstaben sind diese aber zum Teil untereinander identisch. F¨ ur eine feste Permutation gibt es nc ! M¨oglichkeiten, die nc Zeichen c ∈ Σ an den gleichen Stellen zu permutieren, ohne das Wort zu ver¨andern. Daher m¨ ussen wir durch diese Anzahl teilen und erhalten n! n1 ! · n2 ! · . . . · nj ! M¨oglichkeiten. c) Die Anzahl der verschiedenen M¨ oglichkeiten f¨ ur w3 ergibt sich zu 11! = 39916800 und f¨ ur w4 erhalten wir 11!/(5!2!) = 11 · 10 · 9 · 8 · 7 · 3 = 166320. (Σ wurde hierbei um das Zeichen b erg¨ anzt.) Aufgabe 2 (Sortieren, 1 + 1 + 2 + 2 Punkte) Sortieren Sie die Ziffern Ihrer Matrikelnummer mittels den in den Teilaufgaben angegebenen Algorithmen aus der Vorlesung. (Falls Sie zu zweit abgeben, gen¨ ugt eine von beiden.) a) Bestimmen Sie die Anzahl von Inversionen in Ihrer Matrikelnummer. 1 b) Benutzen Sie Insertionsort. Geben Sie den Zustand des Feldes nach jedem Einf¨ uge-Schritt an. c) Benutzen Sie Mergesort. Verwenden Sie das Schema aus dem Beispiel auf der Vorlesung-Folie 173. d) Benutzen Sie Quicksort. Verwenden Sie das Schema aus dem Rekursions-Beispiel auf der VorlesungFolie 197. Als Pivot soll das erste Element verwendet werden. L¨ osungsvorschlag: Beispiel mit Matrikelnummer 1229203. a) Diese Matrikelnummer hat 7 Inversionen. b) 1 2,2,9,2,0,3 1,2 2,9,2,0,3 1,2,2 9,2,0,3 1,2,2,9 2 0,3 1,2,2,2,9 0,3 0,1,2,2,2,9 3 0,1,2,2,2,3,9 c) h1, 2, 2, 9, 2, 0, 3i split h1, 2, 2i h9, 2, 0, 3i split h1i h2, 2i h9, 2i h0, 3i split h1i h2i h2i h9i h2i h0i h3i merge h1i h2, 2i h2, 9i h0, 3i merge h1, 2, 2i h0, 2, 3, 9i merge h0, 1, 2, 2, 2, 3, 9i d) 1 2 2 9 2 0 3 0|1|2 9 2 3 2 2 2|2|3 9 2|2| |3|9 Aufgabe 3 (Sortieralgorithmen sortieren – Doktor Meta l¨ asst gr¨ ußen, 2 Punkte) Ordnen Sie die folgenden f¨ unf Sortieralgorithmen aufsteigend nach Average-case-Komplexit¨at: HeapSort, Merge-Sort, Quick-Sort, Insertion-Sort und Bucket-Sort f¨ ur Schl¨ usselwerte in O(n). Annotieren Sie jeweils die Average-case-Komplexit¨ at. Lo ¨sungsvorschlag: Bucket-Sort O(n + |S|) = O(n), Heap-Sort O(n log n), Merge-Sort O(n log n), Quick-Sort O(n log n), 2 Insertion-Sort O n . 2 Aufgabe 4 (In-place-Duplikaterkennung, 4 Punkte) Gegeben ist ein Array A : Array[0..n − 1] der Gr¨oße n. Es enth¨alt Zahlen aus {0, . . . , n − 1}. Geben Sie einen In-place-Algorithmus an, der eine Zahl ausgibt, die doppelt vorkommt oder ausgibt, dass alle Zahlen verschieden sind. Die Laufzeit Ihres Algorithmus darf O(n) nicht u ¨ bersteigen. Geben Sie auch die Best-Case-Laufzeit Ihres Algorithmus an. Hinweis: Es ist erlaubt, das urspr¨ ungliche Array zu ver¨andern. F¨ ur einen In-place-Algorithmus steht nur O(1) zus¨atzlicher Speicher zur Verf¨ ugung. L¨ osungsvorschlag: 1: procedure duplicates(A : Array [0..n − 1] of N, x ∈ N ) 2: for i = 0 to n − 1 do 3: while A[i] 6= i 4: if A[A[i]] == A[i] then print “Duplikat gefunden:”, A[i]; return 5: else swap(A, i, A[i]) 6: print “keine Duplikate” 7: return Die Best-Case-Laufzeit ist O(1). Erreicht wird diese zum Beispiel bei einem Array, das mit 0, 0, . . . anf¨angt. 3
© Copyright 2024