Übungsblatt 1 Vorlesung Algorithmentechnik im WS 08/09

Ähnliche Dokumente
1. Übung Algorithmentechnik

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

Übungen zu Algorithmentechnik WS 09/10

2. Musterlösung. Problem 1: Das Postamtplatzierungsproblem ** = min w i ( x p x i ) + w i ( y p y i ) i=1. w i + w m w i. 0 wegen (3) w m+1 m,m+1

3. Musterlösung. Problem 1: Boruvka MST

Lösungsvorschlag 1. Vorlesung Algorithmentechnik im WS 09/10

15. Elementare Graphalgorithmen

(a, b)-bäume / 1. Datenmenge ist so groß, dass sie auf der Festplatte abgespeichert werden muss.

Informatik II, SS 2018

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Algorithmen und Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen

Relationen und DAGs, starker Zusammenhang

Übungen zur Vorlesung Datenstrukturen und Algorithmen SS 2006 Blatt 13

Datenstrukturen und Algorithmen (SS 2013)

Algorithmen und Datenstrukturen Heapsort

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

2. Klausur zur Vorlesung Algorithmentechnik Wintersemester 2008/2009

Breitensuche BFS (Breadth First Search)

Übungsblatt 2 - Lösung

Wie wird ein Graph dargestellt?

Algorithmen & Komplexität

Fortgeschrittene Netzwerk- und Graph-Algorithmen

Datenstrukturen & Algorithmen Lösungen zu Blatt 4 FS 15

ContainerDatenstrukturen. Große Übung 4

1. Klausur zur Vorlesung Algorithmentechnik Wintersemester 2008/2009

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

Algorithmen und Datenstrukturen Tutorium Übungsaufgaben

Algorithmen und Komplexität Lösungsvorschlag zu Übungsblatt 8

5. Bäume und Minimalgerüste

2. Klausur zur Vorlesung Algorithmentechnik Wintersemester 2006/ April 2007

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

ADS: Algorithmen und Datenstrukturen 2

Effizienter Planaritätstest Vorlesung am

Algorithmen & Datenstrukturen Lösungen zu Blatt 9 HS 16

Vorlesung Datenstrukturen

durch Einfügen von Knoten konstruiert werden kann.

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

Natürliche Bäume. (Algorithmen und Datenstrukturen I) Prof. Dr. Oliver Braun. Letzte Änderung: :16. Natürliche Bäume 1/16

13 (2-4)-Bäume Implementierbare Funktionen. (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang

Ferien-Übungsblatt 8 Lösungsvorschläge

NAME, VORNAME: Studiennummer: Matrikel:

7. Dynamische Datenstrukturen Bäume. Informatik II für Verkehrsingenieure

9 Minimum Spanning Trees

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Übersicht: Graphen. Definition: Ungerichteter Graph. Definition: Ungerichteter Graph

Algorithmen und Datenstrukturen

1 DFS-Bäume in ungerichteten Graphen

1 DFS-Bäume in ungerichteten Graphen

= 1. Falls ( a n. ) r i. i=1 ( b p i

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

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

2. Grundlagen. Beschreibung von Algorithmen durch Pseudocode. Korrektheit von Algorithmen durch Invarianten.

Ferienkurs zur algorithmischen diskreten Mathematik Kapitel 1: Grundlagen der algorithmischen Graphentheorie

Grundlagen: Algorithmen und Datenstrukturen

Algorithmen & Komplexität

8.4 Digraphen mit negativen Kantengewichten Grundsätzliches Betrachte Startknoten s und einen Kreis C mit Gesamtlänge < 0.

Grundlagen: Algorithmen und Datenstrukturen

Karlsruher Institut für Technologie. Klausur Algorithmen I

10. Übungsblatt zu Algorithmen I im SS 2010

Aufgaben zur Klausurvorbereitung

Informationssysteme SS 2013 Lösungsvorschläge zu Übungsblatt 2. Übungsblatt 2. Für die Übungen in der Woche vom 29. April bis 03.

Algorithmen und Datenstrukturen

Traversierung 1 / 16. P.F. Stadler & S. Will (Bioinf, Uni LE) ADS 2, V3 23. April / 16

Zweizusammenhang und starker Zusammenhang

Vorlesung Datenstrukturen

Graphalgorithmen 2. Oleksiy Rybakov. 3. Juni Betreuer: Tobias Werth, Daniel Brinkers

Algorithmen & Komplexität

Graphalgorithmen II. Werner Sembach Werner Sembach Graphalgorithmen II / 22

Das Heiratsproblem. Definition Matching

10 Kürzeste Pfade SSSP-Problem

a) Fügen Sie die Zahlen 39, 38, 37 und 36 in folgenden (2, 3)-Baum ein:

12. Graphen. Notation, Repräsentation, Traversieren (DFS, BFS), Topologisches Sortieren, Ottman/Widmayer, Kap ,Cormen et al, Kap.

Klausur Algorithmen und Datenstrukturen

Graphdurchmusterung, Breiten- und Tiefensuche

Datenstrukturen & Algorithmen Lösungen zu Blatt 5 FS 14

Humboldt-Universität zu Berlin Berlin, den Institut für Informatik

Übung zur Vorlesung Diskrete Strukturen I

Aufgaben, Hilfestellungen und Musterlösungen zum Modul 5 Druckversion

Übungsblatt 7 - Voronoi Diagramme

Algorithmische Graphentheorie

12 (2-4)-Bäume Implementierbare Funktionen. (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang

Informatik II, SS 2014

Übung 3 Musterlösung

5. Vorrangwarteschlangen (priority queues)

Binary Decision Diagrams (Einführung)

Informatik II: Algorithmen und Datenstrukturen SS 2015

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Algorithmen I - Tutorium 28 Nr. 9

Praktikum Algorithmische Anwendungen WS 2006/07 Sortieren in linearer Laufzeit

Algorithmen und Datenstrukturen

Diskrete Strukturen. Hausaufgabe 1 (5 Punkte) Hausaufgabe 2 (5 Punkte) Wintersemester 2007/08 Lösungsblatt Januar 2008

Abgabe: (vor der Vorlesung)

Algorithmen und Datenstrukturen

Diskrete Strukturen. Hausaufgabe 1 (5 Punkte) Wintersemester 2007/08 Lösungsblatt Januar 2008

Vorlesung Datenstrukturen

Klausur Theoretische Informatik I WS 2004/2005

Übungsblatt 5 Lösungsvorschläge

ADS: Algorithmen und Datenstrukturen 2

Transkript:

Institut für Theoretische Informatik Lehrstuhl Prof. Dr. D. Wagner Übungsblatt Vorlesung Algorithmentechnik im WS 08/09 Problem : Amortisierte Analyse Für die Implementierung benutzen wir zwei Stacks E und D. Der Stack E wird für Enqueue- und der Stack D für Dequeue-Operationen benutzt. Formal sind die Operationen wie folgt implementiert: Algorithmus : Enqueue(x) Push(E,x) // O() Der Aufwand für das Enqueue ist in O(). Algorithmus : Dequeue() 3 Wenn D = solange E tue Push(D,Pop(E)) pop(d) // O() Der Aufwand für das Dequeue ist in O() falls D und in O( E ), falls D =.. Ganzheitsmethode wenn Dequeue Aufwand von E verursacht, dann müssen vorher E Enqueue-Operationen stattgefunden haben Gesamtaufwand für Dequeue-Operationen ist höchstens so groß wie Gesamtaufwand für Enqueue-Operationen, d.h. O(n) Gesamtaufwand T (n) = O(n) Aufwand pro Operation T (n)/n = O(). Buchungsmethode definieren Kosten wie folgt tatsächliche Kosten amortisierte Kosten Enqueue 3 Dequeue, E Idee: beim Einfügen bezahlt jedes Element das Einfügen in E sofort und hinterlegt Kredit von für Hinzufügen zu D ( Pop, Push)

amortisierte Kosten in O().3 Potentialmethode sei D i Datenstruktur nach i-ter Operation, Datenstruktur sei zu Beginn leer definiere Potential Φ : D i Φ(D i ) := E Φ(D O ) = 0, Φ(D i ) Φ(D 0 ) im Folgenden ĉ i : amortisierte Kosten, c i reale Kosten der i-ten Operation dann gilt ĉ i := c i + Φ(D i ) Φ(D i ) i-te Operation ist Enqueue mit E := k: ĉ i = c i + Φ(D i ) Φ(D i ) = + (k + ) k = 3 i-te Operation ist Dequeue mit D > 0, E := k: ĉ i = c i + Φ(D i ) Φ(D i ) = + k k = i-te Operation ist Dequeue mit D = 0, E := k: ĉ i = c i + Φ(D i ) Φ(D i ) = k + + 0 k = Problem : Untere Schranken Betrachte Entscheidungsbäume mit Maximalgrad k, wie in der Übung vorgestellt, als Algorithmenmodell. Wir interessieren uns für die minimale Anzahl an Entscheidungen, die jeder Algorithmus durchführen muss, um den Index i max des maximalen Elementes in der gegebenen Folge zu bestimmen. Jeder Entscheidungsbaum für das Maximum-Problem muss mindestens n Blätter haben, da jeder Index in {,..., n} als Index des maximalen Elementes in Frage kommt. Die Höhe eines Baumes mit n Blättern ist mindestens log k n. Um dies einzusehen, kann man sich klarmachen, dass jeder Weg von der Wurzel zu einem Blatt verwendet werden kann, um die Ausgabe (den Wert des Blattes) zu kodieren. Ein Baum mit Maximalgrad k und Höhe h kann dann höchstens k h Blätter haben, d.h. n k h und somit h log k n. Damit muss jeder Entscheidungsbaum eine Mindesthöhe von log k n haben und es existiert für jeden solchen Baum eine Eingabe, für die mindestens log k n Entscheidungen getroffen werden müssen. Bemerkung: Diese untere Schranke ist sogar scharf, wenn man das allgemeine Entscheidungsbaum- Modell betrachtet. Wie in der Übung gezeigt, kann man aber auch eine realistischere untere Schranke von n Vergleichen beweisen.

Problem 3: Laufzeit rekursiver Funktionen Betrachte die zweite Laufzeit mit Hilfe des allgemein formulierten Master-Theorems aus der Vorlesung. Es gilt: m 7 ( ) αi k = = 7 > Somit gilt der dritte Fall: i= i= T A (n) Θ(n c ) wobei für c gilt: 7 i= ( ) c = ( ) c = 7 Für die erste Laufzeit hingegen gilt analog: und somit: c = 7 c = log 7 m αi k = i= a i= = a Somit gilt zunächst folgende Fallunterscheidung: T B (n) Θ(n ) falls a < T B (n) Θ(n log n) falls a = T B (n) Θ(n c ) falls a > wobei wieder gilt a i= ( ) c = F ur a ist die Laufzeit T B (n) demnach geringer als T A (n). Beachte, dass wegen a i= αk i > = a i= αc i stets gilt c > k. F ur a > ist eine weitere Fallunterscheidung n otig, c muss für alle Werte von a berechnet werden. Berechne zun achst c für T B (n): a i= ( ) c = ( ) c = a somit gilt: c = a c = log a Vergleiche nun, wann für T A (n) und T B (n) derselbe Wert c gilt (Gleichstand): log a = log 7 a = log 7 = log 7 = ( log 7 ) = 7 = 9 Somit ist im Θ-Kalkül ein Algorithmus mit der Laufzeit T B (n) für a < 9 asymptotisch schneller als ein Algorithmus mit der Laufzeit T A (n). Problem : Das Tiefen-Bestimmungs-Problem Für das Tiefen-Bestimmungs-Problem wird eine Union-Find-Datenstruktur mit weighted Union und Pfadkompression modifiziert. Die Idee besteht darin, in der Union-Find-Datenstruktur nur die Knoten (ohne strukturelle Information über den Baum) zu verwalten und Knoten v in der Union- Find-Datenstruktur mit einem Label d(v) zu annotieren, welches zur Tiefen-Bestimmung verwendet werden kann. Das Label d(v) ist wie folgt definiert: d(v) := Find-Depth(v) Find-Depth(w) (i < k) d(w) := Find-Depth(w)

wobei w der unmittelbare Vorgänger von v in der Union-Find-Datenstruktur ist (nicht im richtigen Baum). Die Operation Make-Tree erzeugt einen neuen Baum und ist analog zu Makeset. Da x beim Erzeugen eines neuen Baumes Wurzel ist und Tiefe 0 hat, wird d[x] mit 0 initialisiert. Algorithmus 3 : Make-Tree(x) Eingabe : Knoten x Ausgabe : Neuer Baum mit Wurzel x d[x] 0 Vor[x] Die Operation Find wurde so modifiziert, dass sie die Label auf dem abgesuchten Pfad aggregiert. Diese Summe ergibt nach Definition der Label genau die Tiefe des von Find gesuchten Knotens. Zusätzlich wird nicht nur der Repräsentant der Menge (des Baumes), sondern auch die Tiefe des Knotens zurückgegeben. Bei der Pfadkompression müssen die Label angepasst werden. Dazu wird eine Variable PDepth verwendet, in der die Partialsumme der Label auf dem aktuellen Pfad gespeichert wird. Algorithmus : Find(x) Eingabe : Knoten x Ausgabe : Das Paar (Depth, r) (Tiefe und Wurzel von x) r x// Depth d[x] 3 solange Vor[r] > 0 tue r Vor[r] 5 Depth Depth + d[r] 7 8 9 0 3 i x // PDepth 0 solange Vor[i] > 0 tue t d[i] d[i] Depth PDepth d[r] PDepth PDepth + t temp i i Vor[i] Vor[temp] r Repräsentanten-Suche Pfadkompression Bemerkung zur Korrektheit: Sei v 0,..., v k die Folge der Knoten, die Find(x) durchläuft, d.h. x = v 0. Betrachte den i-ten Schleifendurchlauf der Schleife in Zeile 8, d.h. das Label von v i wird neu berechnet. Wir bezeichnen mit d alt den Wert der Label vor der Find-Operation und mit d neu den Wert des Labels nach der Find-Operation. Dann gilt : Depth=Find-Depth(x) und hat den Wert

q x q x wird Wurzel q r wird Wurzel q r q r q x x r r x d(q r ) d(q r ) + d x + d(q x ) d(q r ) d(q r ) + d x + Abbildung : Fallunterscheidung bei Attach(r, x) d(q x ) d(q x ) d(q r ) k s=0 d alt[s]. PDepth hat den Wert i s=0 d alt[s]. Damit gilt d neu [v i ] = Depth PDepth d[r] k i = d alt [s] d alt [s] d[r] = s=0 s=0 k d alt [s] d alt [r] s=i = Find-Depth(v i ) d alt [r] = Find-Depth(v i ) Find-Depth(r) Attach(r, x) ist eine Modifikation der Weighted-Union Operation aus der Vorlesung und hängt den Baum mit Wurzel r an den Knoten x eines anderen Baumes. Es sei darauf hingewiesen, dass weder r noch x Wurzeln in der Union-Find-Datenstruktur sein müssen. Daher bestimmt Attach zunächst die Repräsentanten von x und r. Anschließend werden die Mengen gemäß Weighted-Union vereinigt und es werden neue Labels berechnet (siehe auch Abbildung ). Algorithmus 5 : Attach(r, x) (modifiziertes Union) Eingabe : Wurzel r eines Baumes und ein Knoten x Ausgabe : Der Knoten r wird an x angehängt (d x, q x ) Find(x) (d r, q r ) Find(r) 3 z Vor[q x ] + Vor[q r ] Wenn Vor[q r ] < Vor[q x ] 5 Vor[q r ] q x und Vor[q x ] z d(q r ) d(q r ) + d x + d(q x ) 7 sonst 8 Vor[q x ] q r und Vor[q r ] z 9 d(q r ) d(q r ) + d x + d(q x ) d(q x ) d(q r ) 0 q x wird Wurzel q r wird Wurzel Schließlich wird für die Operation Find-Depth lediglich Find auf gerufen und die gefundene Tiefe

ausgegeben. Algorithmus : Find-Depth(x) Eingabe : Knoten x Ausgabe : Die Tiefe Depth(x) von x (d, r) Find(i) Depth(x) d Problem 5: Berechnung starker Zusammenhangskomponenten Zunächst war zu zeigen, dass eine Äquivalenzrelation ist. Dies ist für die Korrektheit des Algorithmus notwendig. Reflexivität: u u, da Weg der Länge 0 existiert Symmetrie: u v v u, nach Definition Transitivität: u v, v w u w, da Weg von u über v nach w und umgekehrt existiert Bemerkung: u w gdw. u und v liegen auf einem gerichteten Kreis Für die Berechnung starker Zusammenhangskomponenten wird eine (rekursive) Tiefensuche modifiziert. Die Idee besteht darin, iterativ gerichtete Kreise zu kontrahieren, die von der Tiefensuche gefunden werden, da alle Knoten auf einem gerichteten Kreis nach obiger Bemerkung in der selben starken Zusammenhangskomponente liegen. Es wird ein zusätzlicher Stack verwendet, um Information darüber zu verwalten, welche Knoten auf einem gerichtetn Kreis liegen. Wenn v 0,..., v k die Folge der Knoten auf dem aktuellen Tiefensuche-Pfad sind, dann liegen auf dem Stack Elemente w 0,..., w r mit folgender Eigenschaft: Für jedes i =,..., n existiert ein w j, so dass Find(v i ) = Find(w j ) und falls i < j und Find(v i ) = Find(w a ) sowie Find(v j ) = Find(w b ) gilt mit a b, dann gilt a < b. D.h. auf dem Stack liegen Repräsentanten von v 0,..., v k in der entsprechenden Reihenfolge und kein Repräsentant kommt mehrfach vor. Im Unterschied zur klassischen (rekursiven) Tiefensuche werden nun nicht nur Knoten, sondern Mengen (von äquivalenten) Knoten gefärbt. Wenn Mod-DFS-Visit einen Knoten zum ersten mal besucht, wird die Menge, in der dieser liegt, grau gefärbt, was bedeutet, dass dieser Knoten offen ist, bis die Menge, in der er liegt schließlich schwarz gefärbt wird. Eine solche Menge wird erst dann schwarz gefärbt (abgeschlossen), wenn alle Nachfolger aller Knoten in der Menge betrachtet wurden. Algorithmus 7 : Starke-Zusammenhangskomponenten Daten : Stack S Für v V Makeset(v) 3 π(w) Nil Color[Find(v)] White 5 7 Für v V Wenn Color[Find(v)] = White Mod-DFS-Visit(v) Wenn Mod-DFS-Visit einen neuen Knoten betrachtet, wird nachgesehen, ob die Menge, in der dieser Knoten liegt, noch grau ist. Ist dies der Fall, so gibt es in dieser Menge einen Knoten, der auf

dem aktuellen Tiefensuche-Pfad noch offen ist. Da alle Knoten in der betrachteten Menge äquivalent sind, gibt es auch einen Pfad von dem aktuell gefundenen Knoten zu diesem offenen Knoten und damit wurde ein Kreis gefunden. Dieser wird dann kontrahiert, d.h. die Knoten auf dem Kreis werden zu einer Menge vereinigt. Beachte, dass auf dem Kreis bereits kontrahiert Knoten liegen können. Algorithmus 8 : Mod-DFS-Visit(v, S) 3 5 7 8 9 Color[Find(v)] Gray Wenn Find(v) Find(Peek(S)) Push(S, v) Für (v, w) E Wenn Color[Find(w)] = White π(w) v Mod-DFS-Visit(w, S) sonst, wenn Color[Find(w)] = Gray Kontrahiere-Kreis(w, S) neuer Knoten Kreis gefunden 0 Wenn Find(π(v)) Find(Peek(S)) Color[Find(v)] Black Pop(S) Stack aufräumen Kontrahiere Kreis benutzt die auf dem Stack vorgehaltene Information über noch offene Knoten, um die Knoten auf dem gefundenen Kreis zu kontrahieren. Dabei ist w der Knoten auf dem Kreis, der in der Tiefensuche als erstes angetroffen wurde. Daher liegt dieser auf dem Stack am tiefsten. Kontrahiere Kreis nimmt alle Knoten bis einschließlich w vom Stack und vereinigt diese Mengen zu einer neuen Menge, die dann grau gefärbt wird. Algorithmus 9 : Kontrahiere-Kreis(w, S) 3 5 x Pop(S) solange Find(w) Find(x) tue Union(Find(w), Find(x)) x Pop(S) Color[Find(w)] Grey Push(S, w)