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);
}
}