9. Übung Algorithmen I

Ähnliche Dokumente
8. Übung zu Algorithmen I 15. Juni 2016

10. Übungsblatt zu Algorithmen I im SS 2010

Breitensuche BFS (Breadth First Search)

10. Übung Algorithmen I

15. Elementare Graphalgorithmen

Definition Gerichteter Pfad. gerichteter Pfad, wenn. Ein gerichteter Pfad heißt einfach, falls alle u i paarweise verschieden sind.

Zweizusammenhang und starker Zusammenhang

Übung Algorithmen und Datenstrukturen

Das Heiratsproblem. Definition Matching

Karlsruher Institut für Technologie Institut für Theoretische Informatik. Klausur Algorithmen I

Programmierkurs Python

Programmierkurs Python II

Quicksort ist ein Divide-and-Conquer-Verfahren.

\ E) eines Graphen G = (V, E) besitzt die gleiche Knotenmenge V und hat als Kantenmenge alle Kanten des vollständigen Graphen ohne die Kantenmenge E.

1. Übung Algorithmen I

Algorithmen und Datenstrukturen Tutorium Übungsaufgaben

Algorithmen und Datenstrukturen

Kap. 6.3: Traversieren von Graphen Kap. 6.4: Elementare Graphalgorithmen

Breiten- und Tiefensuche in Graphen

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

MafI I: Logik & Diskrete Mathematik (F. Hoffmann)

Relationen und DAGs, starker Zusammenhang

Lösungen zu Kapitel 5

Algorithmen und Datenstrukturen

11. Übungsblatt zu Algorithmen I im SS 2010

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

Definition Ein gerichteter Graph G = (V, E) ist ein Graph von geordneten Paaren (u, v) mit u V und v V.

11. Übung Algorithmen I

Kap. 5: Graphen. Carsten Gutwenger Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund. 17. VO DAP2 SS

Wie wird ein Graph dargestellt?

Graphdurchmusterung, Breiten- und Tiefensuche

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 2-1. Seminar -

WS 2009/10. Diskrete Strukturen

Grundlagen: Algorithmen und Datenstrukturen

Effiziente Algorithmen

8 Diskrete Optimierung

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

Grundlagen Algorithmen und Datenstrukturen TUM Sommersemester 2011 (2) Dozent: Hanjo Täubig

Datenstrukturen und Algorithmen 2. Klausur SS 2001

Übung Algorithmen und Datenstrukturen

1 DFS-Bäume in ungerichteten Graphen

Algorithmen I. Prof. Jörn Müller-Quade Institut für Theoretische Informatik Web:

9. Übung Algorithmen I

Repetitive Strukturen

Algorithmen und Datenstrukturen Graphen - Einführung

NAME, VORNAME: Studiennummer: Matrikel:

Programmierkurs Python II

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Graphen und Bäume. A.1 Graphen

Algorithmen und Datenstrukturen SS09. Foliensatz 16. Michael Brinkmeier. Technische Universität Ilmenau Institut für Theoretische Informatik

Tutoraufgabe 1 (Starke Zusammenhangskomponenten):

Verkettete Datenstrukturen: Bäume

Tutoraufgabe 1 (Suchen in Graphen):

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

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

2. November Gradfolgen Zusammenhang Kürzeste Wege. H. Meyerhenke: Algorithmische Methoden zur Netzwerkanalyse 37

Algorithmen und Datenstrukturen 2

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

Graphalgorithmen 2. Dominik Paulus Dominik Paulus Graphalgorithmen / 47

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

10 Graphenalgorithmen in Java

1 Der Baum. Informatik I: Einführung in die Programmierung 11. Bäume. Bäume in der Informatik. Bäume in der Informatik - Definition.

Algorithmen und Datenstrukturen

Weiterführendes Programmieren Lineare Widerstandsnetzwerke II Aufgabenblatt 6. 1 Zusammenfassung der elektrotechnischen Begriffe

Polygontriangulierung

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

NP-vollständige Probleme

Maximale s t-flüsse in Planaren Graphen

SS10 Effiziente Algorithmen 2. Kapitel: Graphdurchläufe

Gliederung. Definition Wichtige Aussagen und Sätze Algorithmen zum Finden von Starken Zusammenhangskomponenten

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

Einführung in die Informatik 2

11.1 Grundlagen - Denitionen

DOM Document Object Model

Algorithmen und Datenstrukturen Suchbaum

Mergeable Heaps. C. Komusiewicz 7.1 Fibonacci-Heaps: Überblick 117

Kap. 6.5: Minimale Spannbäume

Keller, Schlangen und Listen. Elementare Datenstrukturen Keller, Schlangen und Listen 1 / 14

Transkript:

INSTITUT FÜR THEORETISCHE INFORMATIK 1 KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft Institut für Theoretische www.kit.edu Informatik

Musterlösung der Probeklausur... online ab Dienstag, 17.6. 2

Breiten- und Tiefensuche in Graphen 3

Wiederholung: Breitensuche Procedure bfs(g=(v, E) : Graph, s: node) Q=[ ] : Queue Q.enqueue(s) label s as visited while Q is not empty do v = Q.dequeue() process(v) foreach w : {v, w} E do if w not visited then Q.enqueue(w) label w as visited 4

Wiederholung: Tiefensuche rekursiv Procedure dfs(g=(v, E) : Graph, v: node) label v as visited process(v) foreach w : {v, w} E do if w not visited then dfs(g,w) 5

Tiefensuche iterativ Procedure dfs(g=(v, E) : Graph, s: node) S=[ ] : Stack S.push(s) label s as visited while S is not empty do v = S.pop() if v is not visited then label v as visited process(v) foreach w : {v, w} E do S.push(w) 6

DFS iterativ oder rekursiv: Was ist besser? 7

DFS iterativ oder rekursiv: Was ist besser? Performancefrage nicht pauschal zu beantworten - hängt von komplizierten Einflüssen ab, z.b. Compileroptimierungen Cache-Effekten Tiefe der Suche... 7

DFS iterativ oder rekursiv: Was ist besser? Performancefrage nicht pauschal zu beantworten - hängt von komplizierten Einflüssen ab, z.b. Compileroptimierungen Cache-Effekten Tiefe der Suche... Also: Profiling und Experimente mit echtem Code ( algorithm engineering) 7

Breitensuche (BFS) animiert https://www.cs.usfca.edu/~galles/visualization/bfs.html 8

Tiefensuche (DFS) animiert http://www.cs.usfca.edu/~galles/visualization/dfs.html 9

Beispielanwendung Breitensuche Problem: Ist ein (zusammenhängender) Graph bipartit? 10

Beispielanwendung Breitensuche Lösung in O(m): Knoten schwarz oder rot einfärben während der Breitensuche. 11 Procedure isbipartite(g=(v, E) : Graph, s: node) Q=[ ] : Queue set color to red Q.enqueue(s); label s as visited color s while Q is not empty do v = Q.dequeue() switch color foreach w : {v, w} E do if w not visited then Q.enqueue(w); label w as visited color w else if w has same color as v return false return true

Breitensuche in DAGs 12

Wiederholung: DAG Directed Acyclic Graph 0 13

Wiederholung: DAG Directed Acyclic Graph 0 JA (wenn gerichtet) Ein Knoten ist Wurzel und Blatt 13

Wiederholung: DAG Directed Acyclic Graph 0 13

Wiederholung: DAG Directed Acyclic Graph 0 NEIN Schleife ist auch ein Kreis! 13

Wiederholung: DAG Directed Acyclic Graph 0 1 13

Wiederholung: DAG Directed Acyclic Graph 0 1 JA Eine Wurzel, ein Blatt 13

Wiederholung: DAG Directed Acyclic Graph 0 1 13

Wiederholung: DAG Directed Acyclic Graph 0 1 JA Benennung der Knoten ist irrelevant 13

Wiederholung: DAG Directed Acyclic Graph 3 2 0 1 13

Wiederholung: DAG Directed Acyclic Graph 3 2 0 1 NEIN Kreis! 13

Wiederholung: DAG Directed Acyclic Graph 6 3 2 4 0 1 5 13

Wiederholung: DAG Directed Acyclic Graph 6 3 2 4 0 1 5 JA Sogar ein gewurzelter Baum: ein Knoten Eingangsgrad 0, alle anderen Eingangsgrad 1 13

Wiederholung: DAG Directed Acyclic Graph 6 3 2 4 0 1 5 13

Wiederholung: DAG Directed Acyclic Graph 6 3 2 4 0 1 5 JA Zwei Zusammenhangskomponenten, drei Wurzeln Jeder DAG hat mind. eine Wurzel! 13

Breitensuche.. für nicht zusammenhängende, ungerichtete Graphen Procedure dobfs(g = (V, E)) foreach v V do if v is not marked then bfs(v) 6 3 2 4 0 1 5 14

Breitensuche.. für nicht zusammenhängende, ungerichtete Graphen Procedure dobfs(g = (V, E)) foreach v V do if v is not marked then bfs(v) 6 3 2 4 0 1 5 14

Breitensuche.. für nicht zusammenhängende, ungerichtete Graphen Procedure dobfs(g = (V, E)) foreach v V do if v is not marked then bfs(v) 6 3 2 4 0 1 5 14

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Procedure dobfs(g = (V, E)) foreach v V do if v is not marked then bfs(v) 6 3 2 4 0 1 5 15

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Procedure dobfs(g = (V, E)) foreach v V do if v is not marked then bfs(v) 6 3 2 4 0 1 5 15

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Procedure dobfs(g = (V, E)) foreach v V do if v is not marked then bfs(v) 6 3 2 4 0 1 5 15

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Procedure dobfs(g = (V, E)) foreach v V do if v is not marked then bfs(v) 6 3 Reihenfolge der Knoten spielt Rolle Zwar werden alle Knoten besucht u.u. nur wenig Infos über Struktur des DAG Lösung: finde zunächst alle Wurzeln 2 4 0 1 5 15

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Function dobfs(g = (V, E)) isroot=true : Array of {0, 1} foreach (u, v) E do b[v] := False Finde zunächst alle Wurzeln (jeder DAG hat mind. eine!) 6 3 2 4 0 1 5 16

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Function dobfs(g = (V, E)) isroot=true : Array of {0, 1} foreach (u, v) E do b[v] := False Finde zunächst alle Wurzeln (jeder DAG hat mind. eine!) 6 3 2 4 0 1 5 16

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Function dobfs(g = (V, E)) isroot=true : Array of {0, 1} foreach (u, v) E do b[v] := False foreach v V, b[v] = True do bfs(v) Finde zunächst alle Wurzeln (jeder DAG hat mind. eine!) Dann: Entweder starte BFS von jeder Wurzel einzeln 6 3 2 4 0 1 5 16

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Function dobfs(g = (V, E)) isroot=true : Array of {0, 1} foreach (u, v) E do b[v] := False Q = v V, b[v] = True : 6 3 Finde zunächst alle Wurzeln (jeder DAG hat mind. eine!) Oder: Setze erstes Level := Menge d. Wurzeln Eine imaginäre Wurzel zu allen echten Wurzeln 2 4 0 1 5 16

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Function dobfs(g = (V, E)) isroot=true : Array of {0, 1} foreach (u, v) E do b[v] := False Q = v V, b[v] = True : 6 3 Finde zunächst alle Wurzeln (jeder DAG hat mind. eine!) Oder: Setze erstes Level := Menge d. Wurzeln Eine imaginäre Wurzel zu allen echten Wurzeln 2 4 0 1 5 16

Breitensuche.. für nicht zusammenhängende, gerichtete Graphen Function dobfs(g = (V, E)) isroot=true : Array of {0, 1} foreach (u, v) E do b[v] := False Q = v V, b[v] = True : 6 3 Finde zunächst alle Wurzeln (jeder DAG hat mind. eine!) Oder: Setze erstes Level := Menge d. Wurzeln Eine imaginäre Wurzel zu allen echten Wurzeln 2 4 0 1 5 16