Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 Klausur Informatik 1 Wintersemester 2005/2006 Prof. Dr. Wolfgang May 4. April 2006, 11-13 Uhr Bearbeitungszeit: 90 Minuten Aufgabe erreichbare Punkte 1 10 2 14 3 16 4 26(+8)* 5 12 6 12 Gesamt: erreichte Punkte / 10 / 14 / 16 / 26(+8)* / 12 / 12 /90(+8)* Wir wünschen viel Erfolg! Bei der Klausur sind keine Hilfsmittel (Skripte, Taschenrechner etc.) erlaubt. Papier wird gestellt. Benutzen Sie nur die ausgeteilten, zusammengehefteten Blätter für Ihre Antworten. Schreiben Sie auf jedes Blatt oben Ihren Namen und Ihre Matrikelnummer. Schreiben Sie mit blauem/schwarzem Kugelschreiber, Füller etc.; Bleistift ist nicht erlaubt. meine Note soll mit Matrikelnummer so bald wie möglich auf der Vorlesungs-Webseite veröffentlicht werden. meine Note soll nicht veröffentlicht werden; ich erfahre sie dann aus Munopag/Wopag (bzw. beim Prüfungsamt der Informatik). (zutreffendes bitte ankreuzen) 1 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 Aufgabe 1 [Zahlendarstellung, Boolsche Audrücke] [10 Punkte] a) Addieren Sie die Zahlen 26 und 3 binär. [2 Punkte] b) Multiplizieren Sie die Zahlen 26 und 3 binär. [2 Punkte] c) Konvertieren Sie 136 in eine Hexadezimalzahl. [2 Punkte] d) Addieren Sie die beiden Hexadezimalzahlen 6B und 57 und wandeln Sie das Ergebnis in eine Dezimahlzahl um. [4 Punkte] Lösung: a) + ∗ 2610 310 2910 = = = 110102 000112 111012 2610 310 = = 7810 = 110102 000112 110102 1101002 10011102 b) + c) 13610 = 810 ∗ 16110 + 810 ∗ 16010 = 12810 + 810 = 8816 10710 d) + 8710 19410 = 6B16 = 5716 = C216 2 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 Aufgabe 2 [Grammatik] [14 Punkte] a) Geben Sie eine Grammatik in BNF für die Menge aller Palindrome aus dem Alphabet {a, b} an (Palindrome sind Ausdrücke, die sowohl vorwärts als auch rückwärts dasselbe Wort ergeben, z.B. abba, bbabb). [4 Punkte] b) Leiten Sie mit den Produktionsregeln Ihrer Grammatik das Wort aababaa aus dem Startsymbol ab. [2 Punkte] c) Geben Sie einen deterministischen endlichen Automaten an der alle Palindrome aus dem Alphabet {a, b} mit einer Länge von mindestens 1 bis maximal 4 Zeichen erkennt. [8 Punkte] Lösung: a) S = {S}, T = {a, b, }, N = {S}, S := a|b|aSa|bSb| b) S → aSa → aaSaa → aabSbaa → aababaa b b a a a a a a b c) b b b b a a 3 von 12 b Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 Aufgabe 3 [Heaps] Gegeben sei die Zahlenfolge 5, 10, 4, 7, 9, 17, 2, 6, 3, 18, 23, 16 [16 Punkte] a) Fügen Sie die Zahlen aus der gegebenen Zahlenfolge nacheinander in einen anfangs leeren Heap ein. Zur Erinnerung: das kleinste Element befindet sich immer an der Wurzel. [6 Punkte] b) Erklären Sie kurz wie man mit Hilfe eines Heaps Zahlen sortiert (HeapSort-Algorithmus). [5 Punkte] c) Führen Sie den HeapSort-Algorithmus an obigem Heap durch, allerdings nicht komplett, sondern nur für die ersten 4 Zahlen. Achten Sie darauf dass Ihr Vorgehen beim Lesen nachvollziehbar ist. [5 Punkte] Lösung: a) Heap als Array (von oben nach unten und links nach rechts): 2,3,4,6,9,16,5,10,7,18,23,17 b) Wenn der Heap vollständig aufgebaut ist, befindet sich das kleinste Element in der Wurzel. Dieses Element entfernt man und schreibt es in ein Array. An seine Stelle rückt nun das letzte Element des Heaps. Nach dem Einfügen wird sodann die HeapEigenschaft wieder hergestellt, indem das neue Wurzelelement per Durchsickern“an ” seine neue Position gebracht wird. Beim Durchsickern vertauscht man dabei das jeweilige Elter-Element mit dem kleineren der beiden Kind-Knoten. So verfährt man, bis der Heap vollständig abgearbeitet ist. Das Array mit den herausgeschriebenen Wurzelelementen enthält die sortierte Folge in aufsteigender Reihenfolge. c) • Oberstes Element entfernen und in das Array schreiben: 2 • Letztes Element (17) nach oben ziehen und Heap neu aufbauen (durchsickern): 3,6,4,7,9,16,5,10,17,18,23 • Oberstes Element entfernen und in das Array schreiben: 2,3 • Letztes Element (23) nach oben ziehen und Heap neu aufbauen (durchsickern): 4,6,5,7,9,16,23,10,17,18 • Oberstes Element entfernen und in das Array schreiben: 2,3,4, • Letztes Element (18) nach oben ziehen und Heap neu aufbauen (durchsickern): 5,6,16,7,9,18,23,10,17 • Oberstes Element entfernen und in das Array schreiben: 2,3,4,5 • Letztes Element (17) nach oben ziehen und Heap neu aufbauen (durchsickern): 6,7,16,10,9,18,23,17 4 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 Aufgabe 4 [Java] [26(+8*) Punkte] Gegeben sei folgende Klasse Chars zur Verwaltung von Zeichenketten (als Arrays von chars): public boolean contains(Chars other) public class Chars {{} public char[] array; public Chars(char[] a) { array = a; } public Chars(String s) { array = s.toCharArray(); } public int getLength() { return array.length; } public int getFirstIndex(char c) { //... } public boolean equals(Object other) { //... } public boolean contains(Chars other) { //... } public boolean containsScattered(Chars other) { //... } } Chars example = new Chars("abacab"); erzeugt zum Beispiel ein Objekt, das die Zeichenkette [’a’, ’b’, ’a’, ’c’, ’a’, ’b’] 0 1 2 3 4 5 der Länge 6 repräsentiert. Die Array-Indizes laufen hierbei von 0 bis 5. 5 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 a) Ergänzen sie die Klasse um folgende Methoden: • getFirstIndex(char c) liefert den Index des ersten Vorkommens (von links angefangen) eines Zeichens in einer Zeichenkette. Mit obigem Beispiel: example.getFirstIndex(’b’) soll den Wert 1 zurück liefern [4 Punkte] • equals(Object other) vergleicht zwei Zeichenketten. Zwei Zeichenketten sind gleich wenn sie (1) gleich lang sind und (2) die Zeichen an jeder Stelle übereinstimmen. [8 Punkte] • contains(Chars other) überprüft ob eine Zeichenkette eine zweite Zeichenkette other zusammenhängend enthält. [’a’, ’b’, ’a’, ’c’,’a’, ’b’] enthält zum Beispiel – [’a’, ’b’, ’a’] und [’c’, ’a’], – aber nicht [’a’, ’b’, ’c’]. [7 Punkte] • containsScattered(Chars other) überprüft ob eine Zeichenkette eine zweite Zeichenkette other auch unzusammenhängend enthält. [’a’, ’b’, ’a’,’c’, ’a’, ’b’] enthält zum Beispiel – zeichenweise verteilt – [’a’, ’b’, ’c’]. [7 Punkte] b) (nur Zusatzpunkte) Geben sie für die Methoden getFirstIndex() contains() containsScattered() die asymptotische Laufzeit an, abhängig von der Länge der Zeichenketten. [8* Punkte] 6 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 Lösung: a) public class Chars { public static void main(String[] args) { Chars example = new Chars("abacab"); System.out.println("getFirstIndex(’b’): " +example.getFirstIndex(’b’)); System.out.println("getFirstIndex(’k’): " +example.getFirstIndex(’k’)); System.out.println("abacab == abacab?: " +example.equals(example)); System.out.println("abacab == abacab?: " +example.equals(new Chars("abacab"))); System.out.println("abacab == abacap?: " +example.equals(new Chars("abacap"))); System.out.println("abacab contains abacab?: " +example.contains(new Chars("abacab"))); System.out.println("abacab contains* abacab?: " +example.containsScattered(new Chars("abacab"))); } public public public public char[] array; Chars(char[] a) { array = a; } Chars(String s) { array = s.toCharArray(); } int length() { return array.length; } public int getFirstIndex(char c) { int i=0; while(i<length()) { if(c==array[i]) break; i++; } if(i == length()) return -1; return i; } 7 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 public boolean equals(Object other) { if(!(other instanceof Chars)) return false; Chars o = (Chars) other; if(length() != o.length()) return false; boolean result = true; for(int i=0;i<length();i++) { if(array[i]!=o.array[i]) { result = false; break; } } return result; } public boolean contains(Chars other) { if(other.length() > length()) return false; boolean result = true; for(int i=0; i<=length()-other.length(); i++) { result = true; for(int j=0; j<other.length();j++) { if(array[i+j] != other.array[j]) { result = false; break; } } if(result==true) break; } return result; } public boolean containsScattered(Chars other) { if(other.length() > length()) return false; int i=0; int j=0;boolean result = false; for(i=0; i<length() && result==false; i++) { if(array[i] == other.array[j]) { j++; if(j==other.length()) result = true; } } return result; } } 8 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 b) getFirstIndex(): O(n) (2 Punkte*) contains(): O(n*m) (3 Punkte*) containsScattered(): O(n) (3 Punkte*) 9 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 Aufgabe 5 [Master-Theorem] Betrachten Sie folgenden Algorithmus: [12 Punkte] public static int parity(int[] array, int from, int to) { int result; if(from==to) result = array[from]; else { int mid = (from+to) / 2; int left = parity(array, from, mid); int right = parity(array, mid+1, to); result = left + right - 2*left*right; } return result; } a) Vollziehen Sie den Aufruf int n = parity([1, 0, 1, 1], 0, 3) grafisch nach und berechnen Sie das Ergebnis. [4 Punkte] b) Stellen Sie eine Rekurrenzgleichung für obiges Code-Fragment auf. [4 Punkte] c) Berechnen Sie die asymptotische Laufzeit mit Hilfe des Mastertheorems. [4 Punkte] Lösung: a) int n = parity([1,0,1,1],0,3); ==> mid = 1; ==> left = parity([1,0,1,1],0,1); ==> mid = 0; ==> left = parity([1,0,1,1],0,0); ==> return 1; ==> right = parity([1,0,1,1],1,1); ==> return 0; ==> return 1; ==> right = parity([1,0,1,1],2,3); ==> mid = 2; ==> left = parity([1,0,1,1],2,2); ==> return 1; ==> right = parity([1,0,1,1],3,3); ==> return 1; ==> return 0; ==> return 1; 10 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 b) Hier stellt sich erst die Frage nach dem Kostenmaß. Vorschlag: Zuweisung = 1, alle arithmetisch und/oder booleschen Operationen = 1. Damit ergibt sich folgende Rekurrenzgleichung: T(1) = 1 (if-Zweig) T(n) = 2 * T(n/2) + 3 + 2 + 3 + 4 = 2 (mid-Berechnung) (left und right Zuw.) (result 1.) (result 2.) * T(n) + 12. c) Mit obiger Rekurrenzgleichung ergibt sich a = 2, b = 2, k = 0. => a = 2 > 1 = 20 = bk . Das entspricht dem 1. Fall. => T (n) = O(nlogba ) = O(nlog22 ) = O(n1 ) = O(n). 11 von 12 Name,Vorname, Matrikelnummer Bitte unbedingt leserlich ausfüllen Klausur Informatik 1, 04.04.2006 Aufgabe 6 [Fibonacci-Funktion] Gegeben sei die Fibonacci-Funktion mit [12 Punkte] • f ib(0) := f ib(1) := 1 • f ib(n + 1) := f ib(n) + f ib(n − 1) ∀n ∈ N, n > 1 a) Berechnen Sie f ib(5). [3 Punkte] b) Wie lautet der größte gemeinsame Teiler (ggT ) von f ib(4) und f ib(5)? [1 Punkt] c) Zwei natürliche Zahlen x und y sind genau dann teilerfremd, wenn der größte gemeinsame Teiler ggT (x, y) = 1 gilt. Beweisen Sie folgende Aussage mit Hilfe vollständiger Induktion: Zwei benachbarte Fibonacci Zahlen f ib(n) und f ib(n + 1) sind immer teilerfremd. Hinweis: “k ist ein Teiler von x” kann man mathematisch so aufschreiben: ∃i ∈ N k · i = x (Falls k ein Teiler von x ist, dann gibt es eine natürliche Zahl i so dass x in die Faktoren k und i zerlegt werden kann). [8 Punkte] Lösung: a) f ib(5) = f ib(4) + f ib(3) = f ib(3) + f ib(2) + f ib(2) + f ib(1) = f ib(2) + f ib(1) + f ib(1) + f ib(0) + f ib(1) + f ib(0) + f ib(1) = f ib(1) + f ib(0) + f ib(1) + f ib(1) + f ib(0) + f ib(1) + f ib(0) + f ib(1) = 8 b) f ib(5) = 8, f ib(4) = 5 ⇒ ggT (5, 4) = 1 ⇒ f ib(4) und f ib(5) sind teilerfremd. c) Induktionsanfang: Die Aussage A2(1) ist richtig, da f ib(1) = 1 und f ib(2) = 2 teilerfremd sind. Induktionsvoraussetzung: Sei die Aussage A2(n) bewiesen. Induktionsschritt: (A2(n) => A2(n + 1)) Widerspruchbew. Wären f ib(n + 1) und f ib(n + 2) nicht teilerfremd, dann gäbe es eine natürliche Zahl k > 1, so dass f ib(n + 1) = a ∗ k und f ib(n + 2) = b ∗ k mit a, b Element von n. Da f ib(n + 2) = f ib(n) + f ib(n + 1) nach Def. gilt, gälte dann b ∗ k = f ib(n) + a ∗ k, also f ib(n) = (b − a) ∗ k. Dann wären f ib(n) und f ib(n + 1) nicht teilerfremd, was ein Widerspruch zur I.V. ist. 12 von 12