Die Voraussetzungen für einen Schein Nr. 1 haben erfüllt: K. Amelung Frank Bauske Corinna Bennecke Marco Bellstedt Chris Berking Jens Bradler Johann Deutinger Katy Hoffmann Anja Fiegler Daniela Kabisch Jan Käferstein Christian Pfeffer Hendryk Prill Anja Rothe Ralph Schatz Jan Peter Schmidt Christian Scholz Marita Schwaß Matthias Teske Alois Vrhic Lars Waldemann Carsten Walther Herr Wolf Die Voraussetzungen für den Schein Nr. 2 haben erfüllt: K. Amelung Frank Bauske Corinna Bennecke Chris Berking Jens Bradler Johann Deutinger Katy Hoffmann Jan Käferstein Christian Pfeffer Hendryk Prill Ralph Schatz Jan Peter Schmidt Christian Scholz Marita Schwaß Matthias Teske Carsten Walther Herr Wolf Ü1. Ermitteln Sie die Zeit T(n), die zur „verkürzten“ Multiplikation zweier Zahlen mit n Stellen (3.3) nötig ist. Beispiel: Multiplikation zweier vierstelliger Zahlen 1984, 6713 X = (A*100 + B) = 19*100 + 84 Y = (C*100 + D) = 67*100 + 13 X*Y= AC*1000 + ((A+B)(C+D) -AC-BD)*100 + BD 1273 5875 1092 13318592 Lösung: 3 Multiplikationen für Zahlen mit halber Länge n/2 Additionen linear von n abhängig Rekursive Relation: T (n) = 3 T (n/2) +c *n T(1) = k (Zeit für Multiplikation 1stelliger Zahlen) Abkürzung: n= 2 m , m= log n T( 2 m ) = 3 T (2 m /2) +c * 2 m |:2m T (2 m ) / 2 m = 3/2 T( 2 m -1) / 2 m-1 +c T( 2 m ) / 2 m = 3/2 * T(2 m -1) / 2 m-1 +c = 3/2 (3/2 * T(2 m-2) / 2 m-2 +c) + c) = 3/2 (3/2 (3/2 ....(3/2*T(1) +c) ...+c) +c)+c) m | T(1) =k m Wegen 1 + q +q 2+..... + q m-1 = (q m-1)/(q-1) mit q=3/2 folgt = (3/2) m * k + ((3/2) m - 1) / (3/2-1) * c T( 2 m ) = (3 m* k + 3 m*2c) – 2c* 2 m T( n ) = (2c+ k) 3 log n - 2cn = (2c+k) n log 3 -2cn | *2 m | 3 log n =2 log 3 log n = n log 3 Ü2. Zeigen Sie durch vollständige Induktion, daß die zuvor bestimmte Laufzeit T(n) für beliebige n richtig ist . Gegeben.: T(n) = 3 T (n/2) + cn Gesucht.: T(n) Induktionsbehauptung: T(n) = (2c +k) n log3 –2cn Induktionsanfang: T(1) = (2c+k) - 2c = k richtig Induktionsschritt: T(2n) = 3 T (n)+ c2n = 3 ((2c + k) n log3 –2cn) + c2n = (2c + k) (2n) log3 –4cn Ü3 . Gegeben sei das logische Programm: (n=1,2,4,...) |Einsetzen der Behauptung für n | 3= 2log3 |Behauptung für n+1 richtig (1) Großeltern(X,Y) Eltern(X,Z), Eltern(Z,Y) (2) Eltern (Elisabeth, Karl) (3) Eltern (Karl, Wilhelm) (4) Eltern (Karl, Heinrich) Wie sieht die Ausführungsfolge aus für a) ? Großeltern (Elisabeth, V) b) ? Großeltern (U,V)? Ü4. Entwickeln Sie ein Sortierprogramm auf Basis der funktionalen Programmierung! Lösung: {Funktion zum Sortieren einer Liste L von Wörtern in alphabetischer Reihenfolge} sortiere (L) = wenn L = [ ] dann [ ] sonst füge-ein (Kopf(L),sortiere (Rumpf(L))) {Funktion zum Einfügen eines Wortes in sortierte Liste L} füge-ein (Wort,L) = wenn L = [ ] dann [Wort ] sonst wenn Vorgänger (Wort,Kopf(L)) dann Wort:L sonst Kopf(L): füge-ein(Wort,Rumpf(L)) {Funktion zum Entscheiden, ob Wort1 alphabetisch vor Wort2 steht} Vorgänger(Wort1,Wort2) = wenn Wort1 alphabetisch vor Wort2 steht dann wahr sonst falsch Ü5. Realisieren Sie das Sortierprogramm aus Ü4 mittels logischer Programmierung! (1) sortiere(K:R,S) sortiere(R,L), füge-ein(K,L,S) (2) sortiere ([ ], []) (3) füge-ein (X,K:R,X:K:R) Vorgänger (X,K) (4) füge-ein (X,K:R1,X:K:R2) Vorgänger (X,K),füge-ein(X,R1,R2) (5) füge-ein (X,[ ],[X]) (1) S ist sortierte Version von K:R, wenn L die sortierte Version von R ist und S das Ergebnis des Einfügens von K an der korrekten Stelle (3) Einfügen am Anfang (4) Einfügen im Innern Beispiele zur Listen- Notation (3.4): Kopf([Hund Katze Schwein])=Hund Erstes Element einer Liste Rumpf([Hund Katze Schwein]) = [ Katze Schwein] Rest der Liste Kopf([Katze]) = Katze Liste aus 1 Element Rumpf ([Katze]) = [ ] Leerer Rumpf Hund : [Katze Schwein] = [Hund Katze Schwein] Neuer Kopf Hund : [ ] = [ Hund ] Neuer Kopf in neuer Liste Kopf (X:L) =X Nutzung von Variablen Rumpf (X:L)= L Kopf(L) : Rumpf(L) =L, falls L nicht leer Übung Ü2.1 Zeigen Sie, daß der nachfolgende Programmausschnitt aus einer Infix- eine PostfixNotation erzeugt! Erläutern Sie Ablauf und Ergebnis am Beispiel von (a * ((b+c)*(d + (e*f))))! char c; Stack acc (50); while (cin.get (c) ) { x = 0; if (c == ')' ) cout.put (save.pop( )); if ( c == + ) acc.push( c); if ( c == * ) acc.push( c); while ( c >= 0 && c <= 9 ) { cout.put( ); cin.get ( c ); } if (c != '(' ) cout << ' '; } cout << \n ; } Ü2.2 Erläutern Sie die nachfolgende Implementation eines Stapels mittels verketteter Listen! class Stack { public: Stack (int max); ~Stack( ); void push (itemType v); itemType pop( ); int empty( ); private: struct node {itemType key; struct node *next;}; struct node *head, *z; } Stack::Stack (int max) { head = new node; z = new node; head -> next = z ; z->next = z; } Stack::~Stack( ) { struct node *t = head; while (t != z) {head = t; t = t-> next; delete head; } } void Stack:: push (itemType v) { struct node *t = new node; t-> key = v; t -> next = head -> next; head -> next = t; } itemType Stack::pop( ) { itemType x; struct node *t = head -> next; head -> next = t -> next; x = t -> key, delete t; return x; } int Stack:: empty ( ) { return head -> next == z;} Ü2.3 Zeigen Sie, daß der nachfolgende Programmabschnitt aus einem Postfix- Ausdruck einen Syntaxbaum erzeugt! Wie sieht der Baum für A B C + D E ** F +* aus? struct node {char info; struct node *l, *r; }; struct node *x, *z; char c; Stack stack (50); z = new node ; z -> l = z; z -> r =z; while (cin.get (c) ) { while (c == ' ') cin.get ( c); x = new node; x -> info = c; x -> l = z; x -> r = z; if (c == '+' || c == '*') {x -> r = stack.pop( ); x->l = stack.pop( );} stack.push (x) ; } Ü2.4 Wie wird ein binärer Baum von der Wurzel aus durchlaufen, wenn der nachfolgende Traversierungsalgorithmus genutzt wird? traverse (struct node *t) { stack.push ( t); while (!stack.empty( )); { t= stack.pop( ); visit(t); if (t -> r != z) stack.push (t->r); if (t->l) != z) stack.push (t->l); } }