Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Ähnliche Dokumente
Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

13. Binäre Suchbäume

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

11.1 Grundlagen - Denitionen

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Kap. 4.2: Binäre Suchbäume

Kapiteltests zum Leitprogramm Binäre Suchbäume

Suchen und Sortieren Sortieren. Heaps

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Übersicht. Rot-schwarz Bäume. Rot-schwarz Bäume. Beispiel. Eigenschaften. Datenstrukturen & Algorithmen. Rot-schwarz Bäume Eigenschaften Einfügen

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

4 Greedy-Algorithmen (gierige Algorithmen)

Binäre Bäume Darstellung und Traversierung

14. Rot-Schwarz-Bäume

Informatik II, SS 2014

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Algorithmen und Datenstrukturen Suchbaum

Datenstrukturen und Algorithmen

Tutorium Algorithmen & Datenstrukturen

Datenstrukturen & Algorithmen

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Übungen zu Programmierung I - Blatt 8

Abschnitt: Algorithmendesign und Laufzeitanalyse

Informatik II, SS 2014

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Kapitel : Andere dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

2. Musterlösung. Problem 1: Least Common Ancestor

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Kapitel : Andere dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2013/14. Prof. Dr. Sándor Fekete

Übung zur Vorlesung Algorithmische Geometrie

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können.

Sortierte Folgen 250

Was bisher geschah ADT Menge mit Operationen: Suche nach einem Element Einfügen eines Elementes Löschen eines Elementes Realisierung durch

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

Bäume, Suchbäume und Hash-Tabellen

Suchbäume mit inneren Knoten verschiedener Knotengrade.

Algorithmen & Datenstrukturen 1. Klausur

9.4 Binäre Suchbäume. Xiaoyi Jiang Informatik II Datenstrukturen und Algorithmen

Einführung in die Informatik 1

Effiziente Algorithmen und Datenstrukturen I. Kapitel 9: Minimale Spannbäume

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Kapitel 2: Analyse der Laufzeit von Algorithmen Gliederung

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Programmiertechnik II

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Datenstrukturen & Algorithmen

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

JAVA - Suchen - Sortieren

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Grundlagen: Algorithmen und Datenstrukturen

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Übungsaufgaben: 1. Objektorientierte Programmierung - Teil 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Algorithmen und Datenstrukturen 1 VL Übungstest WS 2010/ November 2010

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.

6-1 A. Schwill Grundlagen der Programmierung II SS 2005

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel

5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten. Eingabe: Gerichteter Graph G =(V, E, c)

Seminarausarbeitung Entwurf und Analyse von Datenstrukturen. Splay Trees. Mirco Lukas und Alexander Werthmann. Datum:

Vorlesung Algorithmische Geometrie. Streckenschnitte. Martin Nöllenburg

Programmiertechnik II

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Binärbäume. Prof. Dr. E. Ehses,

3. Übung Algorithmen I

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Customization (Zuschneiden)

Kapitel 5: Dynamisches Programmieren Gliederung

Kurs 1613 Einführung in die imperative Programmierung Musterlösung zur Klausur am

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

368 4 Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen SS09

HEUTE. Datenstrukturen im Computer. Datenstrukturen. Rekursion. Feedback Evaluation. abstrakte Datenstrukturen

Programmiertechnik II

Datenstrukturen & Algorithmen

Kapitel 3. Speicherhierachie. Beispiel für Cache Effekte. Motivation Externspeicheralgorithmen. Motivation Für Beachtung von Cache Effekten

Suche in Spielbäumen Spielbäume Minimax Algorithmus Alpha-Beta Suche. Suche in Spielbäumen. KI SS2011: Suche in Spielbäumen 1/20

Übung Algorithmen I

Kostenmaße. F3 03/04 p.188/395

2 i. i=0. und beweisen Sie mittels eines geeigneten Verfahrens die Korrektheit der geschlossenen Form.

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Tutoraufgabe 1 (2 3 4 Bäume):

Programmieren ++ Begleitende Übungen zu Veranstaltungen + Umsetzen des Algorithmus in ein lauffähiges Programm

Fully dynamic algorithms for the single source shortest path problem.

Suchen und Sortieren (Die klassischen Algorithmen)

Algorithmen und Datenstrukturen

Kurs 1613 Einführung in die imperative Programmierung

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

(06 - Anwendungen von Stapeln und Schlangen)

Kurs 1612 Konzepte imperativer Programmierung Kurs 1613 Einführung in die imperative Programmierung

Amortisierte Analysen

Binäre Suchbäume. Ein Leitprogramm von Timur Erdag und Björn Steffen

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

16. All Pairs Shortest Path (ASPS)

Tutoraufgabe 1 (Vollständige Induktion): Tutoraufgabe 2 (Rotationen): Datenstrukturen und Algorithmen SS15 Übungsblatt 5 (Abgabe 3.6.

Laufzeit und Komplexität

Transkript:

Robert Elsässer Paderborn, den 15. Mai 2008 u.v.a. Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5 AUFGABE 1 (6 Punkte): Nehmen wir an, Anfang bezeichne in einer normalen Queue (s. Vorlesung) die Position des Elements, das am längsten in der Schlange ist. Analog bezeichne Ende die Position des zuletzt eingefügten Elements. Eine beidseitige Schlange (deque, double-ended queue) erlaubt nun das Einfügen und Entfernen von Elementen an beiden Seiten (Anfang und Ende) der Datenstruktur. Schreiben Sie die O(1)-Operationen Entfernen am Ende und Einfügen am Anfang und nehmen Sie dazu an, dass die beidseitige Schlange als Array realisiert ist. Beachten Sie dabei die Randbedingungen, d. h. ob die Schlange leer oder vollständig gefüllt ist. a) Einfügen am Anfang (3 Punkte) EnqueueFront(Q, x) 1 if head[q] = 1 2 then if tail[q] = length[q] 3 then Error( Q is full ) 4 else head[q] length[q] 5 Q[head[Q]] x 6 else if head[q] 1 = tail[q] 7 then Error( Q is full ) 8 else head[q] head[q] 1 9 Q[head[Q]] x b) Entfernen am Anfang (3 Punkte) DequeueBack(Q, x) x 1 if head[q] = tail[q] 2 then Error( Q is empty ) 3 else if tail[q] = 1 4 then tail[q] length[q] 5 else tail[q] tail[q] 1 6 x Q[tail[Q]]

AUFGABE 2 (6 Punkte): Entwerfen Sie einen Algorithmus mit Laufzeit O(n log k), der k sortierte nicht-leere Listen in eine sortierte Liste zusammenfasst (mischt), wobei n (n > k) die Gesamtzahl aller Elemente (also summiert über alle k Eingabelisten) ist. Erläutern Sie kurz Ihre Idee, geben Sie den Pseudocode des Verfahrens an und beweisen Sie, dass Ihr Algorithmus korrekt ist und die Laufzeitschranke O(n log k) erreicht wird. Hinweis: Benutzen Sie einen Heap zum Mischen von k Elementen und bei Bedarf Satellitendaten zusätzlich zum Schlüsselelement! Punkteschlüssel: Idee + Algo: 4 Punkte, Korrektheit + Laufzeit: 2 Punkte Idee: Das jeweils erste Element jeder Liste in ein Array stecken, zusammen mit dem Satellitendatum, aus welcher Folge das Element stammt. Das Array zu einem Min-Heap machen und dann nacheinander immer das oberste Element des Heaps entfernen und aus der Liste, aus der das Element stammte, das nächste Element in den Heap einfügen (wieder zusammen mit dem Satellitendatum). Laufzeit ganz kurz: Heap-Aufbau in O(k), dann brauchen wir für jedes Element, das eingefügt und gelöscht wird, O(log k) und somit insgesamt O(n log k) Schritte. Merge-k-way(L 1,..., L k, k) 1 for j 1 to k do 2 H[j].key head[l j ] 3 H[j].data j 4 head[l j ] next[head[l j ]] 5 BuildMinHeap(H) 6 while H not empty do 7 elem ExtractMin(H) 8 A[i] elem.key 9 j elem.data 10 if head[l j ] nil 11 then elem.key head[l j ] 12 HeapInsert(H, elem) 13 head[l j ] next[head[l j ]] 15 return A Korrektheit: Schleifeninvariante: Vor dem i-ten Schleifendurchlauf der while-schleife sind die i-1 kleinsten Elemente der Gesamtfolge in A[1..i-1] aufsteigend sortiert gespeichert. H speichert von jeder der k Listen L 1,..., L k das jeweils kleinste Element, das noch nicht in A gespeichert sind (bzw. einen leeren Knoten, falls die Liste leer ist). Initialisierung: A ist noch leer, somit sind die 0 kleinsten Elemente enthalten. H enthält den jeweils ersten Knoten jeder Liste, wegen deren Sortierung ist dies der kleinste. Erhaltung: In Iteration i wird das kleinste Element des Heaps an die Position A[i] geschrieben und aus dem Heap gelöscht. Somit wird der erste Teil der Behauptung erfüllt. Der zweite Teil wird erfüllt, indem das erste Element aus der Liste in den Heap eingefügt wird (sofern vorhanden), aus der das gelöschte Element stammt. Terminierung: Da in jeder Iteration ein Element gelöscht wird und nur so lange ein Element eingefügt wird, bis die entsprechende Ursprungsliste leer ist, muss der Heap nach n

Durchläufen leer sein und die Schleife terminieren. A enthält dann wegen i = n + 1 alle n Elemente in aufsteigend sortierter Reihenfolge. Laufzeit: Die for-schleife wird k-mal durchlaufen, jede einzelne Operation darin benötigt konstante Zeit, insgesamt also O(k). BuildMinHeap hat laut Vorlesung linearen Aufwand, hier damit auch O(k). Die while-schleife wird n-mal durchlaufen. Grund: Jedes der n Elemente in den Listen wird genau einmal in den Heap eingefügt und genau einmal daraus entfernt. Jeder Schleifendurchlauf kostet maximal O(log k) Schritte wegen des Einfügens eines neuen Elements in den k 1-elementigen Heap. Alle anderen Operationen sind in konstanter Zeit möglich. Insgesamt braucht die while-schleife daher O(n log k), was alle vorherigen Laufzeiten dominiert. AUFGABE 3 (6 Punkte): Die Operation Union auf dynamischen Mengen erhält als Eingabe zwei disjunkte Mengen L 1 und L 2 und gibt die Menge L = L 1 L 2 zurück, in der alle Elemente von L 1 und L 2 enthalten sind. Die Mengen L 1 und L 2 können durch diese Operation zerstört werden. Zeigen Sie, wie man Union so mit einer geeigneten Listen-Datenstruktur implementiert, dass die Operation in O(1) ausgeführt wird. Argumentieren Sie kurz, warum Ihr Verfahren korrekt ist und konstante Laufzeit hat! Idee: Statt nur eines Zeigers auf das erste Element wird zusätzlich ein Zeiger auf das letzte Element (tail) verwendet. Union besteht dann darin, die Elemente tail[l1] und head[l2] miteinander zu verketten. Schließlich fehlt noch, head[l] auf head[l1] zu setzen und tail[l] auf tail[l2]. Union(L 1, L 2 ) (5 Punkte inkl. Beschreibung der Idee) 1 if head[l 1 ] = nil 2 then return L 2 3 else if head[l 2 ] = nil 4 then return L 1 5 next[tail[l 1 ]] head[l 2 ] 6 prev[head[l 2 ]] tail[l 1 ] 7 head[l] head[l 1 ] 8 tail[l] tail[l 2 ] 9 return L Laufzeit und Korrektheit (1 Punkt): Jede Operation ist in O(1) möglich, daher auch Union insgesamt. Für die Korrektheit bleibt zu zeigen, dass L eine doppelt verkettete Liste mit head und tail ist und L alle Elemente aus L 1 L 2 enthält. Falls eine der beiden Listen leer ist, folgt die Korrektheit trivialerweise. Andernfalls folgt die Aussage direkt aus den Operationen in den Zeile 5-8, die die Verkettung herbeiführen und head und tail neu setzen. AUFGABE 4 (6 Punkte): In der Vorlesung haben Sie den rekursiven Inorder-Durchlauf von binären Bäumen kennengelernt, in den Präsenzübungen den rekursiven Preorder-Durchlauf. Entwerfen Sie nun nicht-rekursive (sondern iterative) Funktionen, die diese beiden Durchläufe von binären Bäumen realisieren. Geben Sie dazu zunächst kurz Ihre Idee an, danach den jeweiligen Pseudocode.

Zur Erinnerung: Preorder bedeutet, erst den Wurzelknoten zu besuchen, dann die beiden Teilbäume; Inorder bearbeitet erst den linken Teilbaum, besucht dann die Wurzel und zum Schluss den rechten Teilbaum. Tipp: Starten Sie mit Preorder und benutzen Sie bei beiden Verfahren einen Stack, um besuchte Knoten zu speichern! Da die Idee zur Konstruktion von Preorder m. E. einfacher als bei Inorder ist, sollten wir 2 Punkte für Preorder und 4 Punkte für Inorder vergeben.

PreorderNonrec(x) 1 if x nil 2 push(s, x) 3 while S not empty 4 x pop(s) 5 visit(x) 6 if rc[x] nil 7 then push(s, rc[x]) 8 if lc[x] nil 9 then push(s, lc[x]) InorderNonrec(x) 1 do 2 while x nil 3 push(s, x) 4 x lc[x] 5 if S not empty 6 then x pop(s) 7 visit(x) 8 x rc[x] 9 while S not empty