Name: Seite 2 Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort. Aufgabe 1 (8 Punkte) 1. Wie viele negative Zahlen (ohne 0) lassen sich im 4-Bit-Zweierkomplement darstellen? 2. Wie viele Blätter besitzt ein Entscheidungsbaum zur Sortierung einer Eingabefolge der Länge n ∈ N? 3. Nennen Sie ein Sortierverfahren, das nicht auf Vergleichen beruht. 4. Welche Operationen stellt der ADT Keller zur Verfügung? 5. Welche Eigenschaft besitzt die Zahlenfolge, die bei der Inorder-Traversierung eines binären Suchbaumes (mit ganzzahligen Schlüsseln) entsteht? 6. Angenommen, der ADT Menge wird durch einen binären Suchbaum implementiert. Welche asymptotische worst-case-Laufzeit besitzt dann die Operation insert, wenn der Suchbaum bereits n Elemente enthält? 7. Nennen Sie einen Algorithmus, der das all-pairs-shortest-paths-Problem löst. 8. Wieviele Rotationen sind beim Einfügen eines Elements in einen AVL-Baum maximal notwendig? Name: Seite 3 Aufgabe 2 (8 Punkte) Alle Fragen beziehen sich auf die Programmiersprache Java ab Version 5. 1. Mit welchem Schlüsselwort werden Instanzvariablen deklariert? 2. Sei int a = (11 / 4 == 2) ? 23 : 42; Welchen Wert hat a? 3. Was bedeutet das Schlüsselwort this innerhalb einer Instanzmethode? 4. In welchem Fall fügt der Java-Compiler einer Klasse einen Defaultkonstruktor hinzu? 5. Nach welchem Prinzip werden Parameter bei einem Methodenaufruf übergeben? 6. Wo sind Variablen sichtbar, die mit dem Schlüsselwort private gekennzeichnet sind? 7. Welche Default-Werte besitzen die Einträge in einem boolean-Array? 8. Welche Methode wird beim Start eines Java-Programms zuerst ausgeführt? Name: Seite 4 Tragen Sie bei den Aufgaben 3 bis 9 Ihre Lösungen in den vorgesehenen Platz ein. Aufgabe 3 (6 Punkte) a) Tragen Sie die 32-Bit-Gleitkommadarstellung nach Definition des Skriptes für die Dezimalzahl 84 in die vorgesehenen Kästchen ein (3 Punkte). Vorzeichen Exponent reduzierte Mantisse b) Transformieren Sie die folgende, in 32-Bit-Gleitkommadarstellung gegebene Zahl in die entsprechende Dezimalzahl (3 Punkte). Vorzeichen 1 Dezimalzahl: Exponent reduzierte Mantisse 11111110 11000000000000000000000 Name: Seite 5 Aufgabe 4 (8 Punkte) Um ein Osterei verstecken zu können, hat der Osterhase einige Dinge zu beachten. Der folgende Automat soll überprüfen, ob ein Osterei vom Osterhasen korrekt versteckt wurde. • Der Osterhase muss im Verlauf des Arbeitsvorgangs das Ei pflücken, kochen, bemalen und verstecken. • Zuerst muss er das Ei vom Ostereierbaum pflücken. Es noch am Baum zu bemalen oder gar zu kochen oder den ganzen Baum zu verstecken, endet in einem sicheren Fehlschlag. • Ist das Ei ersteinmal gepflückt, sollte der Hase es nicht ein zweites Mal pflücken wollen, weil es dabei zerbrechen würde. • Nach dem Pflückvorgang muss das Ei genau einmal gekocht und mindestens einmal bemalt werden. Da die Ostereierfarbe wasserfest ist, kann das Bemalen sowohl vor als auch nach dem Kochen erfolgen. • Erst wenn das Ei gekocht und bemalt ist, darf der Osterhase es verstecken. Ansonsten kann es entweder nicht gefunden werden oder beginnt sofort auszutreiben. • Sollte der Osterhase mit dem Versteck nicht zufrieden sein, kann er das versteckte Ei beliebig oft neu verstecken, außerdem kann er die Bemalung noch an die Umgebung des Verstecks anpassen. a) Geben Sie die Zustandsüberführungsfunktion als Matrix an. (4 Punkte) Fortsetzung nächste Seite Name: Seite 6 b) Zeichnen Sie den Zustandsüberführungsgraphen des Automaten. Markieren Sie den Startzustand und den oder die gültigen Endzustände. Achten Sie darauf, dass Matrix und Graph konsistent sind! (4 Punkte) Name: Seite 7 Aufgabe 5 (3 Punkte) Gegeben sei folgende Java-Klasse: public class Fraglich1 { public static int methode(int a, int b) { b = b - a; a = a + b; b = a - b; return b; } } a) Was berechnet die Methode methode der Klasse Fraglich bei Eingabe zweier ganzer Zahlen a und b? (2 Punkte) b) Wie ist die Laufzeit der Methode methode in der O-Notation? (1 Punkt) Name: Seite 8 Aufgabe 6 (6 Punkte) Gegeben sei folgende Java-Klasse: public class Fraglich2 { public static int methode(int n, int a) { if (a < 0) throw new RuntimeException("Ungueltiger Wert fuer a"); int p = 1; while (a > 0) { if (a % 2 != 0) { p *= n; } n *= n; a /= 2; } return p; } } a) Was berechnet die Methode methode der Klasse Fraglich2 bei Eingabe zweier ganzer Zahlen n und a mit a ≥ 0? (4 Punkte) b) Wie ist die Laufzeit der Methode methode in der O-Notation? (2 Punkte) Name: Seite 9 Aufgabe 7 (6 Punkte) Sortieren Sie die Zahlenfolge 7 3 5 2 6 2 1 nach der Methode des Quicksort. Stellen Sie die Arbeitsweise des Algorithmus dar, indem Sie jeweils das Ergebnis eines rekursiven Durchlaufs in eine neue Zeile schreiben. Kreisen Sie das Pivotelement ein und markieren Sie die betrachtete Teilfolge. Notieren Sie außerdem neben der Zeile, welche Elementpaare in der Zeile jeweils getauscht wurden. Achten Sie dabei auch auf Elemente, die mit sich selbst getauscht werden. 7 3 5 2 6 2 1 getauschte Elementpaare: Name: Seite 10 Aufgabe 8 (3 Punkte) Nennen Sie jeweils ein Sortierverfahren, das für die jeweiligen Komplexitätsklassen in der O-Notation in Frage kommt. Beziehen Sie sich dabei auf die Sortierverfahren aus der Vorlesung. Sortierverfahren best case worst case O(n · log n) O(n · log n) O(n) O(n2 ) O(n · log n) O(n2 ) Name: Seite 11 Aufgabe 9 (4 Punkte) Gegeben seien die beiden Hashfunktionen h1 (x) = x2 mod 13 und h2 (x) = 3x mod 7 Fügen Sie die Zahlen 7, 9, 16, 6 in dieser Reihenfolge gemäß der Hashfunktion h1 in die folgende, schon teilweise belegte Hashtabelle ein. Gehen Sie nach dem Verfahren des geschlossenen Hashings vor und verwenden Sie als Sondierungsverfahren Double Hashing mit der Hashfunktion h2 . h(x) Element x 0 1 2 3 4 4 5 6 7 8 9 10 11 12 10 Name: Seite 12 Bei den Aufgaben 10 und 11 müssen Sie selber etwas zeichnen. Nutzen Sie den dafür vorgesehenen Platz. Aufgabe 10 (5 Punkte) 11 Gegeben sei folgender Suchbaum: 16 5 3 1 9 7 4 6 14 13 15 8 a) Löschen Sie aus dem Baum den Schlüssel 16 und zeichnen Sie den resultierenden Baum. (2 Punkte) b) Löschen Sie aus dem Baum den Schlüssel 11 und zeichnen Sie den resultierenden Baum erneut. (3 Punkte) Name: Seite 13 Aufgabe 11 (7 Punkte) Gegeben sei folgender AVL-Baum: 26 7 3 1 35 10 40 4 a) Fügen Sie in den Baum den Schlüssel 42 ein, indem Sie den Knoten direkt in den obigen AVL-Baum einzeichnen. Versehen Sie den kompletten Baum mit Balancen. (1 Punkt) Führen Sie eine eventuell notwendige Rotation aus und zeichnen Sie den reorganisierten Baum erneut. Vermerken Sie, welche Rotation Sie verwenden haben. (2 Punkte) b) Fügen Sie in den neu gezeichneten Baum in Aufgabenteil a) den Schlüssel 6 ein und versehen Sie den kompletten Baum mit Balancen. (1 Punkt) Führen Sie die notwendige Rotation aus und zeichnen Sie den reorganisierten Baum unten nochmals. Vermerken Sie die Art der Rotation, die Sie verwendet haben. (3 Punkte) Name: Seite 14 Tragen Sie bei den Aufgaben 12 und 13 Ihre Lösungen in den vorgesehenen Platz ein. Aufgabe 12 (6 Punkte) Gegeben sei der folgende gerichtete, gewichtete Graph G = (V, E): ∞ ∞ 4 B D 6 5 1 0 A 8 3 C ∞ F 2 9 2 ∞ 2 E 3 ∞ Berechnen Sie mit dem Algorithmus von Dijkstra kürzeste Wege von Knoten A zu allen anderen Knoten in G. Jedesmal, wenn im Verlauf des Algorithmus der Distanzwert für einen Knoten aktualisiert wird, schreiben Sie den neuen Wert in das nächste freie Kästchen neben den Knoten in der obigen Abbildung. Markieren Sie abschließend diejenigen Kanten in der Abbildung, die zu den gefundenen kürzesten Wegen gehören. (6 Punkte) Name: Seite 15 Aufgabe 13 (8 Punkte) Betrachten Sie den folgenden gerichteten Graph G = (V, E). Nehmen Sie in den folgenden beiden Aufgabenteilen an, dass G in Adjazenzlisten-Darstellung gegeben ist und dass alle Adjazenzlisten jeweils alphabetisch aufsteigend sortiert sind. Sollten Sie einen Fehler machen, streichen Sie die falsche Lösung deutlich durch und nutzen Sie die Ersatzgraphen auf der nächsten Seite. a) Führen Sie auf G eine Tiefensuche (Depth First Search, DFS), beginnend bei Knoten A durch. Beschriften Sie jeden Knoten mit der Nummer, die ihm während der Tiefensuche zugewiesen wird. Der Knoten A erhält die Nummer 0. Markieren Sie außerdem diejenigen Kanten, über die jeweils bislang noch unbesuchte Knoten entdeckt werden. (4 Punkte) 0 A H B G I K J F E C D b) Führen Sie auf G eine Breitensuche (Breadth First Search, BFS), beginnend bei Knoten E durch. Beschriften Sie alle Knoten in der Reihenfolge ihrer Entdeckung. Der Knoten E erhält die Nummer 0. Markieren Sie außerdem diejenigen Kanten, über die jeweils bislang noch unbesuchte Knoten entdeckt werden. (4 Punkte) A H B G I K J F E 0 D C Name: Seite 16 Ersatzgraph zu Aufgabenteil a): 0 A H B G I K J F E D C A B Ersatzgraph zu Aufgabenteil b): H G I K J F E 0 D C Name: Seite 17 Bei den Aufgaben 14 bis 16 müssen Sie selbst einige Zeilen Java-Code schreiben. Nutzen Sie den vorgesehenen Platz zwischen den geschweiften Klammern. Aufgabe 14 (5 Punkte) Eine natürliche Zahl, die durch ihre eigene Quersumme teilbar ist, heißt Harshad-Zahl. Ergänzen Sie in der gegebenen Klasse Harshad die Methode isHarshad, die überprüft, ob eine als Parameter übergebene Zahl eine Harshad-Zahl ist. public class Harshad { public static boolean isHarshad(int zahl) { if (zahl <= 0) throw new RuntimeException("Fehler: zahl ist nicht positiv!"); } } Name: Seite 18 Aufgabe 15 (5 Punkte) Die Stirling-Zahl zweiter Art Sn,k ist eine Zahl aus der Kombinatorik. Sie gibt die Anzahl der Möglichkeiten an, eine n-elementige Menge in k nichtleere disjunkte Teilmengen aufzuteilen. Berechnen lässt sich die Stirling-Zahl über die rekursive Formel Sn,k = Sn−1,k−1 + k · Sn−1,k mit S0,0 = Sn,n = 0 und Sn,0 = S0,k = 1 für alle n, k > 0. Implementieren Sie diese rekursive Formel. Ergänzen Sie dazu die Methode S in der Klasse Stirling. public class Stirling { public static int S(int n, int k) { if (n < 0 || k < 0) throw new RuntimeException("Fehler: n oder k ist nicht positiv!"); } } Name: Seite 19 Aufgabe 16 (12 Punkte) Implementieren Sie den abstrakten Datentyp Liste mit Hilfe des ADTs Keller. Ergänzen Sie dazu die leeren Methoden in der Klasse KellerListe. Eine KellerListe speichert alle Listenelemente, die vor dem aktuellen Element liegen, in einem Keller davor und alle übrigen Listenelemente in einem zweiten Keller dahinter. Das aktuelle Element der KellerListe ist das oberste Element des Kellers dahinter. Die Elemente, die in der KellerListe gespeichert werden, sind vom Typ Object. Achten Sie auf eine geeignete Fehlerbehandlung, indem Sie im Fehlerfall eine RuntimeException werfen. public class KellerListe implements Liste { private Keller davor, dahinter; public KellerListe() { davor = new VerweisKeller(); dahinter = new VerweisKeller(); } public boolean empty() { } public boolean endpos() { } public void insert(Object x) { } Fortsetzung nächste Seite Name: public void advance() { } public void reset() { } public Object elem() { } public void delete() { } } Seite 20