FH Braunschweig/Wolfenbüttel Fachbereich Informatik Prof. Dr. R. Rüdiger Wolfenbüttel, den 20. Juni 2006 Klausur Algorithmik I / AuD I SS 06 Hinweise: • Es sind beliebige schriftliche Unterlagen als Hilfsmittel zugelassen, nicht jedoch Rechner, Handys oder Taschenrechner, also generell keine Elektronik“. ” • Die Klausur besteht aus 5 Aufgaben. • Tragen Sie Ihre Ergebnisse auf diesem Deckblatt ein. Die Anzahl der vorgedruckten Kästchen muß nicht unbedingt gleich der Zahl der einzutragenden Ergebnisse sein. Name: Vorname: Mat.-Nr.: Freiversuch (F0) oder F1/F2/F3-Prüfung? bitte ankreuzen: F0 F1 F2 F3 erreichte Punktzahl/Note: WICHTIG: Entscheidend für die Bewertung sind die Ergebnisse, die Sie auf diesem Blatt eingetragen haben. Geben Sie aber bitte alle Blätter mit ab, die Ihre Vorüberlegungen und Zwischenergebnisse zeigen (jedes Blatt mit Namen, Vornamen und Matrikelnummer versehen). Ihre Ergebnisse Aufgabe 1 (Punktzahl: 6/24) a) Anzahl Aufrufe: . . . . . . . . . . . . . . . . . . . . . . . . . . Aufgabe 3 (Punktzahl: 4/24) Resultate: b) Belegungen von L und R: L: Aufgabe 4 (Punktzahl: 4/24) R: a) preorder: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .......................................... .......................................... L: R: L: b) postorder: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .......................................... .......................................... R: L: R: R: Aufgabe 2 (Punktzahl: 6/24) Aufgabe 5 L: p (Punktzahl: 4/24) a) Richtig/Falsch, anzugeben als R/F: (1) (2) (3) (4) (5) b) Werte: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .......................................... r x Die Aufgaben Aufgabe 1 Merge(A, p, q, r) 1 n1 ← q − p + 1 2 n2 ← r − q 3 create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1] 4 for i ← 1 to n1 5 do L[i] ← A[p + i − 1] 6 for j ← 1 to n2 7 do R[j] ← A[q + j] 8 L[n1 + 1] ← ∞ 9 R[n2 + 1] ← ∞ 10 i ← 1 11 j ← 1 12 print(L) nach print stets neue Zeile 13 print(R) 14 for k ← p to r 15 do if L[i] ≤ R[j] 16 then A[k] ← L[i] 17 i←i+1 18 else A[k] ← R[j] 19 j ←j+1 (Punktzahl: 6/24) Merge-Sort(A, p, r) 1 if p < r 2 then q ← b(p + r)/2c 3 Merge-Sort(A, p, q) 4 Merge-Sort(A, q + 1, r) 5 Merge(A, p, q, r) In dieser Aufgabe geht es um die Arbeitsweise von Mergesort. Die anfängliche Belegung des Arrays A ab Index 1 sei 27, 57, 22, 16, 90. Gestartet wird Merge-Sort(A, 1, 5). a) Wie häufig wird die Prozedur (in JavaNomenklatur: Methode“) Merge-Sort akti” viert? Hinweis: Der erste Aufruf ebenso wie die Fälle, in denen diese Prozedur nichts tut (wenn also p ≥ r), sollen mitgezählt werden. b) Geben Sie die Arraybelegungen von L und R an (nur diese!), wie sie jeweils in den Zeilen 12 und 13 in Merge bestehen. Das Element ∞ soll nicht mit angegeben werden. Aufgabe 2 (Punktzahl: 4/24) Der folgende Text ist dem Skript entnommen (nur zur Erinnerung): Ein B-Baum ist durch die folgenden Eigenschaften definiert: • Jeder Knoten x besitzt die folgenden Felder: die Anzahl n[x] von Schlüsseln die n[x] Schlüssel selbst: key i [x] in aufsteigend sortierter Reihenfolge einen booleschen Wert leaf [x]: ist der Knoten ein Blatt? • Jeder innere Knoten hat n[x] + 1 Zeiger ci [x]; die Zeiger von Blättern sind undefiniert. • Wenn ki ein Schlüssel ist in dem Unterbaum mit Wurzel ci [x], dann gilt k1 ≤ key 1 [x] ≤ k2 ≤ key 2 [x] ≤ · · · ≤ kn[x] ≤ key n[x] [x] ≤ kn[x]+1 • Alle Blätter liegen auf der gleichen Höhe. • Es gibt einen für jeden B-Baum charakteristischen Parameter t ≥ 2, den minimum degree. Jeder Knoten außer der Wurzel hat mindestens t − 1 Schlüssel. Jeder innere Knoten außer der Wurzel hat mindestens t Kinder. Jeder Knoten hat höchstens 2t − 1 Schlüssel und damit 2t Kinder. Ein Knoten ist voll, wenn er genau 2t − 1 Schlüssel enthält. a) Die folgenden Beispiele sollten B-Bäume darstellen (in der Darstellung des Skripts entsprechend einer PreorderTraversierung). Leere Plätze eines Knotens (einer Seite“) sind durch x gekennzeichnet. ” Möglicherweise gibt es jedoch Widersprüche zu den oben abgedruckten definierenden Eigenschaften eines BBaums. Entscheiden Sie für jeden der Fälle (1) - (5), ob ein korrekt aufgebauter B-Baum vorliegt oder nicht. (1) t = 3 (4) t = 3 +--------------------------------+ | 19 49 76 x x | | 7 13 x x x | | 1 3 5 x x | | 9 11 x x x | | 15 17 x x x | | 25 37 x x x | | 21 23 x x x | | 27 29 31 33 35 | | 39 41 43 45 47 | | 56 68 x x x | | 51 52 54 x x | | 58 60 62 64 66 | | 70 72 74 x x | +--------------------------------+ +------------------------+ | 7 13 24 x x | | 1 3 5 x x | | 9 11 x x x | | 15 16 18 20 22 | | 26 28 x x x | +------------------------+ (2) t = 2 +--------------------------+ | 17 28 x | | 5 9 x | | 1 3 x | | 7 x x | | 21 x x | | 19 x x | | 22 24 26 | | 32 x x | | 30 x x | | 34 36 38 | +--------------------------+ (5) t = 2 +--------------------------+ | 11 20 x | | 3 x x | | 1 x x | | 5 7 9 | | 17 x x | | 13 15 x | | 18 x x | | 28 x x | | 22 24 26 | | 30 x x | +--------------------------+ (3) t = 5 +------------------------------------+ | 13 x x x x x x x x | | 1 3 5 7 9 11 x x x | | 15 16 18 20 22 24 26 28 x | +------------------------------------+ b) Was ergibt sich bei einer Postorder-Traversierung des folgenden etwas schlampig gezeichneten B-Baums? Tragen Sie die durchlaufenen Schlüsselwerte vorne in den vorgesehenen 2 Zeilen einfach fortlaufend hintereinander ein. 12 3 9 1 16 11 5 7 18 20 14 Aufgabe 3 (Punktzahl: 4/24) Welche Werte gibt das folgende Programm bei den vier Aufrufen von proc(. . . ) in den Zeilen 12, 13, 14 und 15 jeweils aus? 1 2 3 4 5 6 7 8 9 10 public class Aufgabe3 { private static String c(int x) { if (x < 10) return x + ””; return (char) (x − 10 + (int)’A’) + ””; } public static String proc(int x, int B) { return ((x >= B)? proc(x/B, B): ””) + c(x % B); } public static void main (String [ ] args) { System.out.print(proc(33, 13) + ”\t”); System.out.print(proc(33, 15) + ”\t”); System.out.print(proc(33, 17) + ”\t”); System.out.print(proc(33, 19)); } 11 12 13 14 15 16 17 } Aufgabe 4 (Punktzahl: 4/24) In welcher Reihenfolge werden die Knoten im abgedruckten binären Suchbaum besucht, wenn man ihn entsprechend den Strategien 12 a) preorder und 7 b) postorder traversiert? 5 3 17 14 8 6 4 10 9 18 13 16 21 15 11 20 19 Aufgabe 5 (Punktzahl: 6/24) In dem folgenden Programm ist eine der vielen Varianten von Quicksort implementiert. Geben Sie die Ausgabe dieses Programms an. Die Ausgabeanweisung steht in Zeile 18 der Klasse QuickSort. 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class QuickSortTest { public static void main (String [ ] args) { int dummy = Integer.MIN VALUE; // dummy wird nicht mitsortiert QuickSort qs = new QuickSort (new int[ ] {dummy, 9, 2, 8, 3, 7, 4, 6, 5}); qs.sort(); } } public class QuickSort { private int [ ] a; public QuickSort(int [ ] a) { this.a = a; } public void sort () { sort(1, a.length − 1); } private void sort (int p, int r) { if (p < r) { int q = partition(p, r); sort(p, q − 1); sort(q + 1, r); } } public int partition (int p, int r) { int x = a[r]; System.out.println(p + ”\t” + r + ”\t” + x); int i = p − 1; int tmp; for (int j = p; j <= r − 1; j++) { if (a[j] <= x) { i++; tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } tmp = a[i+1]; a[i+1] = a[r]; a[r] = tmp; return i + 1; } 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 }