8. Übung zu Algorithmen I 15. Juni 2016 Lisa Kohl Lisa.Kohl@kit.edu (mit Folien von Julian Arz, Timo Bingmann, Sebastian Schlag, Christian Staudt und Christoph Striecks)
Nachtrag: Quicksort, alternative Partitionierung Function dpartition(a : Array of Element, l, r, k : N) : N p:= a[k], i:= l, j:= r swap(a[k], a[i]) while i j do if i < j then assert t < i : a[t] p t > j : a[t] > p while a[j] > p and i j do j if i j then swap(a[i], a[j]), swap(i, j), j + + else assert t < j : a[t] p t > i : a[t] > p while a[j] p and i j do j + + if i j then swap(a[i], a[j]), swap(i, j), j return i
Grundlagen der Graphentheorie
Graphen und Relationen Relation: M Menge, R M M Relation Schreibweise: x R y, falls (x, y) R Eigenschaften: reflexiv, symmetrisch, transitiv,... Gerichteter/Ungerichteter Graph: V Knoten E V V /E {{x, y} x, y V x y} Kanten G = (V, E) gerichteter/ungerichteter Graph
Teilbarkeitsgraph V = {1,..., 9} E = {(x, y) x, y V, x y und x y} 9 1 2 8 3 7 4 6 5
Der Hyperwürfel Q 3 V = {{0, 1} 3 } E = {{x, y} x, y V und x y {100, 010, 001}} 011 111 010 110 001 101 000 100 {x, y} E genau eine Ziffer von x und y verschieden
Knotengrad Knotengrad gerichtete Graphen Ausgangsgrad deg + (x) = {y V (x, y) E} Eingangsgrad deg (x) = {y V (y, x) E} Knotengrad ungerichtete Graphen Knotengrad deg(x) = {y V {x, y} E}
Handshaking Lemma Lemma: Ist G = (V, E) ein ungerichteter Graph, dann gilt deg(x) = 2 E. x V Beweis: betrachte M x = {(x, e) e E mit x e} 1. es gilt deg(x) = M x 2. es gilt M x M y = für x y 3. es gilt M x = 2 E x V deg(x) = 1. M x = 2. x V x V x V M x 3. = 2 E.
Handshaking Lemma Lemma: Ist G = (V, E) ein ungerichteter Graph, dann gilt deg(x) = 2 E. x V Beweis: betrachte M x = {(x, e) e E mit x e} 1. es gilt deg(x) = M x 2. es gilt M x M y = für x y 3. es gilt M x = 2 E x V deg(x) = 1. M x = 2. x V x V x V M x 3. = 2 E. Korollar: In jedem Graph gibt es eine gerade Anzahl von Knoten mit ungeradem Knotengrad.
Adjazenz- und Inzidenzmatrix G = (V, E) gerichteter Graph Adjazenzmatrix A {0, 1} V V mit a i,j = 1 (i, j) E Inzidenzmatrix 1 falls y V : j = (i, y) B {0, 1} V E mit b i,j = 1 falls x V : j = (x, i) 0 sonst
Beispiel Adjazenz- und Inzidenzmatrix 1 1 2 2 4 3 3 6 4 5 7 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 A = 0 1 0 1 0 1 0 0 0 0 B = 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 0 1 0 1 5
Beispiel Adjazenz- und Inzidenzmatrix 6 1 1 2 2 4 3 4 5 7 3 5 3 2 0 1 0 2 3 1 0 0 B B T = 0 1 3 1 1 1 0 1 3 1 0 0 1 1 2 B B T (i, j) = { deg + (i) + deg (i) {e E e = (i, j) e = (j, i)} falls i = j sonst
Graphen als Matrizen ungerichteter Graph symmetrische Adjazenzmatrix A = A T 3 1 2 0 1 0 1 A = 1 0 1 0 0 1 0 0 1 0 0 0 4
Wiederholung: DAG Directed Acyclic Graph G = (V, E) DAG G gerichtet und G enthält keine Zyklen 0 NEIN Schleife ist auch ein Kreis!
Wiederholung: DAG Directed Acyclic Graph G = (V, E) DAG G gerichtet und G enthält keine Zyklen 0 1 JA eine Wurzel, ein Blatt
Wiederholung: DAG Directed Acyclic Graph G = (V, E) DAG G gerichtet und G enthält keine Zyklen 3 2 0 1 NEIN Kreis!
Wiederholung: DAG Directed Acyclic Graph G = (V, E) DAG G gerichtet und G enthält keine Zyklen 6 3 2 4 0 1 5 JA sogar ein gewurzelter Baum: Knoten 4 Eingangsgrad 0, sonst Eingangsgrad 1
Wiederholung: DAG Directed Acyclic Graph G = (V, E) DAG G gerichtet und G enthält keine Zyklen 6 3 2 4 0 1 5 JA zwei Zusammenhangskomponenten, drei Wurzeln jeder DAG hat eine Wurzel!
Graphen als Matrizen G = (V, E) DAG G gerichtet und G enthält keine Zyklen DAGs lassen sich als obere Dreiecksmatrix repräsentieren 4 0 0 0 0 0 0 0 0 0 0 A = 1 1 0 0 0 0 0 1 0 1 3 5 1 1 0 0 0 1 2
Graphen als Matrizen G = (V, E) DAG G gerichtet und G enthält keine Zyklen DAGs lassen sich als obere Dreiecksmatrix repräsentieren 1 0 0 0 0 0 0 0 0 0 0 A = 1 1 0 0 0 0 0 1 0 1 2 3 1 1 0 0 0 0 1 1 0 0 0 0 0 1 1 4 5 A = 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
Graphen als Matrizen pro Zusammenhangskomponente ein Block in der Matrix 0 0 0 0 0 1 0 0 0 0 1 0 A = 0 1 0 0 0 0 0 0 1 0 0 0 4 5 1 0 0 0 1 0 0 1 0 0 0 0 0 3 2 6
Graphen als Matrizen pro Zusammenhangskomponente ein Block in der Matrix 0 0 0 0 0 1 0 0 0 0 1 0 A = 0 1 0 0 0 0 0 0 1 0 0 0 4 1 5 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 3 2 6 A = 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0
Wege, Kreise und Zusammenhang G = (V, E) ungerichter Graph (v 0,..., v n ) Pfad {v i 1, v i } E für alle i {1,... n} x, y V verbindbar es existiert ein Pfad (x,..., y) G zusammenhängend alle x, y V verbindbar Pfad (v 0,..., v n ) Zyklus/Kreis v 0 = v n
Eulersche und Hamiltonsche Kreise Ein Zyklus heißt Eulersch, wenn er alle Kanten des Graphen genau einmal enthält. Ein Zyklus heißt Hamiltonsch, wenn er alle Knoten des Graphen genau einmal enthält (Beginn und Ende einmal gezählt). Ein Graph heißt Eulersch/Hamiltonsch, wenn er einen Eulerschen/Hamiltonschen Kreis enthält.
Eulersche und Hamiltonsche Kreise Ein Zyklus heißt Eulersch, wenn er alle Kanten des Graphen genau einmal enthält. Ein Zyklus heißt Hamiltonsch, wenn er alle Knoten des Graphen genau einmal enthält (Beginn und Ende einmal gezählt). Ein Graph heißt Eulersch/Hamiltonsch, wenn er einen Eulerschen/Hamiltonschen Kreis enthält.
Eulersche Kreise - Anwendungsbeispiel Gibt es einen Weg, der jede Brücke genau einmal verwendet?
Satz von Euler (Graphen) Satz: Ein ungerichteter Graph G = (V, E) mit E ist genau dann Eulersch, wenn G zusammenhängend ist und alle Knoten geraden Knotengrad haben.
Satz von Euler (Graphen) Satz: Ein ungerichteter Graph G = (V, E) mit E ist genau dann Eulersch, wenn G zusammenhängend ist und alle Knoten geraden Knotengrad haben. Beweis: = G offensichtlich zusammenhängend
Satz von Euler (Graphen) Satz: Ein ungerichteter Graph G = (V, E) mit E ist genau dann Eulersch, wenn G zusammenhängend ist und alle Knoten geraden Knotengrad haben. Beweis: = G offensichtlich zusammenhängend Pfad muss jeden Knoten durch eine Kante betreten und durch andere Kante verlassen
Satz von Euler (Graphen) Satz: Ein ungerichteter Graph G = (V, E) mit E ist genau dann Eulersch, wenn G zusammenhängend ist und alle Knoten geraden Knotengrad haben. Beweis: = G offensichtlich zusammenhängend Pfad muss jeden Knoten durch eine Kante betreten und durch andere Kante verlassen jede Kante genau einmal verwendet Knotengrad gerade
Satz von Euler (Graphen) Satz: Ein ungerichteter Graph G = (V, E) mit E ist genau dann Eulersch, wenn G zusammenhängend ist und alle Knoten geraden Knotengrad haben. Beweis: = betrachte Pfad P = (v 0,..., v r ) maximaler Länge mit {v i 1, v i } {v j 1, v j } für alle i j {1,... n} (keine Kante zweifach) Behauptung 1: P ist ein Zyklus Annahme: v 0 v r {{v 0, v} v V, {v 0, v} Teil von P} ungerade es existiert e E mit e nicht Teil von P P kann mit e verlängert werden v 0 = v r
Satz von Euler (Graphen) Satz: Ein ungerichteter Graph G = (V, E) mit E ist genau dann Eulersch, wenn G zusammenhängend ist und alle Knoten geraden Knotengrad haben. Beweis: = betrachte Pfad P = (v 0,..., v r ) maximaler Länge mit (v i 1, v i ) (v j 1, v j ) für alle i j {1,... n} (keine Kante zweifach) Behauptung 2: P enthält alle Kanten aus E Annahme: E := {e E e nicht auf P} G := (V, E ) G zusammenhängend v V auf P mit deg G (v) > 0 alle Knoten in G haben geraden Knotengrad existiert Zyklus in G der v enthält (wie Behauptung 1) P kann um den Zyklus verlängert werden P ist Eulersch
Eulersche Kreise - Anwendungsbeispiel Gibt es einen Weg, der jede Brücke genau einmal verwendet? Nein!
Breitensuche 6 3 2 4 0 1 5 www.cs.usfca.edu/~galles/visualization/bfs.html
Breitensuche 6 3 2 4 0 1 5 www.cs.usfca.edu/~galles/visualization/bfs.html
Beispielanwendung Breitensuche Problem: Ist ein (zusammenhängender) Graph bipartit? Lösung in O( E ): Knoten schwarz oder rot einfärben während der Breitensuche
Beispielanwendung Breitensuche 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