Algorithmen und Datenstrukturen im WS 2003/2004 Übungsblatt 9

Werbung
Übungen zum Modul
Algorithmen und Datenstrukturen im WS 2003/2004
Prof. Dr. W. Kowalk,
Abteilung Rechnernetze,
Department Informatik, Fakultät II, Universität Oldenburg
Übungsblatt 9
9.1
Rekursive Berechnung mit 3AA (50 Punkte)
Hinweise: In der Vorlesung wurden ein Stack als eine Datenstruktur eingeführt, welche Daten (Werte oder Adressen) aufnehmen kann und jeweils den zuletzt aufgenommenen Wert
liefert. Durch Speichern von Rücksprungadressen im Stack lassen sich rekursive Prozeduren realisieren.
Der Stack wird in den meisten Rechnerarchitekturen in der Hardware implementiert, um
seine Benutzung einfacher und effizienter zu machen.
In 3AA wird ein 'Systemstack' durch die Variable
STACK
eingeführt, hinter welcher der Stack beginnt (der Wert ist implizit gesetzt, lässt sich aber
auch explizit setzen). Es werden die folgenden zusätzlichen Anweisungen eingeführt:
jumpProc con ProzedurName// Schiebe Rücksprungadresse in STACK, springe zur Prozedur
returnProc
// springe zur Rücksprungadresse (im STACK),dekrementiere STACK
get con 2, adr wert
// hole Wert aus (STACKadresse – 2)
put con 2, <ausdruck>
// schreibe Wert des Ausdrucks am (STACKadresse – 2)
push <ausdruck>
// erhöhe STACK, schreibe Wert des Ausdrucks an (STACKadresse)
pull <ausdruck>
// erniedrige STACK um Wert des Ausdrucks.
a)
Implementieren Sie ein 3AA-Programm, welches die Summe der ersten N Zahlen rekursiv
berechnet. In Pseudo(Java)-Notation soll der Algorithmus folgende Funktionalität implementieren:
int sumN(n) {
if(n<=0) return 0;
return sumN(n-1)+n;
}
Begründen Sie informal, warum dieser Algorithmus nach einer endlichen Zeit terminiert. Ist
die Laufzeitkomplexität linear in n?
b)
i. Implementieren Sie ein 3AA-Programm, welches die Fibonacci-Zahl zu einer Zahl rekursiv berechnet. In Pseudo-Notation soll der Algorithmus folgende Funktionalität implementieren:
int fib(n) {
if(n<=1) return 1;
return fib(n-1)+fib(n-2);
}
ii. Beschreiben Sie informal, wie die Fibonacci-Zahlen definiert sind.
iii.Versuchen Sie, anhand von Laufzeitmessungen die Laufzeitkomplexität abzuschätzen.
Hinweis: Testen Sie diese Funktion zunächst mit kleinen Werten (<20).
9.2
Lineare Schleifen (50 Punkte)
a)
In der Vorlesung wurden Lineare Schleifen eingeführt.
i. Die folgende Lineare Schleife 2. Grades berechnet die Folge der Fibonacci-Zahlen
1
2
3
4 NochMal
5
6
7 a
8 b
// Lineare Schleifen, Fibonacci
adr a := con 1
adr b := con 0
adr a := val a + val b
adr b := val a - val b
goto con NochMal
Bestätigen Sie dieses anhand einiger Beispielrechnungen.
ii. Beweisen Sie dieses induktiv, indem Sie zeigen: wenn a und b die Werte
a=Fib(n-1)
b=Fib(n-2)
am Anfang der Schleife enthalten, dann enthält nach einem Schleifendurchlauf
a=Fib(n)
b=Fib(n-1).
iii.Bestätigen Sie das allgemeine Wachstumsgesetz der Fibonaccizahlen
 
k
 
k
1  5 1  5
 5−1⋅ 1−  5 .
F k=
⋅

2
2
2⋅ 5
2⋅ 5
indem Sie diesen Wert mit den aus dem Algorithmus bestimmten vergleichen. Eine Näherungsformel für Fib(N) ist:
Fib(N) ≈ A * BN, wobei A ≈ 0.7236067977499789, B ≈ 1.618033988749895.
Hinweis: verwenden Sie Gleitpunktzahlen:
A con
B con
0.7236067977499789
1.618033988749895
und rechnen Sie in jedem Schleifendurchlauf: adr A := val A *f val B
iv. Welche Laufzeitkomplexität hat das Programm unter i. (bzw. iii.)?
b)
In der Vorlesung wurden Polynomschleifen eingeführt. Es wurde behauptet, dass diese stets
eine Wertefolge annehmen, die einem Polynom entsprechenden Grades entsprechen
Pk(n) = ak*nk + ak-1*nk-1 + ... + a1*n + a0.
1
2
3
4
5 NochMal
6
7
8
// Polynomschleifen für Polynom vom Grad 3
adr a := con -10
adr b := con 100
adr c := con 2
adr c := val c + val b
adr b := val b + val a
adr a := val a + con 1
goto con NochMal
i. Bestimmen Sie die Anfangswerte im Algorithmus für ein Polynom vom Grad 3, dessen
erste vier Werte (3, -3, 0, 4) sind.
Wie groß ist das konstante Inkrement?
Berechnen Sie die ersten zwanzig Werte.
ii. Geben Sie einen mathematischen Beweis für das polynomiale Verhalten an.
Hinweis: Zeigen Sie, dass P(n)-P(n-1) stets ein Polynom vom Grad k-1 ist.
Hinweis: Sie können die Programme unter 9.2.a) und 9.2.b) auch in Java schreiben und abgeben!
Hinweise:
Die Übungen sind bis Freitag, 19.12.2003, 10.00 Uhr in den Kästen der jeweiligen Tutoren
abzugeben.
Herunterladen