Aufgabenblatt 11 (Warteschlange, Hobbits und Orks)

Werbung
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
Herunterladen