Technische Universität Dresden 15012015 Institut für Theoretische Informatik Professur für Automatentheorie INFORMATIK FÜR BIOLOGEN Musterklausur WS 2014/15 Studiengang Biologie und Molekulare Biotechnologie Name: Vorname: Matrikelnummer: Studiengang: Aufgabe 1 Gegeben seien die zwei Algorithmen alg1 und alg2, die auf Schleifen aufbauen Beide Algorithmen sollen mit x = 2 und n = 5 aufgerufen werden procedure alg1 (var x, n : integer); var y : integer; y := 1; while n > 0 do y := y x; n := n 1 ; y := y 2; print(y) procedure alg2 (var x, n : integer); var i, y : integer; y := 1; if n > 0 then for i := 1 to n do y := y x ; y := y 2; print(y) 1
a) Welcher Wert für y wird jeweils ausgegeben? Geben Sie für beide Algorithmen jeweils den Ausgabewert von y an b) Geben Sie für beide Algorithmen jeweils die Funktion, die berechnet wird, ihre Argumente und die Berechnungsvorschrift an c) Modifizieren Sie alg2 so, dass nicht eine for-schleife, sondern eine for-downto- Schleife angewet wird Das Berechnungsverhalten von alg2 soll unverändert bleiben Aufgabe 2 Welche der folgen Aussagen ist wahr bzw nicht wahr? Begründen Sie Ihre Antwort a) {a, b} {b} = b) {{b}} P {a, b} c) Mengen sind ein geeignetes mathematisches Mittel, um ein Reagenzglas mit DNA- Strängen formal zu beschreiben d) Sei M := {1, 2, 3} und R M M definiert als R := {(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (3, 1)} R ist eine Äquivalenzrelation e) Jede for-schleife benötigt eine Anfangszahl f) Jede for-schleife kann durch eine while-schleife simuliert werden g) Das Python-Programm for i in range(1,4): print i gibt alle natürlichen Zahlen von 1 bis 4 aus h) Mithilfe des Algorithmus von Knuth, Morris und Pratt kann man Listen sortieren i) Das Aufbauen eines Heaps ist in linearer Zeit, das Sortieren eines Heaps in N log N Schritten möglich j) Die Zweierkomplementdarstellung der ganzen Zahl 6 ist 1001 Aufgabe 3 Welche der folgen Gleichheiten über Listen sind korrekt und welche nicht? Begründen Sie Ihre Antwort a) ((x: xs) ++ yys) ++ zzs = xxs ++ ((y: ys) ++ zzs) b) (xs: [ ]) = [xs] c) ([ ]: xs) = xs d) length (reverse [[1,2],[3,4],[5,6]]) = length [6,5,4,3,2,1] e) [x x <- [1,2,3,4,5], x^2 mod 4 == 0] = [2,4] f) filter (> 2) [0,1,2,3,4] = [x x <- [0,1,2,3,4], x < 2] g) length (map (sum) [[1,1],[1,1],[1,1]]) = 2 2
Aufgabe 4 Gegeben sei der Algorithmus klausur zum Suchen des Musters b = abcabca im Text a = abcaabcabcabcacabc notiert in Pseudocode function klausur (a, b : string; M, N : integer) : integer; var i, j : integer; i := M; j := M; repeat if a[i] = b[j] then i := i 1; j := j 1 else {Mismatch verursacht durch a[i], Textzeiger entsprech Fall 1 oder Fall 2 heraufsetzen; Musterzeiger an das Ende} if M j + 1 > skip[index(a[i])] then i := i + M j + 1 else i := i + skip[index(a[i])]; j := M until (j < 1) or (i > N); klausur := i + 1 Zusätzlich ist folges index-feld gegeben: a b c 1 2 3 a) Berechnen Sie zunächst das erforderliche skip-feld (für M = 7 und K = 3) Verwen Sie dazu den folgen Algorithmus: procedure initskip; {Berechnung des Sprungfeldes für das Muster b mithilfe von M und K} var i, j : integer; for i := 1 to K do skip[i] := M; for j := 1 to M do skip[index(b j )] := M j 3
Interpretieren Sie die Werte des skip-feldes bezüglich der konkreten Zeichen aus dem Text a Was drücken diese Werte aus? b) Erstellen Sie ein Abarbeitungsprotokoll zum Algorithmus klausur unter Nutzung der oben genannten Eingabewerte a (mit der Länge N = 18) und b (mit der Länge M = 7) Nehmen Sie in den Kopf des Abarbeitungsprotokolls folge Informationen auf: i j a[i] b[j] M j + 1 skip[index(a[i])] c) Nennen Sie den Namen des vorliegen Suchalgorithmus und mindestens zwei Eigenschaften Begründen Sie diese Aufgabe 5 Gegeben sind Typ und Definition folger drei Haskell-Funktionen, die nicht vollständig notiert sind: app z B app [1,2,3] [4,5,6] = [1,2,3,4,5,6] app :: [Int] -> [Int] -> [Int] app? y = y app (x: xs) y =? sumfacs z B sumfacs 3 = fac 0 + fac 1 + fac 2 + fac 3 = 1 + 1 + 2 + 6 = 10 sumfacs :: Int -> Int sumfacs? = 1 sumfacs n =? baumtiefe z B baumtiefe (Node 1 (Node 2 (Leaf 4) (Leaf 5)) (Leaf 3)) = 3 baumtiefe :: Tree a -> Int baumtiefe? = 1 baumtiefe (Node x l r) =? a) Vervollständigen Sie die drei Funktionen, und ersetzen Sie die Fragezeichen durch Haskell-Code b) Geben Sie die schrittweise Abarbeitung für den Aufruf baumtiefe (Node 1 (Node 2 (Node 4 (Leaf 6) (Leaf 7)) (Leaf 5)) (Leaf 3)) an 4
Aufgabe 6 Gegeben ist folges Python-Programm: def verfahren(liste): anzahl = len(liste) vertauscht = 1 while vertauscht: vertauscht = 0 # Anzahl der Elemente der Liste # vertauscht := True # vertauscht := False for index in range(0, anzahl 1, 1): if liste[index] > liste[index + 1]: # Dann stehen die beiden Elemente nicht # in der richtigen Reihenfolge wert = liste[index] liste[index] = liste[index + 1] liste[index + 1] = wert # Mit den drei Anweisungen werden die beiden # Elemente der Liste, die verglichen wurden, vertauscht return liste vertauscht = 1 print(verfahren([3, 2, 12, 4, 2, 9, 10, 13])) # vertauscht := True a) Wie oft wird die for-schleife im Programm durchlaufen? b) Welche Ausgabe bzw welche Ausgaben erfolgen auf dem Bildschirm? c) Welches aus der Vorlesung bekannte Verfahren realisiert das Python-Programm? Aufgabe 7 a) Beweisen Sie mithilfe der Listeninduktion die Aussage xs ++ [] = xs b) Geben Sie eine Haskell-Implementierung an, die in einer Liste mit ganzen Zahlen alle Elemente verdoppelt 5