n-1 + •••+ c1x + c0 fx = x * •••x * x *cn + cn

Werbung
Gunther Heidemann
Stefan Kurtz
Universität Technische
Bielefeld
Fakultät
Übungen zur Vorlesung
Algorithmen & Datenstrukturen I
Wintersemester 2001/2002
Als Lösungen zu den Aufgaben 6.3–6.5 sollen lauffähige Haskell-Programme entwickelt werden.
Dazu steht der Haskell-Interpreter hugs zur Verfügung. Informationen, Dokumentation, etc. findet
man auf der Website zur Vorlesung, siehe unten.
Aufgabe 6.1 (4 Punkte) Wenn man hugs mit hugs +s startet, dann wird nach der Auswertung
eines Ausdrucks jeweils die Reduktions-Statistik ausgegeben, d.h. die Anzahl der benötigten Reduktionen und Zellen. Dadurch erhält der Benutzer Auskunft über die Laufzeit und das Speicherplatzverhalten einer Auswertung. Alternativ erzielt man den Effekt, indem man nach dem Aufruf
von hugs den Befehl :set +s ausführt. Durch :set -s läßt sich die Ausgabe der ReduktionsStatistik wieder abschalten. Wir betrachten nun zwei Implementierungen g1 und g2 der gleichen
Funktion g (x) = x3 + 2x2 , x , 17:
g1,g2::Int->Int
g1 x = xˆ3 + 2*xˆ2 - x - 17
g2 x = x * (x * (x + 2) - 1) - 17
Ermitteln Sie den Effizienzunterschied bei der Auswertung von g1 42 und von g2 42. Begründen Sie den Effizienzunterschied, indem Sie die Anzahl der benötigten Multiplikationen und
Additionen zählen.
Die Funktion g2 ergibt sich aus g1 nach dem Horner-Schema. Allgemein lautet das HornerSchema wie folgt: Ein Polynom
f (x)
6
(cn = 0)
=
n
cn x
+ cn,1 x
,1 + + c
n
1 x + c0
(1)
vom Grad n in einer Unbekannten x läßt sich wie folgt auswerten:
f (x)
=
x
(( ( x
x
cn
+ cn,1 ) +
) +
c0
(2)
Verallgemeinern Sie Ihr Ergebnis bzgl. g1 und g2, indem Sie die Anzahl der Rechenschritte (Multiplikationen und Additionen) für die Auswertung von f gemäß (1) und (2) bestimmen. Die Anzahl
ist natürlich abhängig vom Grad n des Polynoms. Gehen Sie davon aus, daß alle Konstanten ci ,
i 2 [0; n], von 0 verschieden sind. Wie kann man f (x) gemäß (1) effizient auswerten, ohne das
Horner Schema zu verwenden?
Aufgabe 6.2 (2 Punkte) Bestimmen Sie mit hugs den Typ der folgenden Funktion analyzeORFs
und vergleichen Sie das Ergebnis mit der entsprechenden Typangabe aus dem Skript. Warum
stimmt der von hugs gelieferte Typ nicht mit dem Typ aus dem Skript überein?
analyzeORFs1 (strain, antistrain)
= map (map translate) orfs where
sixframes = frames3 strain ++ frames3 (reverse antistrain)
orfs
= map findStartPositions sixframes
Aufgabe 6.3 (6 Punkte) Durch die Deklaration
data U = TT U U | B | Q
deriving (Show, Eq, Ord)
ist die Operation < implizit definiert.
(1)
Schreiben Sie in Haskell eine gleichwertige Funktion kleiner, und zeigen Sie die Gültigkeit von kleiner x y = (x < y) an mindestens 10 Beispielen.
(2)
Ein x::U sei geringer als y::U, falls es weniger B’s enthält. Definieren Sie in Haskell eine
entsprechende Funktion geringer:: U -> U -> Bool.
(3)
Harry Hacker behauptet: Falls geringer x y == False und geringer y x ==
False, dann folgt x == y. Beweisen oder widerlegen Sie diese Aussage.
Aufgabe 6.4 (4 Punkte) Falls für Sequenzen u, v und s die Gleichung s = u ++ v gilt, dann
nennt man u einen Präfix und v einen Suffix von s. Definieren Sie Haskell-Funktionen
suffixes::[a]->[[a]]
prefixes::[a]->[[a]]
die alle Suffixe bzw. Präfixe einer Liste berechnen. Natürlich ist die leere Liste immer ein Suffix
und ein Präfix.
Aufgabe 6.5 (6 Punkte) Definieren Sie in Haskell eine Funktion
exactmatch::(Eq a)=>[a]->[a]->[Int]
die eine Liste p in einer Liste t findet. Die Funktion soll alle Start-Position in t berechnen, an
denen p vorkommt. Denken Sie daran, daß die Vorkommen von p auch überlappend sein können.
Beispiel:
exactmatch "en" "Algorithmen und Datenstrukturen"
soll die Liste [10; 21; 24] liefern
Abgabe der Lösungen: Mittwoch, 12. Dezember 2001 zu Beginn der Vorlesung.
Bitte alle Namen der Gruppenmitglieder, den Termin Ihrer Übungsgruppe und den Namen des
Tutors auf dem Deckblatt angeben.
Auf der Web-Seite
http://www.techfak.uni-bielefeld.de/ags/pi/lehre/AuDIWS01/
finden sich weitere Informationen zur Vorlesung und zu den Übungen, sowie elektronische Versionen der Übungsblätter.
Herunterladen