Algorithmen und Programmierung 3, WS 2015/2016 Klausur, Bearbeitung bis Dienstag, 12. April 2016, 16:00 Uhr. B4 1. Streckenschnitt, 10 Punkte Bestimmen Sie mit dem Algorithmus aus der Vorlesung alle Schnittpunkte der vier A 2 Strecken Ai Bi mit A1 , . . . , A4 = (4, 5), (1, 4), (2, 2), (6, 3) und B1 , . . . , B4 = (7, 3), (9, 2), (8, 6), (5, 6) A1 B3 E D C A3 F B1 A4 B2 durch Überstreichen der Ebene von links nach rechts. Geben Sie den Inhalt der vertikalen Struktur (der Fegegerade F ) und der horizontalen Struktur (der Ereigniswarteschlange Q) in jedem Schritt an. 2. Algebraische Spezifikation, 10 Punkte Die Operationen einfüge, lösche, leereMenge, und istenthalten für Mengen von ganzen Zahlen sind folgendermaßen spezifiziert (wie in der Vorlesung): istenthalten(x, leereMenge) = False istenthalten(x, einfüge(x, m)) = True istenthalten(x, einfüge(y, m)) = istenthalten(x, m), für x 6= y istenthalten(x, lösche(x, m)) = False istenthalten(x, lösche(y, m)) = istenthalten(x, m), für x 6= y Erweitern Sie die Spezifikation um eine neue Operation aek : Z × (Menge Z) → N. Das Ergebnis von aek (x, m) soll die Anzahl der Elemente in m sein, die kleiner als x sind. Begründen Sie kurz die Korrektheit Ihrer Lösung. 3. Dynamisches Programmieren, 10 Punkte Gegeben ist eine Folge (a0 , a1 , a2 , . . . , an−1 ) von n verschiedenen Zahlen, z. B. (5, 28, 19, 15, 20, 33, 12, 17, 10). Eine absteigende Teilfolge ist eine Teilfolge, die monoton fallend ist, zum Beispiel (19, 12, 10) oder die Teilfolge (20). (Jede einelementige Teilfolge ist eine absteigende Teilfolge.) Schreiben Sie ein effizientes Programm in Pseudocode, das die längste absteigende Teilfolge berechnet. Analysieren Sie die Laufzeit und den Speicherbedarf Ihres Algorithmus. Geben Sie eine kurze Begründung für die Korrektheit an. Hinweis: Es geht mit O(n) Speicher und O(n2 ) Zeit. Für einen korrekten Algorithmus, der in O(n log n) Zeit läuft, gibt es 5 Zusatzpunkte. (Dieser Algorithmus ist aber eher kompliziert.) 4. 2-3-Bäume, 10 Punkte Fügen Sie die Schlüssel DAVID, TENNIS, COUCH, HAND, PAPPE, MAUS, FISCH, YOGHURT, und ZEIT der Reihe nach in einem zunächst leeren 2-3-Baum ein, der die Schlüssel lexikographisch ordnet. Streichen Sie dann das Wort HAND. Zeigen Sie alle Zwischenschritte. (Wie in der Vorlesung sind die Werte nur in den Blättern des 2-3-Baumes gespeichert.) 22