You are on page 1of 30

Aufgabensammlung zur Einf uhrung in die Programmierung

Inhaltsverzeichnis
1 2 3 4 5 6 7 Logik, Mengenlehre, Funktionen URM-Programmierung Hoare-Kalkul Komplexit at Abstrakte Datentypen Formale Sprachen, BNF, EBNF Zahldarstellung 2 5 8 13 17 23 29

1. 2

Logik, Mengenlehre, Funktionen

Aufgabe 1.1 a) Erstellen Sie eine Wahrheitstafel f ur (A B ) B b) Erstellen Sie eine Wahrheitstafel f ur (A B ) (A B ) c) Erstellen Sie eine Wahrheitstafel f ur ((A B ) (B C )) (A C ) L osung zu 1.1

a) Wahrheitstafel: A B A B (A B ) B 0 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 b) (A B ) (A B ) stellt das ausschlieende oder (exclusive or, XOR) dar: A B A B A B (A B ) (A B ) 0 0 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 c) Hier sind einige Zwischenschritte sinnvoll: A B C A B B C (A B ) (B C ) A C ((A B )(B C )) (A C ) 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 Aufgabe 1.2 Bilden Sie die logischen Verneinungen von a) b) c) d) e) Wenn es regnet, dann wird die Strae nass (a b) (a = 0) x>0y <0 Alle Vielfachen von 10 sind durch 2 und durch 5 teilbar p(x) = T RU E , wobei p(x) eine Funktion sei, die einen booleschen Wert liefert (also ein Pr adikat). K onnen Sie den Ausdruck verk urzen?

L osung zu 1.2 (Wir benutzen die Schreibweise X f ur die Negation der logischen Aussage X statt X .) a) Wenn es regnet, dann wird die Strae nass ist gleichbedeutend zu es regnet nicht oder die Strae ist nass. Die Verneinung hiervon ist es regnet und die Strae ist nicht nass. Alle anderen Kombinationen (z.B. es regnet nicht und die Strae ist nass) sind keine logische Negation der obigen Aussage. b) Nach der ersten de Morgansche Regel (A B ) = A B ist ((a b) (a = 0)) (a b) (a = 0) (a > b) (a = 0) c) Hier benutzen wir die zweite de Morgansche Regel (A B ) = A B und erhalten ((x > 0) (y < 0)) (x > 0) (y < 0) (x 0) (y 0)

1. 3

d) Formal lautet die Aussage: x N : x ist Vielfaches von 10 2|x 5|x. Die Negation davon ist: x N : x ist Vielfaches von 10 (2|x 5|x) Dazu ist a quivalent x N : x ist Vielfaches von 10 (2 x 5 x). In Worten: Es gibt ein Vielfaches von 10, das nicht durch 2 oder nicht durch 5 teilbar ist. e) Der Ausdruck p(x) = T RU E ist selber schon a quivalent zum Ausdruck p(x), die Negation erhalten wir also einfach durch p(x). Aufgabe 1.3 Paul sagt: Max l ugt. Max sagt: Otto l ugt. Otto sagt: Max und Paul l ugen. Wer l ugt hier nun wirklich, wer sagt die Wahrheit? L osung zu 1.3 Wenn Paul die Wahrheit sagt, dann mu Max l ugen, also Otto die Wahrheit sagen. Dies ist aber ein Widerspruch zu der Annahme, dass Paul nicht l ugt. Also l ugt Paul, damit sagt Max die Wahrheit und Otto l ugt. Man kann die Aufgabe auch formal l osen: Wir bezeichnen mit P die Aussage Paul sagt die Wahrheitund mit P die Aussage Paul l ugt. Entsprechend verwenden wir O, O, M, M . Dann ist der erste Satz gleichbedeutend mit P M , der zweite Satz entspricht M O und die dritte Aussage ist O (M P ). Die Aufgabe besteht nun darin, eine Belegung der Variablen P, M und O mit Wahrheitswerten wahr, falsch B zu nden, sodass alle drei Aussagen den Wahrheitswert wahr haben. Dazu kann man eine Tabelle erstellen: (Wir verwenden f f ur falsch und w f ur wahr) P f f f f w w w w M f f w w f f w w O f w f w f w f w P M f f w w w w f f M O f w w f f w w f O (M P ) f w w f w f w f

Nur die eingerahmte Zeile erf ullt alle drei Aussagen. Die Wahrheitstabelle f ur ist dabei: A w w f f B w f w f AB w f f w

Aufgabe 1.4 Betrachten Sie die Mengen M1 = {3, 5, 7} und M2 = {4, 5, 6} . Bilden Sie a) b) c) d) e) die Potenzmengen, das kartesische Produkt M1 M2 , den Schnitt, die Vereinigung und die Differenzmengen M1 M2 und M2 M1 .

1. 4

Finden Sie Beispiele f ur a) eine partielle Funktion von M1 nach M2 , b) eine totale Funktion von M1 nach M2 , c) eine Relation (die nicht zugleich Funktion ist) auf M1 M2 . L osung zu 1.4

a) P (M1 ) = {, {3}, {5}, {7}, {3, 5}, {3, 7}, {5, 7}, {3, 5, 7}} P (M2 ) = {, {4}, {5}, {6}, {4, 5}, {4, 6}, {5, 6}, {4, 5, 6}} M1 M2 = {(3, 4), (3, 5), (3, 6), (5, 4), (5, 5), (5, 6), (7, 4), (7, 5), (7, 6)} M1 M2 = {5} M1 M2 = {3, 4, 5, 6, 7} M1 M2 = {3, 7} M2 M1 = {4, 6} b) {(3, 4), (5, 4)} ist eine partielle Funktion, {(3, 4), (5, 4)(7, 5)} ist eine totale Funktion und {(3, 4), (5, 4)(5, 6)} ist eine Relation, aber keine Funktion. Aufgabe 1.5 Betrachten Sie f : Z Z Z, f (x, y ) = 2x + 3y und g : Z Z, g (x) = 5x 1. a) Berechnen Sie f (g (x), x) f ur x = 1. b) Berechnen Sie f (f (x, y ), g (y )) f ur x = 1 und y = 2. c) Bestimmen Sie die Vorschrift der zusammengesetzten Funktion g f . L osung zu 1.5

a) f (g (1), 1) = f ((5 1 1), 1) = f (4, 1) = 2 4 + 3 1 = 11 b) f (f (1, 2), g (2)) = f (2 1 + 3 2, 5 2 1) = f (8, 9) = 2 8 + 3 9 = 43 c) g f : Z Z Z, mit g (f (x, y )) = g (2x + 3y ) = 5(2x + 3y ) 1 = 10x + 15y 1. Aufgabe 1.6 Betrachten Sie die Funktionen f1 : N N, f2 : N2 N, g1 : N N und g2 : N N deniert durch f1 (x) = 1 falls x = 0 2 + f1 (x 1)) falls x > 0

f2 (x, y ) = f1 (x) + 2f1 (y ) g1 (x) = 2x 1 und g2 (x) = 3 x. Bestimmen Sie die Werte f1 (0), f1 (1), . . . f1 (5) und f2 (g1 (x), g2 (x)) f ur x = 1 . . . 3. L osung zu 1.6 f1 (0) = 1 f1 (1) = 2 + f1 (0) = 2 + 1 = 3 f1 (2) = 2 + f1 (1) = 2 + 3 = 5 f1 (3) = 2 + f1 (2) = 2 + 5 = 7 f1 (4) = 2 + f1 (3) = 2 + 7 = 9 f1 (5) = 2 + f1 (4) = 2 + 9 = 11 F ur f2 (g1 (x), g2 (x)) = f2 (2x 1, 3 x) ergibt sich f ur x = 1 : f2 (2 1 1, 3 1) = f2 (1, 2) = f1 (1) + 2f1 (2) = 3 + 2 5 = 13 x = 2 : f2 (2 2 1, 3 2) = f2 (3, 1) = f1 (3) + 2f1 (1) = 7 + 2 3 = 13 x = 3 : f2 (2 3 1, 3 3) = f2 (5, 0) = f1 (5) + 2f1 (0) = 11 + 2 1 = 13

2. 5

URM-Programmierung

Aufgabe 2.1 a) Schreiben Sie ein URM-Programm, das testet, ob die Eingabe gleich 0 ist, dh. bei Eingabe einer 0 soll 1 (f ur true) ausgegeben werden, bei allen anderen Eingaben soll 0 (f ur false) ausgegeben werden. Genauer: Das Programm soll die Funktion [P ] : N0 N0 [P ](x) = 0 falls x > 0 1 falls x = 0

berechnen. Beachten Sie, dass nicht nur der Befehlsteil, sondern auch Eingabe- und Ausgabevereinbarung angegeben werden. b) Berechnen Sie f ur Ihr Programm formal (mit Hilfe der iterierten Zustandstransformation) den Wert [P ](2). L osung zu 2.1

a) Das Programm P = in (r1 ); b; out (r2 ) mit b = 1 : r2 0 2 : if r1 = 0 goto 4 3 : goto 5 4 : r2 r2 + 1 5: berechnet die Funktion [P ] : N0 N0 [P ](x) = 0 falls x > 0 1 falls x = 0

b) Wir m ussen [P ](2) = [ out (r2 )] [b] [ in (r1 )](2) bestimmen. Wir berechnen also zun achst aus der Eingabevereinbarung [ in (r1 )] und dem Eingabewert 2 den Anfangszustand z0 , wenden daruf die iterierte Zustandstransformation [b] an und abschlieend auf den erreichten Endzustand zs die Ausgabevereinbarung [ out (r2 )]. Der Anfangszustand ist z0 = [ in (r1 )](2) = (1, 2, 0, . . .) oder genauer: z0 (0) = 1, z0 (1) = 2, z0 (j ) = 0 f ur j 2. In Worten: der Befehlsz ahler (Register 0) wird auf 1 gesetzt, Register 1 erh alt den Eingabewert 2 und alle anderen Register den Wert 0. Auf z0 wenden wir nun die iterierte Zustandstransformation an: (b)(1, 2, 0, . . .) = [r2 0] (1, 2, 0, . . .) = (2, 2, 0, . . .) (b)(2, 2, 0, . . .) = [ if r1 = 0 goto 4] (2, 2, 0, . . .) = (3, 2, 0, . . .) (b)(3, 2, 0, . . .) = [ goto 5 ] (3, 2, 0, . . .) = (5, 2, 0, . . .) = z3 Wir haben also [b](z0 ) = z3 = (5, 2, 0, . . .). Auf den Endzustand z3 wird jetzt die Ausgabevereinbarung angewendet und wir erhalten [ out (r2 )](z3 ) = [ out (r2 )](5, 2, 0, . . .) = 0 Insgesamt haben wir also [P ](2) = [ out (r2 )] [b] [ in (r1 )](2) = [ out (r2 )] [b](1, 2, 0, . . .) = [ out (r2 )](5, 2, 0, . . .) =0

2. 6

Aufgabe 2.2 a) Schreiben Sie ein URM-Programm, das zwei Zahlen auf Gleichheit testet: Bei Gleichheit soll 1, bei Ungleichheit soll 0 ausgegeben werden. b) Berechnen Sie [P ](2, 1) und [P ](0, 0) f ur Ihr Programm aus a). L osung zu 2.2

a)

P = in (r1 , r2 ); b; out (r3 ) mit b = 1: r3 0 2: if r1 = 0 goto 7 3: if r2 = 0 goto 10 1 4: r1 r1 1 5: r2 r2 6: goto 2 7: if r2 = 0 goto 9 8: goto 10 9: r3 r3 + 1

Erl auterung: In der Schleife 2 - 6 werden beide Register parallel heruntergez ahlt, bis mindestens eines bei 0 angelangt ist. In den Anweisungen 7 und 8 werden die verschiedenen m oglichen F alle getestet: Anweisung 9 wird nur erreicht, falls r1 = 0 und r2 = 0, in diesem Fall erh alt Register 3 den Wert 1. In allen anderen F allen (r1 = 0 r2 = 0 oder r1 = 0 r2 = 0) wird Anweisung 9 u bersprungen und Register 3 beh alt den Wert 0. b) Um [P ](2, 1) zu berechnen, bestimmt man zun achst den Wert der Eingabefunktion [ in (r1 , r2 )], wendet auf den dadurch gegebenen Zustand z0 die iterierte Zustandstransformation [b] an und auf den dadurch erreichten Endzustand zs die Ausgabefunktion [ out (r3 )]. Wir bilden also [P ](2, 1) = [ out (r3 )] [b] [ in (r1 , r2 )](2, 1) = [ out (r3 )] [b](z0 ) und erhalten z0 = [ in (r1 , r2 )] = (1, 2, 1, 0, . . .) , oder genauer: z0 (0) = 1, z0 (1) = 2, z0 (2) = 1, z0 (j ) = 0 f ur j 3. Auf diesen Zustand z0 wird nun wiederholt die Einzelschrittfunktion angewendet: (b)(1, 2, 1, 0, . . .) = [r3 0] (1, 2, 1, 0, . . .) = (2, 2, 1, 0, . . .) (b)(2, 2, 1, 0, . . .) = [ if r1 = 0 goto 7] (2, 2, 1, 0, . . .) = (3, 2, 1, 0, . . .) (b)(3, 2, 1, 0, . . .) = [ if r2 = 0 goto 8] (3, 2, 1, 0, . . .) = (4, 2, 1, 0, . . .) 1] (4, 2, 1, 0, . . .) = (5, 1, 1, 0, . . .) (b)(4, 2, 1, 0, . . .) = [r1 r1 1] (5, 1, 1, 0, . . .) = (6, 1, 0, 0, . . .) (b)(5, 1, 1, 0, . . .) = [r2 r2 (b)(6, 1, 1, 0, . . .) = [ goto 2] (6, 1, 0, 0, . . .) = (2, 1, 0, 0, . . .) (b)(2, 1, 0, 0, . . .) = [ if r1 = 0 goto 7] (2, 1, 0, 0, . . .) = (3, 1, 0, 0, . . .) (b)(3, 1, 1, 0, . . .) = [ if r2 = 0 goto 8] (3, 1, 0, 0, . . .) = (8, 1, 0, 0, . . .) (b)(8, 1, 0, 0, . . .) = [ goto 10] (8, 1, 0, 0, . . .) = (10, 1, 0, 0, . . .) wir haben also zs = (10, 1, 0, 0, . . .). Nun noch die Ausgabefunktion [ out (r3 )] und wir erhalten [P ](2, 1) = [ out (r3 )](10, 1, 0, 0, . . .) = 0. Eingabe der Werte 2 und 1 in die Register r1 bzw. r2 liefert die Ausgabe 0 (= Inhalt des Registers r3 im Endzustand). Der Ausgabewert des Programms f ur die Eingabe (0, 0) berechnet sich aus [P ](0, 0) = [ out (r3 )] [b] [ in (r1 , r2 )](0, 0) = [ out (r3 )] [b](1, 0, 0, 0, . . .) mit (b)(1, 0, 0, 0, . . .) = [r3 0] (1, 0, 0, 0, . . .) = (2, 0, 0, 0, . . .) (b)(2, 0, 0, 0, . . .) = [ if r1 = 0 goto 7] (2, 0, 0, 0, . . .) = (7, 0, 0, 0, . . .) (b)(7, 0, 0, 0, . . .) = [ if r2 = 0 goto 9] (7, 0, 0, 0, . . .) = (9, 0, 0, 0, . . .) (b)(9, 0, 0, 0, . . .) = [r3 r3 + 1] (9, 0, 0, 0, . . .) = (10, 0, 0, 1, 0 . . .) und also [P ](0, 0) = [ out (r3 )](10, 0, 0, 1, 0 . . .) = 1.

2. 7

Aufgabe 2.3 Schreiben Sie ein URM-Programm, das den Abstand f (x, y ) = |x y | berechnet. Informell ausgedr uckt: Der Abstand ist gr oere minus kleinere . Aber Achtung! Es ist hier nicht sinnvoll, zuerst das Maximum und Minimum zu bestimmen, um dann die Differenz zu berechnen. L osung zu 2.3 Idee: beide Register werden parallel heruntergez ahlt. Wenn eines von beiden (das kleinere) auf 0 angelangt ist, enth alt das andere gerade den Abstand. (Zeilen1 bis 5) Da man aber die Ausgabe nicht von einer Bedingung abh angig machen kann ( wenn r1 = 0 dann Ausgabe r2 oder umgekehrt), muss man ein Ausgaberegister denieren, auf das der Inhalt des Ergebnisses kopiert wird. (Zeilen 6 9, wenn r1 die kleinere Zahl enthielt und Zeile 10 - 13, wenn r2 kleiner war.) P = in (r1 , r2 ); b; out (r3 ) mit b = 1 : if r1 = 0 goto 6 2 : if r2 = 0 goto 10 1 3 : r1 r1 4 : r2 r2 1 5 : goto 1 6 : if r2 = 0 goto 14 1 7 : r2 r2 8 : r3 r3 + 1 9 : goto 6 10: if r2 = 0 goto 14 1 11: r1 r1 12: r3 r3 + 1 13: goto 10

3. 8

Hoare-Kalkul

Aufgabe 3.1 Beweisen Sie mit den Regeln des Hoareschen Kalk uls, dass die Variable a nach Ausf uhrung der Anweisung a := 5 immer (dh. bei leerer Vorbedingung) den Wert 5 hat. L osung zu 3.1 Wir wollen zeigen, dass die Formel (1) { } a := 5 {a = 5}

g ultig ist. Dazu verwenden wir Axiom 2 (Wertzuweisung) {} {p[u/t]} u := t { p}

des Hoareschen Kalk uls. Da es sich um ein Axiom handelt, brauchen wir keine Voraussetzungen zu u berpr ufen (erkennbar daran, dass die Pr amisse leer ist). Die Konklusion ist also richtig f ur jede Nachbedingung {p}, wenn die Vorbedingung dadurch aus p hervorgeht, dass man jedes Vorkommen der Variable u (bei uns also a) durch den Ausdruck t (bei uns also 5) ersetzt. Unsere Nachbedingung ist {a = 5}. Um die Vorbedingung zu erhalten, m ussen wir im Ausdruck {a = 5} jedes Vorkommen der Variable a durch den Ausdruck 5 ersetzen. Wir erhalten als Vorbedingung {5 = 5} und k onnen aufgrund des Axioms schlieen, dass die Korrektheitsformel (2) gilt. In Worten sagt uns Formel (2) folgendes: Wenn vor Ausf uhrung der Anweisung a := 5 die Bedingung {5 = 5} wahr ist, dann ist nach der Wertzuweisung die Aussage {a = 5} richtig. Oder umgekehrt: Um zu garantieren, dass nach der Wertzuweisung a := 5 richtig ist, muss vor der Ausf uhrung {5 = 5} erf ullt sein. Die Aussage {5 = 5} ist aber immer wahr! Formal schreibt sich das so: {} {5 = 5} Wir k onnen also Regel 6 (Konsequenzregel) anwenden und erhalten {} {5 = 5}, {5 = 5} a := 5 {a = 5} {} a := 5 {a = 5} Beide Pr amissen sind erf ullt, also gilt die Konklusion und (1) ist bewiesen. Aufgabe 3.2 Beweisen Sie, dass nach Ausf uhrung der Anweisung if x y then a := x y else a := y x die Variable a auf jeden Fall (also bei leerer Vorbedingung) einen Wert 0 hat. L osung zu 3.2 Die Behauptung enth at zwei Teilaussagen: Nach der Anweisung if x y then a := x y else a := y x ist a 0, also soll die Nachbedingung {a 0} gelten und das gilt immer, also unter leerer Vorbedingung: { } {5 = 5} a := 5 {a = 5}

3. 9

Wir haben also die G ultigkeit der Formel (3) { } if x y then a := x y else a := y x {a 0}

zu zeigen. Dazu wollen wir Regel 4 (Selektionsregel) anwenden: {p B }S1 {q }, {p B }S2 {q } {p} if B then S1 else S2 end {q } In unserem Fall ist p: { } B: xy q : {a 0} S1 : a := x y S2 : a := y x.

und

Um eine Regel, die kein Axiom ist, anwenden zu k onnen, muss man nachweisen, dass die Pr amissen der Regel erf ullt sind, hier also, dass die beiden Formeln {p B }S1 {q } und {p B }S2 {q } gelten. Wir setzen unsere Ausdr ucke f ur p, B, S1 , S2 und q ein und erhalten als Zwischenziel: zeige die G ultigkeit von (4) und (5) {{ } (x y )} a := y x {a 0} {{ } (x y )} a := x y {a 0}

Dies wird mit Axiom 2 erreicht: Danach gilt n amlich {x y 0} a := x y {a 0} und wegen (x y ) = (x y 0) {x y } a := x y {a 0} also ist (4) eine korrekte Formel.

und Regel 6 folgt

Ebenso gilt nach Axiom 2: {y x 0} a := y x {a 0} und wegen (x < y ) = (y x > 0) = (y x 0) folgt {x < y } a := y x {a 0} also ist auch (5) richtig.

und Regel 6

Aufgabe 3.3 Betrachten Sie das Programm:


x := a y := b z := 0 w h i l e ( x > 0 and y > 0 ) do x = x1 y = y1 en d w h ile

a) Zeigen Sie, dass (z + x = a) (z + y = b) (a 0) (b 0) eine Invariante f ur die while-Schleife ist. b) Beweisen Sie damit, dass das Programm unter der Vorbedingung (a 0) (b 0) korrekt das Minimum von a und b berechnet, dass also die Nachbedingung ((z = a) (a b)) ((z = b) (b a)) gilt.

3. 10

L osung zu 3.3

a) Behauptung: I : (z + x = a) (z + y = b) (x 0) (y 0) ist eine Invariante f ur die whileSchleife. Es mu also gezeigt werden, dass {I B }S {I } gilt mit I wie oben, B : (x > 0 y > 0) und S : x := x 1; y := y 1; z := z + 1. Wir schlieen r uckw arts: Nach Axiom 2 gilt {(z + 1 + x = a) (z + 1 + y = b) (x 0) (y 0)}z := z + 1 {(z + x = a) (z + y = b) (x 0) (y 0)} auerdem (nocheinmal Axiom 2 ) {(z + 1 + x = a) (z + y = b) (x 0) (y 1 0)}y := y 1 {(z + 1 + x = a) (z + 1 + y = b) (x 0) (y 0)} und noch einmal: {(z + x = a) (z + y = b) (x 1 0) (y 1 0)}x := x 1 {(z + 1 + x = a) (z + y = b) (x 0) (y 1 0)} also nach Regel 3: {(z + x = a) (z + y = b) (x 1 0) (y 1 0)}x := x 1; y := y 1; z := z + 1 {(z + x = a) (z + y = b) (x 0) (y 0)} Nun gilt aber {I B } = {x + z = a y + z = b x 0 y 0 x > 0 y > 0} = {z + x = a y + z = b x 1 0 y 1 0} und deshalb nach Regel 6 die Behauptung. b) Wir haben eine Schleifeninvariante I gefunden, damit l at sich Regel 5 anwenden und es gilt: {I } while . . . {I B } also (z + x = a) (z + y = b) (x 0) (y 0) while . . . {x + z = a y + z = b x 0 y 0 (x 0 y 0)} Es gilt aber (x + z = a y + z = b x 0 y 0 (x 0 y 0)) = (x + z = a y + z = b (x = 0 y = 0)) = (z = a a b) (z = b b a) und es l at sich wieder Regel 6 anwenden. Man hat also {I } while . . . {(z = a a b) (z = b b a)} Nun bleibt noch zu zeigen: {a 0 b 0}x := a; y := b; z := 0{I }. Dies erreicht man aber leicht durch Regel 2, Regel 3 und Regel 6 (vorw arts hingeschrieben, aber r uckw arts zu lesen): {a 0 b 0} = {a = a b = b a 0 b 0} {a = a b = b a 0 b 0}x := a{x = a b = b x 0 b 0} {x = a b = b x 0 b 0}y := b{x = a y = b x 0 y 0} {x = a y = b x 0 y 0}z := 0{(z + x = a) (z + y = b) (x 0) (y 0)}. Aufgabe 3.4 Beweisen Sie mit Hilfe des Hoarekalk uls, dass die Sequenz
tmp : = a ; a := b ; b : = tmp ;

tats achlich die Inhalte von a und b vertauscht. F ugen Sie entsprechende Zusicherungen in den Programmcode ein. L osung zu 3.4 Wir bezeichnen die urspr unglichen Inhalte von a bzw. b mit x bzw. y . Dann m ussen wir zeigen, dass unter der Vorbedingung {a = x b = y } nach Terminierung des Programmst ucks gilt: { a = y b = x} Wir arbeiten von hinten nach vorne: Wir wenden Axiom 2 auf die Anweisung wahre Korrektheitsformel { a = y tmp = x}
b := tmp b := tmp

und die Nachbedingung { a = y b = x}an und erhalten die

{ a = y b = x}
a := b

Jetzt kennen wir die Nachbedingung, die nach der Anweisung 2 an und erhalten { b = y tmp = x}
a := b

gelten soll. Wir wenden also wieder Axiom

{ a = y tmp = x}
tmp := a

als wahre Korrektheitsformel. Nun noch einmal Axiom 2 anwenden (auf die Anweisung dingung { b = y tmp = x} ) ergibt die wahre Formel

und die Nachbe-

3. 11

{ b = y a = x}

tmp := a

{ b = y tmp = x}

Wir k onnen also folgende Zusicherungen in den Programmtext einf ugen:


{ a = x and b tmp : = a { tmp = x and a := b { tmp = x and b : = tmp { b = x and a = y } b = y } a = y} = y }

Anwendung der Sequenzregel (zweimal) liefert dann die Behauptung {a = x b = y } Programmcode { a = y b = x} Aufgabe 3.5 Erg anzen Sie das unten abgebildete Fludiagramm um Zusicherungen, die beweisen, dass hierdurch 2a berechnet wird, falls a 0 eingegeben wird. Tip: Schleifeninvariante ist {z + 2x = 2a x 0}.

Start

Eingabe x z=0

x>0 ja z = z+2

nein

Ausgabe z

Ende x = x1

Abbildung 1: Flussdiagramm zu Aufgabe 3.5

L osung zu 3.5 Das Flussdiagramm mit Zusicherungen sehen Sie in Abbildung 2.

3. 12

Eingabe x x = a and x >= 0 z=0 x = a and x >= 0 and z = 0 => x>0 ja nein Ausgabe z z + 2x = 2a and x >= 0 and x !> 0 => z + 2x = 2a and x = 0 => z = 2a z + 2x = 2a and x > 0 => z = z+2 z + 2(x1) = 2a and x1 >= 0 x = x1 z + 2x = 2a and x >= 0 z+2 + 2(x1) = 2a and x1 > 1 z + 2x = 2a and x >= 0

Abbildung 2: L osung zu Aufgabe 3.5

4. 13

Komplexit at

Aufgabe 4.1 (KomplBohne) Bestimmen Sie die best-case-, worst-case- und average-case-Komplexit at des Bohnenproblems aus der Vorlesung. Welches ist der charakterisierende Parameter? Wann tritt der beste, wann der schlechteste Fall ein? Betrachten Sie Zwei Bohnen ziehen, Bohnen weglegen, Bohne in die Spielurne (zur uck-)legen als jeweils einen Arbeitsschritt. L osung zu 4.1 Characterisierender Parameter f ur das Urnenproblem ist die Anzahl n der Bohnen, die sich zu Beginn in der Spielurne benden. In einer Wiederholungsanweiseng werden - zwei Bohnen gezogen - deren Farben miteinander verglichen und - auf jeden Fall eine Bohne wieder zur uckgelegt, sodass sich die Anzahl n jedesmal um 1 verringert. Die Schleife wird daher genau (n 1)-mal ausgef uhrt. Die Komplexit at ist also (unabh angig von der Verteilung der schwarzen und weien Bohnen) in jedem Fall O(n).

Aufgabe 4.2 Bestimmen Sie die genaue Anzahl der Elementaranweisungen, die bei Ablauf des des Programms aus Aufgabe 3.3 ausgef uhrt werden. L osung zu 4.2 Es werden vor der Schleife 3 Zuweisungen ausgef uhrt, in der Schleife wird jeweils einmal der logische Ausdruck ausgewertet, 2 Subtraktionen, 1 Addition und 3 Zuweisungen ausgef uhrt. Wenn jeder dieser Elementarschritte 1 Kosteneinheit verursacht und m das Minimum von a und b ist, dann sind die Gesamtkosten genau 7m + 3 = 7min(a, b) + 3 Kosteneinheiten.

Aufgabe 4.3 a) Folgender Algorithmus bestimmt das Maximum von n Zahlen:


Modul Maximum ( n ) i := 1 input (x) max : = x w h i l e ( i < n ) do input ( x) i f ( x > max ) max : = x endif i : = i +1 en d w h ile o u t p u t ( max ) Modulende

Bestimmen Sie die best-case- und die worst-case-Komplexit at des Verfahrens. Was ist der charakterisierende Parameter? Wann tritt der beste Fall, wann der schlechteste Fall ein? b) Eine kleine Anderung am Algorithmus l at uns nun nicht das Maximum, sondern die Summe der n eingegebenen Zahlen berechnen:
Modul Summe ( n ) i := 1 input (x) sum : = x w h i l e ( i < n ) do input ( x) sum : = sum + x i : = i +1 en d w h ile o u t p u t ( max ) Modulende

Wie beeinut diese Anderung die best-case- und worst-case-Komplexit at des Verfahrens?

4. 14

L osung zu 4.3

a) Der Aufwand h angt ab von der Anzahl der eingegebenen Zahlen, charakterisierender Parameter ist also n. Wir z ahlen die Elementaroperationen, die ausgef uhrt werden (Ein- und Ausgabeoperationen lassen wir unber ucksichtigt, sie sind nicht ausschlaggebend f ur die Qualit at des Algorithmus): vor der while-Schleife: 2 Wertzuweisungen Auswertung der Schleifenbedingung i < n: die Schleife wird genau (n 1)-mal ausgef uhrt, das erfordert n Vergleiche (Auswertung der Bedingung i < n). innerhalb der Schleife: n 1 - mal 1 Vergleich (Auswertung der Bedingung x > max), 1 Addition und 1 oder 2 Wertzuweisungen. Der Gesamtaufwand f ur die Schleife betr agt also (2n 1) Vergleiche +(n 1) Additionen +(n 1 + k ) Wertzuweisungen mit k {0, 1, . . . n 1}. Insgesamt ergibt sich im besten Fall (wenn die Anweisung max := x kein einziges mal ausgef uhrt wird, also k = 0 ist,) 2n 1 Vergleiche, n 1 Additionen und n + 1 Wertzuweisungen. Im schlechtesten Fall (die Anweisung max := x wird bei jedem Schleifendurchlauf ausgef uhrt, also k = n 1,) kommt man auf 2n 1 Vergleiche, n 1 Additionen und 2n Wertzuweisungen. Der beste Fall tritt ein, wenn die gr ote Zahl als erste eingegeben wird, der schlechteste Fall tritt ein, wenn jede eingegebene Zahl gr oer ist als das bisherige Maximum, dh. wenn die n Zahlen in aufsteigend sortierter Reihenfolge eintreffen. In jedem Fall (also auch im Durchschnitt) liegt der Aufwand in O(n), wenn man konstante Kosten f ur die Einzeloperationen ansetzt. b) Wir haben nach wie vor 2 Wertzuweisungen vor der Schleife und n Vergleiche f ur die Auswertung der Schleifenbedingung. Nur innerhalb der Schleife vereinfacht sich die Analyse: Man hat in jedem Fall 2 Additionen und 2 Wertzuweisungen. Insgesamt ergibt sich ein Aufwand von n Vergleichen, 2(n 1) Additionen und 2(n 1)+ 2 Wertzuweisungen. Dieser Aufwand ist bei fester(!) Anzahl n konstant, h angt also nicht von der Gr oe oder Verteilung oder Sortierung der eingegebenen Werte ab! Die best-case- ,worst-case- und damit auch average-case- Komplexit aten sind gleich (!) und liegen alle in O(n). Achtung! Die Frage ist nicht, f ur welches n der Aufwand seinen kleinsten oder gr oten Wert annimmt. Die Aussage die best-case Komplexit at wird f ur n = 0 (oder n = 1) erreicht ist falsch! Aufgabe 4.4 a) Wie oft wird in dem folgenden Programmst uck die Anweisung S ausgef uhrt? Was ist der charakterisierende Parameter?
i := 0 w h i l e ( i < n ) do j := 0 w h i l e ( j < i ) do S; j : = j +1 en d w h ile i := i + 1 en d w h ile

b) Welche Laufzeitkomplexit at hat das folgende Programmst uck? Welche Parameter bestimmen die Laufzeitkomplexit at?
i f ( n < a ) t h en i := 0 w h i l e ( i < a ) do S; i : = i +1 en d w h ile else i := 0 while ( i < n ) j := 0 while ( j < n ) S; j : = j +1

4. 15

en d w h ile i : = i +1 en d w h ile endif

L osung zu 4.4

a) Die Anweisung S wird in jedem Durchgang der inneren Schleife genau einmal ausgef uhrt. Diese innere Schleife wird i-mal durchlaufen, wobei i der Z ahler f ur die a uere Schleife ist. Im ersten Durchgang der a ueren Schleife wird S also einmal, im zweiten Durchgang der a ueren Schleife wird S zweimal ausgef uhrt und so fort. Die a uere Schleife wird aber genau n-mal durchlaufen, n amlich f ur die Werte i = 0, i = 1, . . . i = n 1. So wird S insgesamt ( 1) 0 + 1 + 2 + 3 + . . . + (n 1) = i=0 n 1) = n(n2 -mal ausgef uhrt. Die Komplexit at der beiden ineinander geschachtelten Schleifen ist also O(n2 ). b) Die Komplexit at wird im wesentlichen von der Anzahl der Schleifendurchl aufe bestimmt, wir z ahlen also wieder, wie oft die Anweisung S erreicht wird. Im Fall n < a wird S genau a-mal ausgef uhrt, n amlich so oft, wie die erste Schleife durchlaufen wird. Im Fall n a haben wir wieder zwei ineinander geschachtelte Schleifen, wobei aber nun die innere Schleife genau wie die a uere immer n-mal durchlaufen wird. S wird in diesem Fall also n2 - mal erreicht. Insgesamt ergibt sich f ur die Anzahl der Ausf uhrungen von S: anz (S) = max(a, n2 ) Die Komplexit at des Programms h angt also von den beiden Parametern a und n ab und liegt f ur alle drei F alle (worst / average / best case) in O(max(a, n2 )). Aufgabe 4.5 Ein Programm zum Sortieren von n Datens atzen habe eine Laufzeit von t(n) = 2n2 + 7n (gemessen in msec). a) Wie lange ben otigt das Programm zum Sortieren von 1000 Datens atzen? b) Wieviele Datens atze k onnen maximal in 1 Stunde sortiert werden? L osung zu 4.5

a) Die Laufzeit zum Sortieren von n = 1000 Datens atzen ist t(1000) = 2 10002 + 7 1000[msec] = 2007000[msec] = 2007[sec] = 33.45[min] Das Programm ben otigt also ungef ahr eine halbe Stunde. b) Wir fragen nun, f ur welches n die Laufzeit t(n) h ochstens 1 Stunde betr agt: t(n) 1[h] = 60[min] = 3600[sec] = 3600000[msec] 2n2 + 7n 3600000 Wir l osen die quadratische (Un-)Gleichung und erhalten n 1338. In einer Stunde k onnen also h ochstens 1338 Datens atze sortiert werden. Aufgabe 4.6 Beweisen Sie: a) 11n = O(n) n b) n 1 = O (1) c) d) e) f) g) h)
+1) 4 max(n2 , 10 (n n2 ) = O (n ) 17n 5 = O(n) 2n 3n1 = O (1) 2.5n + 4 = O(n) 2n+5 = O(1) n 1 3 n ) = O(n2 ) min(n2 + 2.4n, 10
2

4. 16

L osung zu 4.6

a) Mit n0 = 1 und c = 11 folgt f ur alle n n0 : 11n cn. n 2 n 2( n 1) n 2n 2 n 2 n 2 gilt mit n0 = 2, c = 2 die b) Wegen n 1 Behauptung.
n+1) ) = max(n2 , 10(n + 1)2 n2 ) = 10(n4 + 2n3 + n2 ) 10(n4 + 2n4 + n4 ) = 40n4 f ur c) Es ist max(n2 , 10(n 2 alle n N. Also kann man n0 = 1 und c = 40 w ahlen und es folgt die Behauptung. d) Wir m ussen zeigen, dass es ein c 0 und ein n0 0 gibt, sodass f ur alle n n0 gilt: cf (n) g (n) mit f (n) = n und g (n) = 17n 5. Wir w ahlen c = 17 und n0 = 0. 2n e) Hier m ussen wir ein c und ein n0 nden, sodass f ur alle n n0 gilt: 3n 1 c. Dies erreicht man mit c = 1 und n0 = 1. f) Gesucht sind ein c 0 und ein n0 0, sodass f ur alle n n0 gilt: g (n) cf (n) f ur f (n) = n und g (n) = 2.5n + 4. Eine erste grobe Absch atzung liefert 2.5n + 4 < 2.5n + 4n < 7n f ur alle n 1. c = 7 und n0 = 1 erf ullen also die Bedingung. Man kann aber auch etwas knapper absch atzen: Wegen 2.5n + 4 3n 4 0.5n n 8 k onnte man auch c = 3 und n0 = 8 w ahlen. Es gibt weitere (genauer: unendlich viele) Zahlenpaare c, n0 , die die Ungleichung n n0 : 2.5n + 4 cn erf ullen. +5 c 1 erf ullt. Auch hier gibt es g) Wir suchen nun ein Zahlenpaar c, n0 , das die Bedingung n n0 : 2nn wieder verschiedene M oglichkeiten zur Absch atzung: 5 2n+5 =2+ n 2 + 5 = 7 f ur n 1, man kann also c = 7, n0 = 1 w ahlen, oder n 5 5 2n+5 2n+5 = 2 + 3 1 5 n . Die Bedingung c f u r alle n n0 ist also auch f ur c = 3 und n n n n n0 = 5 erf ullt. 1 3 h) Wir untersuchen zun achst, welcher der beiden Ausdr ucke n2 + 2.4n und 10 n das Minimum bildet. Dazu 1 3 2 m ussen wir u berlegen, in welchen Bereichen n + 2.4n kleiner bzw. gr oer ist als 10 n . 1 1 3 2 2 Dazu bestimmen wir die Nullstellen von 10 n (n + 2.4n) = 10 n(n 10n 24) und erhalten n1 = 0, n2 = 12, n3 = 2. (Zur Erinnerung: p Die Nullstellen einer quadratischen Gleichung x2 + px + q berechnen sich nach der Formel x1,2 = 2
2

q .) 1 3 1 3 1 3 F ur n > 12 ist 10 n n2 2.4n positiv, also 10 n > n2 + 2.4n, also min(n2 + 2.4n, 10 n ) = n2 + 2.4n. 2 2 F ur n > 12 ist aber auch n + 2.4n 2n , also k onnen wir c = 2 und n0 = 12 w ahlen und erhalten 1 3 n ) = O(n2 ). min(n2 + 2.4n, 10 Aufgabe 4.7 Bestimmen Sie die best-case- und die worst-case-Komplexit at des Programms
z := 0 u := x w h i l e u > 0 do z := z + y u := u 1 en d w h ile

p2 4

Was ist der charakterisierende Parameter? L osung zu 4.7 Die Laufzeit des Programms h angt vom Wert der Eingabe x ab, x ist also der charakterisierende Parameter. Die Schleife wird genau x-mal durchlaufen, in jedem Schleifendurchlauf werden 4 Elementaroperationen ausgef uhrt (1 Addition, 1 Subtraktion, 2 Wertzuweisungen), also entsteht insgesamt ein Aufwand von 4x Einheiten f ur den Schleifenrumpf und x + 1 Einheiten f ur die Auswertung der Schleifenbedingung. Mit den beiden Zuweisungen vor der Schleife hat das Programm eine Laufzeit von 3 + 5x = O(x). Diese Laufzeit ist bei festem x immer gleich, also sind best-case-, worst-case- und average-case-Komplexit at alle gleich O(x).

5. 17

Abstrakte Datentypen

Aufgabe 5.1 Erweitern Sie den abstrakten Datentyp folge um a) b) c) d) die Operation length, die die Anzahl der Elemente (L ange) der Folge bestimmt die Operation isin, die u berpr uft, ob eine Folge ein gegebenes Element enth alt die Operation position, die die Positionsnummer eines Elementes in der Folge liefert die Operation insert, die eine neue Folge bestimmt, indem ein neues Element elem an einer bestimmten Stelle pos in die alte Folge eingef ugt wird e) die Operation delete, die eine neue Folge bestimmt, indem das Element an der Stelle pos aus der Eingangsfolge entfernt wird f) die Operation get, die das Element an der pos-ten Position liefert

L osung zu 5.1

a) length : M N length(f ) = 0 falls isemptyf olge(f ) 1 + length(rest(f )) sonst

b) isin : M M B falls isemptyf olge(f ) falsch wahr falls a = f irst(f ) isin(f, a) = isin(rest(f ), a) sonst

d) insert : M M N0 M falls pos > length(f ) + 1 oder pos = 0 concat(makef olge(elem), f ) falls pos = 1 insert(f, elem, pos) = concat(makef olge(f irst(f )), insert(rest(f ), elem, pos 1)) sonst e) delete : M N M falls pos > length(f ) oder pos = 0 rest(f ) falls pos = 1 delete(f, pos) = concat(makef olge(f irst(f )), delete(rest(f ), pos 1) sonst f) get : M N0 M falls pos > length(f ) oder pos = 0 f irst(f ) falls pos = 1 get(f, pos) = get(rest(f ), pos 1) sonst

c) position : M M N0 falls isin(f, a) 0 position(f, a) = 1 falls a = f irst(f ) 1 + position(rest(f ), a) sonst

Aufgabe 5.2 Betrachten wir den Datentyp folge auf der Menge M der nat urlichen Zahlen (einschlielich 0): M = N. a) Denieren Sie eine Operation sum, die die Summe der Folgenelemente berechnet. Beispiel: sum(< 1, 3, 2, 4 >) = 1 + 3 + 2 + 4 = 10 b) Denieren Sie eine Operation add, die aus zwei (gleichlangen!) Folgen eine neue Folge bestimmt, indem die Folgenglieder komponentenweise addiert werden. Beispiel: add(< 1, 3, 5, 7 >, < 4, 2, 6, 0 >) =< 5, 5, 11, 7 >

5. 18

L osung zu 5.2

a) sum : N N sum(f ) = 0 falls isemptyf olge(f ) f irst(f ) + sum(rest(f )) sonst falls length(f1 ) = length(f2) emptyf olge() falls length(f1 ) = length(f2) = 0 concat( makef olge(f irst(f1) + f irst(f2 )), add(rest(f1 ), rest(f2 )) ) sonst

Aufgabe 5.3 Betrachten wir den Datentyp folge auf der Menge M der nat urlichen Zahlen (einschlielich 0): M = N. a) Denieren Sie eine Operation max, die das Gr ote der Folgenelemente bestimmt. Beispiel: max(< 1, 3, 2, 4 >) = 4 b) Denieren Sie eine Operation vmax, die aus zwei (gleichlangen!) Folgen eine neue Folge bestimmt, indem die Folgenglieder komponentenweise miteinander verglichen werden und das jeweils gr oere in die neue Folge u bernommen wird. Beispiel: vmax(< 1, 3, 5, 7 >, < 4, 2, 6, 0 >) =< 4, 3, 6, 7 > L osung zu 5.3

b) add : N N N add(f1 , f2 ) =

a) max : N N f irst(f ) max(f ) = maximum(f irst(f ), max(rest(f ))) falls isemptyf olge(f ) falls length(f ) = 1 sonst

Dabei ist maximum : N N N die auf den nat urlichen Zahlen bekannte Funktion maximim(x, y ) = x y falls x y sonst

b) vmax : N N N vmax(f1 , f2 ) =

emptyf olge() makef olge(maximum(f irst(f1), f irst(f2 ))), concat( makef olge(maximum(f irst(f1), f irst(f2 ))), vmax(rest(f1 ), rest(f2 )))

falls length(f1 ) = length(f2) falls length(f1 ) = length(f2) = 0 falls length(f1 ) = length(f2) = 1

sonst

Aufgabe 5.4 Denieren Sie eine Operation minimum(f), die das kleinste Element einer Folge f nat urlicher Zahlen bestimmt. Schreiben Sie ein Modul (wie die Module spiegeln, auswerten, ersetzen aus der Vorlesung) zur Implementierung dieser Operation. L osung zu 5.4 minimum : N N falls isemptyf olge(f ) f irst(f ) falls f irst(f ) minimum(rest(f )) minimum(f ) = minimum(rest(f )) sonst

5. 19

Modul minimum(f ) wenn nicht isemptyfolge(folge) dann minimum := rst(f) sonst minimum := end wenn solange nicht isemptyfolge(f) wenn rst(f) < minimum dann minimum := rst(f) end wenn f := rest(f) end solange Modulende Aufgabe 5.5 Im Skript zur Vorlesung nden Sie folgende Denition 1 Sei M eine total geordnete Menge. Ein Baum t M heit (bin arer) Suchbaum u ur ber M , falls f jeden Knoten k in t gilt: Alle Knoten im linken Teilbaum von k sind kleiner als die Wurzel von k und alle Knoten im rechten Teilbaum von k sind gr oer als die Wurzel. Wir bezeichnen die Menge alle Suchb aume u . ber M mit M< In einem bin aren Suchbaum sind die Knoteneintr age also paarweise verschieden. Auerdem gilt: die inorder-Folge eines bin aren Suchbaums liefert die Eintr age aufsteigend sortiert. a) Pr ufen Sie, ob die beiden B aume aus Abb. 3 bin are Suchb aume ( uber der Menge der nat urlichen Zahlen M = N mit der u blichen kleiner-Relation) sind. b) Beweisen oder widerlegen Sie die Aussage: Wenn l und r zwei bin are Suchb aume sind und root(l) < a < root(r), dann ist auch < l, a, r > ein Suchbaum. c) Denieren Sie eine Operation istSuchbaum(t), die einen Baum t darauf pr uft, ob er ein bin arer Suchbaum ist. d) Denieren Sie eine Operation insert(t, a), die einen neuen Wert a in einen Suchbaum t einf ugt (so dass die Suchbaumeigenschaft erhalten bleibt). e) Implementieren Sie die Operation insert in einem Modul. f) Bestimmen Sie die best-case- und die worst-case-Komplexit at Ihrer Implementierung. Was ist der charakterisierende Parameter? Wann tritt der beste, wann der schlechteste Fall ein?
45

5 3 1 4
(a)

80 12 53 27
(b)

7 6 2

Abbildung 3: B aume zu Aufgabe 5.5 L osung zu 5.5

a) Bei dem Baum aus Abbildung 3(a) verletzt der Eintrag 2 die Suchbaumeigenschaft, der Baum aus (b) ist dagegen ein Suchbaum. b) Die Aussage ist falsch, denn es l at sich leicht ein Gegenbeispiel konstruieren: l =< 3, 5, 7 > und r =< 1, 13, 14 > sind zwei Suchb aume und ihre Wurzeleintr age sind kleiner bzw. gr oer als (z.B.) 11, aber < l, 11, r > ist kein Suchbaum. c) Wie wir gesehen haben, gen ugt es nicht, die Wurzeln der beiden Teilb aume mit der Wurzel des Gesamtbaums zu vergleichen, sondern man mu den gr oten Wert des linken Teilbaums und den kleinsten Wert des rechten

5. 20

und tmax : N N durch root (t) max(tmax(lef ttree(t)), root(t)) tmax(t) = max(tmax(righttree(t)), root(t)) max( tmax(lef ttree(t)), root(t), tmax(righttree(t))

Teilbaums mit dem Wurzelwert des Gesamtbaums vergleichen. Dazu denieren wir uns zwei Hilfsoperationen tmin : M N und tmax : M N: tmin : M N falls isemptytree(t) root ( t ) falls lef ttree(t) = righttree(t) = min(tmin(lef ttree(t)), root(t)) falls lef ttree(t) = righttree(t) = tmin(t) = min(tmin(righttree(t)), root(t)) falls righttree(t) = lef ttree(t) = min ( tmin(lef ttree(t)), root(t), tmin(righttree(t)) ) sonst falls isemptytree(t) falls lef ttree(t) = righttree(t) = falls lef ttree(t) = righttree(t) = falls righttree(t) = lef ttree(t) = ) sonst

d) Idee: Wenn der Baum t leer ist, erzeugen wir einen Baum mit dem (einzigen) Eintrag a. Wenn root(t) = a ist, dann lassen wir den Baum t unver andert, (denn dann ist kein Einf ugen mehr notwendig, der Wert a ist ja schon im Baum enthalten). Ansonsten entscheiden wir wie bei contains, ob a im linken oder im rechten Teilbaum von t eingef ugt werden mu. insert : M M M maketree(, a, ) falls t = maketree(insert(lef ttree(t), a), root(t), righttree(t)) falls a < root(t) insert(t, a) = maketree(lef ttree(t), root(t), insert(righttree(t), a)) falls a > root(t) t falls a = root(t)

Hierbei bezeichnen min bzw. max die bekannten Funktionen, die die kleinste bzw. gr ote von mehreren nat urlichen Zahlen bestimmen. Dann k onnen wir istSuchbaum : M B so denieren: falls t = wahr falls lef ttree(t) = righttree(t) = wahr falls righttree (t) = lef ttree(t) = istSuchbaum (lef ttree(t)) (max(lef ttree(t) < root(t)) wahr falls lef ttree(t) = righttree(t) = istSuchbaum(t) = istSuchbaum(righttree(t)) (min(righttree(t) > root(t)) wahr falls lef ttree(t) = righttree(t) = istSuchbaum(righttree(t)) istSuchbaum(lef ttree(t)) (max(lef ttree(t) < root(t) < min(righttree(t)) f alsch sonst

e) Modul insert(t, a) wenn isemptytree(t) dann wenn a < root(t) dann t := maketree(insert(lefttree(t), a), root(t), righttree(t)) sonst wenn a > root(t) dann t := maketree(lefttree(t), root(t), insert(righttree(t), a)) end wenn end wenn sonst t := maketree(, a, ) end wenn insert := t Modulende f) Einf ugen eines neuen Wertes geschieht immer als Blatt, nie als innerer Knoten. Es mu also bei jedem Einf ugen ein Pfad im Baum von der Wurzel bis zum Blatt verfolgt werden. Die Kosten sind dann proportional zur L ange des Pfades.

5. 21

Der Aufwand f ur eine Einf uge-Operation h angt also nicht nur von der Anzahl n der Knoten, sondern auch von der Gestalt des Baumes und damit von der Reihenfolge ab, in der die n Werte eingef ugt wurden. Es gen ugt also nicht, eine einzelne insert-Operation zu betrachten, sondern wir m ussen alle vorangegangenen Einf ugungen ber ucksichtigen. Anders ausgedr uckt: Wenn wir nach g unstigen und ung unstigen F allen suchen, m ussen wir nach guten bzw. schlechten Einf uge-folgen suchen. Der beste Fall tritt ein, wenn die Pfade im Baum m oglichst kurz sind. Gute Folgen sind also so gemischt, dass der entstehende Baum m oglichst ausbalanciert ist, die Pfadl ange ist dann f ur alle Pfade in O(log n). Der Gesamtaufwand f ur alle Einf ugeoperationen liegt in O(log 1) + O(log 2) + . . . + O(log n) = O(n log n). Der zu erwartende Aufwand f ur eine Einf ugeoperation ist dann in O(log n). Ung unstig ist, wenn der Baum einen extrem langen und ansonsten nur sehr kurze Pfade enth alt, im Extremfall entartet er zur Liste. Dies ist der schlechteste Fall. Er tritt ein, wenn die Einf ugefolge bereits sortiert ist. Die Kosten f ur alle Einf ugeoperationen sind dann n amlich in O(1) + O(2) + . . . + O(n) = O(n2 ) und die Kosten pro einzelner Einf ugeoperation liegen demnach in O(n). Aufgabe 5.6 Entwickeln Sie einen Algorithmus (in Form eines Moduls oder eines Block-Strukturdiagramms), der aus einer Folge, die nat urliche Zahlen in beliebiger Reihenfolge enth alt, eine sortierte Folge erzeugt. Tip: Dazu gibt es viele M oglichkeiten, z.B. Verwenden Sie zwei stacks als Hilfsmittel, von denen der erste nur Zahlen enth alt, die kleiner sind als alle Werte im zweiten. Auerdem sollen die Zahlen im ersten stack von unten nach oben aufsteigend sortiert sein, die im zweiten umgekehrt oder... denieren Sie zum Datentyp f olge eine Operation delete(f, a), die ein Element aus einer Folge entfernt und benutzen Sie diese zusammen mit minimum aus Aufgabe 5.4 oder... verwenden Sie die Ergebnisse aus Aufgabe 5.5. L osung zu 5.6

Sortieren durch Einf ugen Die beiden stacks zusammengenommen (den ersten von unten nach oben gelesen, den zweiten von oben nach unten) enthalten zu jedem Zeitpunkt eine sortierte Teilfolge von f . Es wird sukzessive das n achste Element der Folge f entnommen und durch umschaufeln der beiden stacks die richtige Stelle zum Einf ugen gesucht. Modul SortierenDurchEinfuegen(f) s1 := emptystack () s2 := emptystack () while not isemptyf olge(f ) do a := f irst(f ) f := rest(f ) while not isemptystack (s1) and top(s1) > a do push(s2, top(s1)) pop(s1) endwhile while not isemptystack (s2) and top(s2) < a do push(s1, top(s2)) pop(s2) endwhile push(a1, a) endwhile while not isemptystack (s1) do push(s2, top(s1)) pop(s1) endwhile while not isemptystack (s2) do f := concat(f, makef olge(top(s2)))

5. 22

pop(s2) endwhile return f modulende Sortieren durch Auswaehlen Man entnimmt der Folge f das kleinste Element und f ugt es an eine neue Folge hinten an. Dazu ben otigt man neben der Minimumsuche eine Operation zum Entfernen eines Elementes aus einer Folge, etwa: delete : M M M falls contains(f, a) f delete(f, a) = rest(f ) falls a = f irst(f ) concat(makef olge(f irst(f )), delete(rest(f ), a)) sonst Damit kann man dann programmieren: Modul SortierenDurchAuswaehlen(f) g := emptyf olge() while not isemptyf olge(f ) do a := minimum(f ) f := delete(f, a) g := concat(g, makef olge(a)) endwhile return g Modulende

Baumsortieren In Aufgabe 5.5 war schon bemerkt worden, dass die inorder-Folge eines bin aren Suchbaums die Knoten in sortierter Reihenfolge liefert. (Man kann auch beweisen, dass dies immer so ist.) Diese Beobachtung f uhrt dann zu folgender L osung: Modul BaumSortieren(f) t := emptytree() while not isemptyf olge(f ) do t := insert(t, f irst(f )) f := rest(f ) endwhile BaumSortieren := inorder(t) Modulende

6. 23

Formale Sprachen, BNF, EBNF

Aufgabe 6.1 Betrachten Sie die Grammatik G = < {a, b}, {S, A, B }, P, S > mit den Produktionen P (in BNF): S ::= AbB A ::= | aaA B ::= | bbB | S Geh oren aaaabbb, baaabbb und bbbaab zu L(G)? Geben Sie ggf. eine Ableitung an. L osung zu 6.1 S AbB aaAbB aaaaAbB aaaabB aaaabbbB aaaabbb ist eine Ableitung. baaabbb ist sicherlich nicht in L(G), denn man u berlegt sich schnell (exakt: mit vollst andiger Induktion u ber die L ange der Ableitung), dass alle W orter, die aus S abgeleitet werden k onnen, eine gerade Anzahl von as enthalten. S AbB bB bS bAbB bbB bbS bbAbB bbbB bbbS bbbAbB bbbaaAbB bbbaabB bbbaab ist eine Ableitung. Aufgabe 6.2 a) Geben Sie eine Grammatik an, die die Sprache L = {an bm cn | n, m N0 } erzeugt. b) Von welchem Typ ist Ihre Grammatik? c) Geben Sie jeweils eine Ableitung f ur die W orter ac, b, und aabbbcc an. L osung zu 6.2

a) G =< {a, b, c}, {S, T }, P, S } mit P = {S aSc, S bT, S b, S , T bT, T b} erzeugt die gew unschte Sprache. b) G ist kontextfrei. c) S aSc ac Sb S aSc aaScc aabT cc aabbT cc aabbbcc Aufgabe 6.3 In vielen Programmiersprachen d urfen Bezeichner (d.s. die vom Programmierer w ahlbaren Namen f ur Programme, Prozeduren, Variablen usf.) aus einer beliebigen Folge von Buchstaben und Ziffern bestehen, aber sie m ussen mit einem Buchstaben beginnen. a) b) c) d) e) Geben Sie eine Grammatik f ur Bezeichner an. Leiten Sie den Bezeichner Name1a ab. Geben Sie eine BNF f ur Bezeichner an. Geben Sie eine EBNF f ur Bezeichner an. Geben Sie ein Syntaxdiagramm f ur Bezeichner an.

6. 24

L osung zu 6.3

a) G =< {a, b, . . . z, A, B, . . . Z, 0, 1 . . . 9}, {Start , Buchstabe , Zeichenfolge , Zier }, P, Start > mit P = { Start Buchstabe Zeichenfolge Buchstabe a Buchstabe b . . . Buchstabe Zeichenfolge Zeichenfolge Zeichenfolge Zier Zier . . . b) Start Z Buchstabe Zeichenfolge Zier Zeichenfolge 0 1

Zier 9 } Buchstabe Zeichenfolge N Zeichenfolge N Buchstabe Zeichenfolge N a Zeichenfolge N a Buchstabe Zeichenfolge N a m Zeichenfolge N a m Buchstabe Zeichenfolge N a m e Zeichenfolge N a m e Zier Zeichenfolge N a m e 1 Zeichenfolge N a m e 1 Buchstabe Zeichenfolge N a m e 1 a Zeichenfolge N a m e 1 a = Name1a < Bezeichner > < Buchstabe > ::= ::= ::= < Buchstabe > | < Buchstabe >< Zeichenfolge > a | b | ... | z | A | B | ... | Z < Buchstabe > | < Zier > | | < Zier > ::= 0 < Buchstabe >< Zeichenfolge > < Zier >< Zeichenfolge > | 1 | ... | 9

c) BNF:

< Zeichenfolge >

d) EBNF: < Bezeichner > ::= < Buchstabe > {< Buchstabe > | < Zier >} < Buchstabe > ::= a | b | . . . | z | A | B | . . . | Z < Zier > ::= 0 | 1 | . . . | 9 e) Syntaxdiagramm: siehe Abb. 4
Buchstabe Bezeichner Buchstabe Ziffer

Abbildung 4: Syntaxdiagramm f ur Bezeichner

6. 25

Aufgabe 6.4 Erweitern Sie das Syntaxdiagramm f ur Ausdr ucke aus der Vorlesung um einzelne Bezeichner und Methodenaufrufe. Geben Sie ein entsprechendes Syntaxdiagramm f ur logische Ausdr ucke an. L osung zu 6.4 Teildiagramm f ur < Bezeichner > wie in Aufgabe 6.3. Teildiagramm f ur < Zahl > wie in Folien.
Ausdruck Zahlkonst ( Ausdruck + * / ) Ausdruck Ausdruck Ausdruck Ausdruck

Ausdruck Ausdruck Ausdruck Ausdruck

Methodenaufruf Bezeichner

Methodenaufruf Bezeichner ( Ausdruck , )

Zahlkonst Zahl Gleitzahl

Bezeichner true

false logAusdruck ( ( logAusdruck ) logAusdruck )

logAusdruck

logAusdruck =

logAusdruck

Ausdruck < < ...

Ausdruck

Methodenaufruf

6. 26

Aufgabe 6.5 Bei der Darstellung von Modulen haben wir bisher intuitiv gewisse Regeln eingehalten, z.B. haben wir Verzweigungen mit endif und Schleifen mit endwhile abgeschlossen. Fassen Sie die Regeln unserer Modulsprache in Syntaxdiagrammen zusammen. L osung zu 6.5
Modul Modul Bezeichner Anweisung Modulende

Anweisung Wertzuweisung Verzweigung Schleife

Wertzuweisung logAusdruck Bezeichner := Ausdruck Verzweigung if logAusdruck then Anweisung else Anweisung endif

Schleife while logAusdruck do Anweisung endwhile

6. 27

Aufgabe 6.6 In Java gelten folgende Syntaxregeln f ur die Darstellung von Gleitkommazahlen: Gleitkommazahlen bestehen aus einem optionalen Vorzeichen (+ oder -), einer Ziffernfolge (ohne f uhrende Nullen oder = 0) f ur den Vorkommaanteil und einem Nachkommaanteil oder einer Exponentangabe (oder beidem). Der Nachkommaanteil besteht aus einem Punkt und einer nichtleeren Ziffernfolge, die Exponentangabe besteht aus einem e oder E, gefolgt von einem optionalen Vorzeichen und mindestens einer, maximal zwei Ziffern. Beispiel: +3.14 3. 2.0e-7 0 3498E3 2.5e sind g ultige Darstellungen, sind keine g ultigen Darstellungen.

a) Geben Sie ein Syntaxdiagramm f ur die Darstellung von Gleitkommazahlen an. b) Geben Sie eine EBNF f ur die Darstellung von Gleitkommazahlen an. L osung zu 6.6

a) In Abbildung 5 ist das Syntaxdiagramm f ur eine Gleitkommazahl angegeben.


Gleitzahl + Ziffer Ziffer0 Ziffer

e . Ziffer E

+ Ziffer Ziffer

Abbildung 5: Syntaxdiagramm zu Aufgabe 6.6 b) < Gleitzahl < Vorzeichen < Vorkommateil < Gleitkommateil < Nachkommateil < Expoteil < exp > > > > > > > ::= ::= ::= ::= ::= :== ::= [< Vorzeichen >] < Vorkommateil >< Gleitkommateil > + | < GanzZahl > < Nachkommateil > [< Expoteil >] | [< Nachkommateil >] < Expoteil > . < Zier > {< Zier >} < exp > [< Vorzeichen >] < Zier > {< Zier >} e | E

Aufgabe 6.7 Geben Sie eine EBNF f ur Telefonbucheintr age an. Ein Eintrag besteht aus einem (Nach-)Namen, beliebig vielen Vornamen, einer mindestens 3-, maximal 5-stelligen Vorwahl, die mit 0 beginnt, einem Schr agstrich und einer mindestens 3-stelligen Rufnummer, die aber nicht mit 0 beginnen darf. Optional d urfen zu einem Namen maximal zwei weitere, durch Kommas abgetrennte Telefonnummern angegeben werden. L osung zu 6.7 < Eintrag < Name < Vorname < Buchstabe < Telnr < Vorwahl < Rufnr < Zahl < ZierOhne0 < Zier

> > > > > > > > > >

::= ::= ::= ::= ::= ::= ::= ::= ::= ::=

< Name > [< Vorname >] < T elnr > [, < T elnr >] [, < T elnr >] < Buchstabe >< Name > | < Buchstabe > < Name > [< Name >] A | B | . . . |z < Vorwahl > / < Rufnr > 0 < Zier >< Zier > [< Zier >][< Zier >] < ZierOhne0 >< Zier >< Zahl > < Zier > {< Zier >} 1 | 2 | . . . |9 0 | < ZierOhne0 >

6. 28

Aufgabe 6.8 Geben Sie eine EBNF f ur die Signaturen des Buchbestandes der Bibliothek an. Eine solche Signatur besteht aus 1-3 Grobuchstaben, einer maximal 4-stelligen Ziffernfolge ohne f uhrende Nullen, einer optionalen Angabe u ber die Auage und einer ebenfalls optionalen Angabe u ber die Anzahl der Exemplare. Die Auage wird als Ziffernfolge (ohne f uhrende Nullen) in runden Klammern angegeben, die Exemplaranzahl durch ein +-Zeichen und eine Ziffernfolge (ohne f uhrende Nullen). Beispiel: TVI 1067 +7 TYD 27 (2) TVA 16 (2) +10 und TZU 87 sind korrekte Signaturen. L osung zu 6.8 < Signatur >

::=

< Auage > < Anz > < Buchstabe > < Zier > < ZierOhne0 >

::= ::= ::= ::= ::=

< Buchstabe > [< Buchstabe >] [< Buchstabe >] < ZierOhne0 > [< Zier >] [< Zier >] [< Zier >] [< Auage >] [< Anz >] ( < ZierOhne0 > {< Zier >} ) + < ZierOhne0 > {< Zier >} a|b| . . . |z|A| . . . Z 0 | < ZierOhne0 > 1| . . . |9

7. 29

Zahldarstellung

Aufgabe 7.1 Vervollst andigen Sie folgende Tabelle:

dezimal 18

dual

oktal

hexadezimal

Zweierkomplement

0101 1101 207 A6 L osung zu 7.1

dezimal 18 93 135 166

dual 0001 0101 1000 1010 0010 1101 0111 0110

oktal 22 135 207 246

hexadezimal 12 5D 87 A6

Zweierkomplement 1110 1110 1010 0011 0111 1001 0101 1010

Aufgabe 7.2 Vervollst andigen Sie folgende Tabelle:

dezimal 23

dual

oktal

hexadezimal

Zweierkomplement

0111 1001 315 4C L osung zu 7.2

dezimal 23 121 205 76

dual 0001 0111 1100 0100 0111 1001 1101 1100

oktal 27 171 315 114

hexadezimal 17 79 CD 4C

Zweierkomplement 1110 1001 1000 0111 0011 0011 1011 0100

Aufgabe 7.3 Stellen Sie die Zahlen x = 2304, y = -4096 und z = 4096.001953125 in IEEE-Darstellung mit 32 bit dar. L osung zu 7.3 Die Dualdarstellung von 2304 ist 1001 0000 00002 = 1,0012 211 . Die Mantisse ist also 001 0000 0000 0000 0000 0000, der Exponent ist 11+127 = 138 = 1000 10102 und das Vorzeichen ist 0. Insgesamt: 0100 0101 0001 0000 0000 0000 0000 0000 Die Dualdarstellung von 4096.001953125 ist 1 0000 0000 0000, 0000 0000 12 = 1, 0000 0000 0000 0000 0000 12 212 . Mantisse = 0000 0000 0000 0000 0000 1000, Exponent = 12 + 127 = 139 = 1000 10112 und Vorzeichen = 0. Insgesamt: 0100 0101 1000 0000 0000 0000 0000 0100

7. 30

Aufgabe 7.4 Warum hat der Dezimalbruch 0.1 im dualen keine endliche Darstellung? (siehe Skript: 0.110 = 0.000112 ) L osung zu 7.4 Wir nehmen an, es gebe eine endliche Darstellung der 0.1 im Dualsystem, dh. es gebe eine nat urliche Zahl n und n n 1 ni Koefzienten k1 , . . . kn {0, 1}, sodass 10 = i=1 ki 2i = 21 . n i=1 ki 2 n n oglich, weil die rechte Seite niemals eine ganze Zahl sein Dann m ute i=1 ki 2ni = 2 10 sein. Dies ist aber unm kann (10 enth alt den Primfaktor 5, der sich in keiner Zweierpotenz herausk urzen l at). 1 Aufgabe 7.5 Stellen Sie die Dezimalzahlen 12.625 und -24.3125 im 32-bit-IEEE-Format dar. L osung zu 7.5 12.625 = 23 + 22 + 21 + 23 = 1100,1012 = 1,1001012 23 Das Vorzeichen ist 0, die Mantisse ist 100 1010 0000 0000 0000 0000 und der Exponent ist 3 + 127 = 13010 = 1000 00102 . Also wird 12.625 dargestellt als 0100 0001 0100 1010 0000 0000 0000 0000. 24.3125 = 24 + 23 + 22 + 24 = -11000,01012 = -1,100001012 24 Hier ist das Vorzeichen 1, die Mantisse ist 100 0010 1000 0000 0000 0000 und der Exponent ist 4 + 127 = 13110 = 1000 00112 . Insgesamt: 24.3125 1100 0001 1100 0010 1000 0000 0000 0000. Aufgabe 7.6 Ubertragen Sie 0100 1001 0111 0100 0010 0100 0000 0000 aus der 32-bit IEEE-Darstellung in Dezimalschreibweise. L osung zu 7.6 Wir zerlegen die Zahl in ihre Bestandteile: V = 0, E = 1001 00102 = 14610, M = 111 0100 0010 0100 0000 0000. Der Wert betr agt also (1)V (1.M ) (2E 127 ) = 1.111 0100 0010 0100 0000 0000 219 = 1111 0100 0010 0100 00002 = 1.000.00010

Argument l at sich verallgemeinern: Die rationalen Zahlen, die sich in einem b-adischen System (ein Zahlsystem zur Basis b) mit endlich vielen Nachkommastelen darstellen lassen, sind genau diejenigen, deren Nenner (nach weitestm oglichem K urzen) keine anderen Primfaktoren enth alt als b.

1 Dieses

You might also like