Übungen zur Informatik I Klausurvorbereitung1 Diese Aufgaben sind zur expliziten Klausurvorbereitung gedacht. Der Sinn ist also, sie möglichst allein und unter Klausurbedingungen zu lösen. Natürlich sind auf diesem Blatt mehr Aufgaben, als in einer zweistündigen Klausur abgefragt werden. Einige Aufgaben sind mit (schwer) markiert, d.h. ich halte sie für zu schwer, um sie als Klausuraufgabe zu verwenden, ohne jedoch dafür Garantie zu übernehmen. Trotzdem kann es sinnvoll sein, diese Aufgaben für das bessere Verständniss durchzurechnen. Mit Sicherheit ist dieser Übungszettel allein keine perfekte Klausurvorbereitung da z.B. das Thema Wahrheitstabellen vollständig fehlt. Daher empfielt es sich, noch einmal alle herausgegebenen Übungszettel vor der Klausur durchzuschauen. Außerdem ist es möglich, dass du auf diesem Blatt Aufgaben findest, die du nicht bearbeiten kannst, weil der nötige Stoff nicht in der Vorlesung behandelt wurde. Solche Aufgaben kannst du ohne schlechtes Gewissen einfach ignorieren, diese kommen dann bestimmt nicht in der Klausur dran. 1 Turingmaschine Erkläre jeweils deine Vorgehensweise und kommentiere deine Zustände. 1. Gib eine Turing-Maschine an, die eine Subtraktion ganzer Zahlen implementiert. (Ausgabe für eine Eingabe der Form ... B B B a a a B a B B ... wäre ... B B a a B B ..., allgemeiner wird ... B an B am B ... mit m ≤ n zu ... B an−m B .... Beide Wörter sind in der Eingabe also durch ein B getrennt. Der Lesekopf befindet sich am Anfang auf dem am weitesten links stehenden a. 2. Gib eine Turingmaschine an, welche eine Eingabe über dem Alphabet {a, b}∗ alphabetisch sortiert. So wird z.B. aus ... B B a b a b b a b a B B ... die Folge ... B B a a a a b b b b B B .... 3. (schwer) Gib eine Turingmaschine an, welche die Eingabe zweier Binärzahlen auf dem Alphabet {0, 1}∗ akzeptiert und addiert. Die Ausgabe soll dabei hinter die beiden Zahlen geschrieben werden und genau wie die beiden Eingabezahlen durch ein B von denselbigen getrennt sein. Die Eingabe darf zerstört werden. Beispiel: ... B B 0 1 0 B 1 0 1 1 B ... → ... B B X X X B X X X X B 1 1 0 1 B ... Dabei steht das Zeichen X für ein beliebiges Zeichen als Ersatz für die möglicherweise zerstörte Eingabe. 2 Grammatiken / endliche Automaten 1. Finde Grammatiken für die folgenden Sprachen: • L = {an bm | n, m > 0} • L = {an bm | n > m > 0} • L = {an bn | n ≥ 0} • L = an bn c2n | n > 0 2. Welche der obigen Grammatiken ist rechtsregulär, welche linksregulär, welche kontextfrei, welche kontextsensitiv? 3. Finde für die regulären Grammatiken aus 1. einen endlichen Automaten, welcher die Sprache akzeptiert. 4. Gib für die letzte Grammatk die Ableitung des Wortes aaabbbcccccc an. 5. (schwer) Gib in EBNF die Grammatik aller korrekten boolschen Ausdrücke über den Variablen {a, b, c, d} und den Operatoren {∨, ∧, ¬} an. Dabei ist auf korrekte Klammerung zu achten, d.h. (a ∨ b) ist ein korrekter boolscher Ausdruck, a ∨ b jedoch nicht. 3 Binärzahlen / Hexadezimalsystem 1. Stell die Zahlen 52, 41, 127, 19 als 8-Bit Zahlen im Binärsystem und im Hexadezimalsystem dar. 2. Berechne die Binärdastellung von −127 und −91 durch das Zweierkomplement. 3. Berechne binär 41 · 16, 48 : 16, 127 + 128 und 127 − 91. 4. Was bedeutet es, eine Zahl in der Exponent-Mantisse-Form darzustellen? 4 Java 1. Betrachte die Code-Zeile x = (y = 3 < ++int2) Von welchem Datentyp müssen x, y und int2 sein, damit diese Zeile Sinn macht, und welchen Wert haben die Variablen nach der Ausführung der Zeile, falls eine Zuweisung passiert? 2. Beschreibe fünf Merkmale, welche den Unterschied zwischen der objektorientierten und der imperativen Programmierung ausmachen. 3. Schreibe eine Java-Methode, welche die n-te Fibonacci Zahl interativ und rekursiv berechnet. Dabei gilt f ib (1) = f ib (2) = 1 und f ib (n) = f ib (n − 1) + f ib (n − 2) für n ≥ 3. 4. Schreibe eine rekursive und eine iterative Java-Methode, welche für ein als Feld von Charakter-Werten gegebenes Wort überprüft, ob es sich um ein Palindrom handelt. Ein Palindrom ist ein Wort, welches von hinten wie von vorne gelesen das gleiche Wort ergibt. 5. Was bedeutet Tiefengleichheit? Gib ein Beispiel an. Was bedeutet early binding, wodurch wird early binding im Quelltext gesichert? 6. Was sind abstrakte Klassen und interfaces, was ist der Unterschied? 7. Sieh dir insbesondere noch einmal die Beispiele auf den Aufgabenzetteln für den Aufrufstack an! (z.B. Bl.4, Aufg. 2 und Bl.5, Aufg.2, 1.) 5 O-Notation / Master-Theorem 1. Gib die Laufzeit deines Algorithmus aus 4.4 in der O-Notation mit Begründung an. 2. Gib für die folgenden Rekurrenzrelaionen eine Laufzeit mit Hilfe der O-Notation an, wobei jeweils T (1) = 1 gilt (mit Nennung des verwendeten Falls und kurzer Begründung, warum dieser Fall zutrifft): +n+5 • T (n) = 4 · T n 2 n • T (n) = 8 · T 4 + n2 1 Frank c Werner, Peter Schlicht 28.01.2006. Keine Garantie für Relevanz oder Korrektheit. Gröbere Fehler bitte an [email protected] Die Aufgaben sind teilweise aus älteren Info I Klausuren oder Übungsblättern entnommen. • T (n) = T n 2 • T (n) = 3 · T • T (n) = 4 · T +1 + log (n) n 2 n 2 +n • (schwer) T (n) = 4 · T n 2 + n2 log(n) Kleiner Tip zur letzten Rekurrenzrelation: Eigentlich ist hier das Master-Theorem nicht ohne Trick anwendbar. Benutze log(n) < nε ∀ ε > 0 und genügend großes n ∈ N. 3. Gib die Laufzeit von Mergesort mit Hilfe des Mastertheorems an. 4. (schwer) Sei n = 2p . (a) Ein Algorithmus zur Berechnung des Matritzenprodukt zweier gleichgroßer n × n-Matrizen geht wie folgt vor: • falls n = 2, so berechnet er das Produkt in konstanter Zeit (also in O (1)). × n und berechnet jeweils • Andernfalls zerlegt er die Matrizen in 8 Teilmatrizen A1 , A2 , A3 , A4 , B1 , B2 , B3 , B4 der Größe n 2 2 A1 · B1 , A2 · B3 , A3 · B1 , A4 · B3 , A1 · B2 , A2 · B4 , A3 · B2 und A4 · B4 rekursiv. Das Zusammenfügen der Ergebnisse geht ebenfalls in O (1). Gib eine Laufzeitabschätung für diesen Algorithmus mit Hilfe der O-Notation an. (b) Ein anderer Algorithmus geht ähnlich vor, muss jedoch nur 7 Matrizenprodukte rekursiv ausrechnen. Wie steht es um seine Laufzeit in der O-Notation? 5. Gibt die Laufzeit des Codefragments aus 7.1. exakt (Angabe Kostenmaß, Kostenfunktion) und in der O-Notation an. 6 Algorithmenentwurf Bei solchen Aufgaben gibt es normalerweise Sonderpunkte, falls dein Algorithmus optimale Laufzeit hat. 1. Gegeben sei eine Folge der Länge n von paarweise verschiedenen Zahlen mit n ungerade. Beschreibe einen Algorithmus, welcher den Median der Folge ausgibt. Der Median einer solchen Folge ist die Zahl, für die genau n−1 -Zahlen größer und n−1 -Zahlen kleiner sind. 2 2 2. (fast schwer) Betrachte den Datentyp Queue (“Warteschlange“), also einen first-in-first-out Datentyp. Wie du weißt, ist ein Stack ein firstin-last-out Datentyp (“Stapel“). Gib eine mögliche Implementierung einer Queue an, in dem du zwei Stacks, aber keine eigentliche Queue verwendest. Wie muss das Einfügen, wie das Entfernen eines Elementes realisiert werden? Gibt dafür Algorithmen an. 7 Beweise 1. Sei n ∈ N. Gegeben ist das Programmstück i=0; x=0; while(i<n) { x = x+2^i; i++; } Zeige mittels Schleifeninvariante, dass nach Ausführung der Schleife x = 2n − 1 gilt. n P n·(n+1)·(2n+1) 2. Beweise mittels vollständiger Induktion, dass i2 = 6 i=1 8 Sortieren 1. Sortiere die folgenden Zahlen mit Quicksort, verwende dabei jeweils das erste Element als Pivot: 4, 2, 9, 8, 10, 1, 5, 3, 7, 6 2. Sortiere die folgenden Zahlen mit Mergesort: 10, 1, 5, 8, 3, 4, 9, 2, 7, 6 3. Sortiere die Zahlen aus 8.2. mit Heapsort. 9 Abstrakte Datentypen 1. Betrachte den Datentyp “endliche Menge“. Definiere samt Angabe von Signaturen und Axiomen: • Einen Konstruktor create für die leere Menge • Einen Konstruktor add, der ein Element zu einer Menge hinzufügt (ohne auf Duplikate zu überprüfen) • Eine Funktion is in, welche überprüft, ob ein Element in einer Menge enthalten ist • Eine Funktion insert, welche ein Element in eine Menge einfügt (jetzt mit der Überprüfung auf Duplikate) • Eine Funktion union für die Mengenvereinigung. 2. Betrachte den ADT Queue aus der Vorlesung (in der Klausur wären die Axiome von den Folien jetzt nocheinmal aufgeführt). Gib von folgenden Termen die Normalformen mit Herleitung über die Axiome an: • deq (enq (deq (enq (enq (enq (create, 6) , 3) , 1)) , 4)) • is empty (deq (deq (enq (enq (enq (create, 1) , 2) , 3)))) • deq (enq (enq (deq (enq (create, 1)) , 2) , first (enq (deq (enq (create, 5)) , 6)))) 3. Gib für den ADT Nat aus der Vorlesung die Signaturen und die Axiome für die Funktionen power zur Berechnung von Potenzen und equals zur Überprüfung auf Gleichheit an. 10 Bäume 1. Zeichne den binären Suchbaum, welcher durch Einfügen der folgenden Zahlen in der gegebenen Reihenfolge entsteht: 4, 7, 5, 2, 3, 1, 8 2. Um ein Element im Binärbaum zu löschen vereinbaren wir, dass immer das kleinste Element des linken Kindbaumes als Ersatz gewählt wird. Lösche im obigen Baum die 4, füge die 6 hinzu, lösche die 5 und entferne danach die 6 wieder. 3. Formuliere rekursiv eine Methode, die in einem Heap nach einem Element sucht.