Universität Bielefeld Technische Fakultät AG Praktische Informatik Übung zu den Vorlesungen Algorithmen & Datenstrukturen Programmieren in Haskell Wintersemester 2014/2015 Aufgabe 7.1 (6 Punkte): Ein Baumarkt bezieht Küchen-Arbeitsplatten der Länge n Meter von einem Hersteller. Um diese an seine Kunden zu verkaufen, werden sie in kürzere Platten zersägt. Der Verkaufspreis einer Arbeitsplatte richtet sich nach seiner Länge: Länge in Metern Preis in e 1 1 2 5 3 8 4 9 5 10 6 17 7 17 8 20 Wie lässt sich der Gesamt-Verkaufspreis maximieren? Zum Beispiel müsste eine Arbeitsplatte von 8m in eine 6m und eine 2m lange Platte zersägt werden, um den maximalen Gesamtpreis von 22 e zu erzielen. Hinweis: Angenommen wir entscheidenen uns ein erstes Stück mit 3m Länge zu produzieren. Dann müssen wir anschließend ermitteln, ob und wie die verbleibenden 5m zersägt werden sollen. Das Problem besteht also weiterhin, ist aber von 8m auf 5m reduziert worden. • Implementieren Sie eine Funktion, die den maximal möglichen Gesamtpreis für eine gegebene Ausgangslänge n ermittelt. Die durch Zersägen entstehenden Stücke dürfen nur die in der Tabelle genannten Längen haben, nach denen sich auch die Preise richten. Ihre Funktion muss die Stückelung nicht mit ausgeben, sondern nur den Gesamtpreis. • Ob Sie einen ersten Schnitt bei 3m oder zwei Schnitte bei je 1m und 2m machen führt in beiden Fällen zu dem Problem, wie die verbleibenden 5m zersägt werden sollen. Teillösungen (hier das Zersägen einer 5m Platte) werden also mehrfach benutzt. Implementieren Sie eine zweite Version Ihrer Funktion aus Teil 1., die sich der dynamischen Programmierung bedient, d.h. Teilergebnisse tabelliert (vielleicht mittels array?). Aufgabe 7.2 (2 Punkte): In der Datenstruktur Tree a für einen Baum data Tree a = Nil | Leaf a | Br ( Tree a ) ( Tree a ) ist der Konstruktor Nil nicht unbedingt notwendig. Aus Effizienzgründen ist es oft sinnvoll, möglichst alle Vorkommen von Nil aus dem Binärbaum zu entfernen. Schreiben Sie eine Funktion delNil :: Tree a -> Tree a, die aus einem Binärbaum alle Vorkommen von Nil entfernt. Die Reihenfolge der verbleibenden Blätter soll dabei unverändert bleiben. Wenn ein Binärbaum nur aus Nil besteht, soll das Ergebnis Nil sein. 1 Universität Bielefeld Technische Fakultät AG Praktische Informatik Aufgabe 7.3 (3 Punkte): Definieren Sie in Haskell Funktionen countbr, balanced und minmaxpath über Bäumen: 1. countbr :: Tree a -> Int zählt die Anzahl der Verzweigungen (d.h. Br-Konstruktoren) in einem Baum. 2. Sei k ≥ 0. Ein Baum b ist k-balanciert, falls für jeden Teilbaum (Br l r) von b gilt: |countbr l − countbr r| ≤ k Ein 1-balancierter Baum heißt ausgeglichen. balanced :: Int -> Tree a -> Bool liefert True gdw. der Baum k-balanciert ist. Dabei ist k das erste Argument von balanced. 3. Wir betrachten die Menge P aller Pfade in einem Baum b, die bei der Wurzel beginnen und an einem Blatt enden. minmaxpath b liefert ein Paar (lmin , lmax ), wobei lmin die minimale Länge und lmax die maximale Länge eines Pfades aus P ist. Für den Baum aus Aufgabe 6.3(2) (rechts) soll minmaxpath :: Tree a -> (Int, Int) das Ergebnis (2, 5) liefern. Abgabe: Mittwoch, 03.12.2014, 16:00 Uhr. Bearbeitung in 2er Gruppen (alle Namen und Tutor auf die Abgabe schreiben). 2