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.