Universität Bielefeld Technische Fakultät AG Praktische Informatik Übung zu den Vorlesungen Algorithmen & Datenstrukturen Programmieren in Haskell Wintersemester 2012/2013 Aufgabe 11.1 (10 Punkte): Die Entwickler der neuen Suchmaschine YaGoBi haben vor Markteinführung noch ein verbleibendes Problem zu lösen: Auf dem Testserver kann YaGoBi ca. eine Suchanfrage pro ms beantworten. Die vielen freiwilligen Alpha-Tester erzeugen aber zu Stosszeiten bis zu 10 Suchanfragen pro ms, während zu anderen Zeitpunkten minutenlang auch mal garkeine Anfrage eintrifft. Damit keine Anfrage unbeantwortet bleibt und kein Tester ungleich länger warten muss als andere, braucht YaGoBi einen Mechanismus, um alle Anfragen in eine “Warteschlange” zu schieben und sie bei frei werdender Kapazität nacheinander abzuarbeiten. Dieser Mechanismus selber muss natürlich deutlich effizienter, d.h. schneller, als die eigentliche Suchanfrage sein. Bewerben Sie sich auf die kürzlich frei gewordene Chef-Programmierer Stelle bei YaGoBi, indem Sie in Haskell eine “Warteschlange”-Datenstruktur implementieren, die den beschriebenen Herausforderungen des Anfragen-Managements gewachsen ist. 1. Die genannten Zahlen sind lediglich exemplarisch zu verstehen, und können auf dem Produktiv-Server stark differieren. Es geht nicht darum eine konkrete Zeit zu schlagen, sondern effiziente Verfahren zu entwickeln. Ermitteln Sie daher zuerst die untere Effizienzklasse für das Entgegennehmen und Entfernen n beantworteter Anfragen. 2. Implementieren Sie die “Warteschlange”-Datenstruktur als abstrakten Datentyp in Haskell , der folgende Schnittstellen bereitstellt: module Queue ( Queue , emptyQueue , queueEmpty , enqueue , dequeue , front ) where emptyQueue queueEmpty enqueue dequeue front :: :: :: :: :: Queue a Queue a -> a -> Queue Queue a -> Queue a -> Bool a -> Queue a Queue a a 3. Analysieren Sie die Effizienzklasse Ihrer Implementierung. Entspricht sie der Problemklasse des “Warteschlangen”-Problems? Aufgabe 11.2 (6 Punkte): Es stehen drei Orks und drei Hobbits an einem Ufer eines Flusses. Es gibt nur ein Boot, das maximal zwei Personen (Orks oder Hobbits) tragen kann. Einer der beiden muss das Boot steuern. Sobald sich an einem Standort (linkes 1 Universität Bielefeld Technische Fakultät AG Praktische Informatik Flussufer, rechtes Flussufer oder Boot) mehr Orks als Hobbits befinden, fressen die Orks die Hobbits auf. Steigt zum Beispiel zuerst ein Hobbit in das Boot, so fressen die drei Orks die beiden am rechten Flussufer verbleibenden Hobbits. In welcher Reihenfolge können Hobbits und Orks den Fluss überqueren, ohne dass die Hobbits gefressen werden? Entwickeln Sie in Haskell einen Algorithmus, der alle möglichen Reihenfolgen für das Besteigen, Entsteigen und Überführen der Fähre ermittelt, so dass am Ende alle drei Orks und Hobbits das andere Flussufer erreicht haben ohne dass jemand gefressen wurde! Hinweis: Nehmen Sie sich vor Zyklen, wie z.B. dem Besteigen eines Orks auf das Boot und das anschließende Entsteigen des Orks – ohne eine Überfahrt zu machen, in Acht. Evtl. hilft ein Zähler, der nach einer angemessenen Anzahl Aktionen einen Versuch abbricht. Abgabe: Dienstag, 15.01.2013, 16:00 Uhr. Bearbeitung in 3er Gruppen (alle Namen und Tutor auf die Abgabe schreiben). 2