Graphenalgorithmen I Vortrag im Seminar Hallo Welt! für Fortgeschrittene 7. Juni 211 Graphenalgorithmen I 1/33
Motivation Problem Wie komme ich am schnellsten ins Kanapee? Problem Wie kommt ein Datenpaket im Internet am schnellsten von A nach B? Herangehensweise Verkehrs- bzw. Computernetz als Graph darstellen, kürzesten Weg suchen Graphenalgorithmen I 2/33
Motivation Problem Wie komme ich am schnellsten ins Kanapee? Problem Wie kommt ein Datenpaket im Internet am schnellsten von A nach B? Herangehensweise Verkehrs- bzw. Computernetz als Graph darstellen, kürzesten Weg suchen Graphenalgorithmen I 2/33
Motivation Problem Wie komme ich am schnellsten ins Kanapee? Problem Wie kommt ein Datenpaket im Internet am schnellsten von A nach B? Herangehensweise Verkehrs- bzw. Computernetz als Graph darstellen, kürzesten Weg suchen Graphenalgorithmen I 2/33
Gliederung 1 Motivation 2 Grundlagen Definitionen & Begriffe Klassifizierung 3 Datenstrukturen Adjazenzliste Adjazenzmatrix 4 Algorithmen Traversierung Topologische Sortierung 5 Zusammenhangskomponenten Zusammenhang Brücken & Artikulationspunkte 6 Abschluss Zusammenfassung Ende Graphenalgorithmen I 3/33
Gliederung 1 Motivation 2 Grundlagen Definitionen & Begriffe Klassifizierung 3 Datenstrukturen Adjazenzliste Adjazenzmatrix 4 Algorithmen Traversierung Topologische Sortierung 5 Zusammenhangskomponenten Zusammenhang Brücken & Artikulationspunkte 6 Abschluss Zusammenfassung Ende Graphenalgorithmen I 4/33
Graphen Definition Ein Graph G ist ein 2-Tupel (V, E) mit V Menge der Knoten (en. vertex, pl. vertices) E Menge der Kanten (en. edge, pl. edges) Beispiel 2 C B 2 4 A V = {A, B, C} E = { (A, B, 4), (A, C, 2), (C, B, 2) } Graphenalgorithmen I 5/33
Graphen Definition Ein Graph G ist ein 2-Tupel (V, E) mit V Menge der Knoten (en. vertex, pl. vertices) E Menge der Kanten (en. edge, pl. edges) Beispiel 2 C B 2 4 A V = {A, B, C} E = { (A, B, 4), (A, C, 2), (C, B, 2) } Graphenalgorithmen I 5/33
Kanten Kanten Kanten gibt es in verschiedenen Ausführungen: gerichtet und ungerichtet mit und ohne Gewicht/Kosten Beispiel C A ungerichtet ohne Gewicht: V = {A, B, C} E = { {A, B}, {A, C}, {B, C} } B Graphenalgorithmen I 6/33
Kanten Kanten Kanten gibt es in verschiedenen Ausführungen: gerichtet und ungerichtet mit und ohne Gewicht/Kosten Beispiel C A ungerichtet ohne Gewicht: V = {A, B, C} E = { {A, B}, {A, C}, {B, C} } B Graphenalgorithmen I 6/33
Kanten Kanten Kanten gibt es in verschiedenen Ausführungen: gerichtet und ungerichtet mit und ohne Gewicht/Kosten Beispiel C 2 B 2 4 A ungerichtet mit Gewicht: V = {A, B, C} { ({A, ) ( ) ( ) } E = B}, 4, {A, C}, 2, {B, C}, 2 Graphenalgorithmen I 6/33
Knoten Der Grad eines Knotens 2 4 4 Grad eines Knotens = Anzahl der Kanten an diesem Knoten 3 3 Graphenalgorithmen I 7/33
dünn und dicht besetzte Graphen E V 2 dünn besetzt E V 2 dicht besetzt Graphenalgorithmen I 8/33
Zyklen in Graphen azyklisch zyklisch Graphenalgorithmen I 9/33
Zyklen in Graphen azyklisch zyklisch Graphenalgorithmen I 9/33
Gliederung 1 Motivation 2 Grundlagen Definitionen & Begriffe Klassifizierung 3 Datenstrukturen Adjazenzliste Adjazenzmatrix 4 Algorithmen Traversierung Topologische Sortierung 5 Zusammenhangskomponenten Zusammenhang Brücken & Artikulationspunkte 6 Abschluss Zusammenfassung Ende Graphenalgorithmen I 1/33
Adjazenzliste Adjazenzliste Jedem Knoten wird eine Liste von ausgehenden Kanten zugeordnet Speicherung in Art ungewichtet gewichtet Datenstruktur List<V>[] mit V als Index List<tuple<V, Weight>>[] mit V als Index Speicherbedarf O ( E + V ) v.a. bei dünn besetzten Graphen effizient Suchen von eingehenden Kanten nicht a möglich a oder nur schlecht Graphenalgorithmen I 11/33
Adjazenzliste Adjazenzliste Jedem Knoten wird eine Liste von ausgehenden Kanten zugeordnet Speicherung in Art ungewichtet gewichtet Datenstruktur List<V>[] mit V als Index List<tuple<V, Weight>>[] mit V als Index Speicherbedarf O ( E + V ) v.a. bei dünn besetzten Graphen effizient Suchen von eingehenden Kanten nicht a möglich a oder nur schlecht Graphenalgorithmen I 11/33
Adjazenzliste Beispiel Beispiel 2 C B 2 4 A Knoten Kanten A (B, 4), (C, 2) B (A, 4), (C, 2) C (A, 2), (B, 2) Graphenalgorithmen I 12/33
Adjazenzmatrix Adjazenzmatrix V V -Matrix; a ij ist falls (i, j) V (d.h. die Kante von i nach j existiert): das Gewicht der Kante in gewichteten Graphen 1 in ungewichteten Graphen ein ungültiger Wert, falls die Kante nicht existiert (z.b. ) für ungerichtete Graphen nur Dreiecksmatrix nötig Prüfen der Existenz einer Kante: O (1) ( Speicherbedarf O V 2), unabhängig von E Graphenalgorithmen I 13/33
Adjazenzmatrix Adjazenzmatrix V V -Matrix; a ij ist falls (i, j) V (d.h. die Kante von i nach j existiert): das Gewicht der Kante in gewichteten Graphen 1 in ungewichteten Graphen ein ungültiger Wert, falls die Kante nicht existiert (z.b. ) für ungerichtete Graphen nur Dreiecksmatrix nötig Prüfen der Existenz einer Kante: O (1) ( Speicherbedarf O V 2), unabhängig von E Graphenalgorithmen I 13/33
Adjazenzmatrix Beispiel Beispiel 2 C B 2 4 A A B C A 4 2 B 2 C Graphenalgorithmen I 14/33
Gliederung 1 Motivation 2 Grundlagen Definitionen & Begriffe Klassifizierung 3 Datenstrukturen Adjazenzliste Adjazenzmatrix 4 Algorithmen Traversierung Topologische Sortierung 5 Zusammenhangskomponenten Zusammenhang Brücken & Artikulationspunkte 6 Abschluss Zusammenfassung Ende Graphenalgorithmen I 15/33
Tiefensuche Tiefensuche Durchsuchen eines Graphen z.b. zum Finden von Zyklen O ( V + E ) begin DFS start, ziel if start = ziel then return true; if start als besucht markiert then return false; start als besucht markieren; foreach n: start.children do if DFS(n, ziel) then return true; end return false end Graphenalgorithmen I 16/33
Tiefensuche Tiefensuche Durchsuchen eines Graphen z.b. zum Finden von Zyklen O ( V + E ) begin DFS start, ziel if start = ziel then return true; if start als besucht markiert then return false; start als besucht markieren; foreach n: start.children do if DFS(n, ziel) then return true; end return false end Graphenalgorithmen I 16/33
Iterative Tiefensuche 1 p u b l i c c l a s s DFSIter { 2 p u b l i c s t a t i c boolean d f s ( L i s t <Vertex > v e r t i c e s, L i s t < Edge> edges, V e r t e x s t a r t, V e r t e x end ) { 3 Stack<Vertex > l i s t = new Stack<Vertex >() ; 4 TreeSet<Vertex > v i s i t e d = new TreeSet<Vertex >() ; 5 6 l i s t. push ( s t a r t ) ; 7 w h i l e ( l i s t. s i z e ( ) > ) { 8 V e r t e x v = l i s t. pop ( ) ; 9 1 i f ( v i s i t e d. c o n t a i n s ( v ) ) c o n t i n u e ; 11 v i s i t e d. add ( v ) ; 12 13 i f ( s t a r t == end ) r e t u r n t r u e ; 14 f o r ( V e r t e x c : v. c h i l d r e n ) 15 i f (! v i s i t e d. c o n t a i n s ( c ) ) 16 l i s t. push ( c ) ; 17 } 18 r e t u r n f a l s e ; 19 } 2 } Graphenalgorithmen I 17/33
Breitensuche 1 p u b l i c c l a s s BFS { 2 p u b l i c s t a t i c boolean b f s ( L i s t <Vertex > v e r t i c e s, L i s t < Edge> edges, V e r t e x s t a r t, V e r t e x end ) { 3 Queue<Vertex > l i s t = new Queue<Vertex >() ; 4 TreeSet<Vertex > v i s i t e d = new TreeSet<Vertex >() ; 5 6 l i s t. add ( s t a r t ) ; 7 w h i l e ( l i s t. s i z e ( ) > ) { 8 V e r t e x v = l i s t. remove ( ) ; 9 1 i f ( v i s i t e d. c o n t a i n s ( v ) ) c o n t i n u e ; 11 v i s i t e d. add ( v ) ; 12 13 i f ( s t a r t == end ) r e t u r n t r u e ; 14 f o r ( V e r t e x c : v. c h i l d r e n ) 15 i f (! v i s i t e d. c o n t a i n s ( c ) ) 16 l i s t. add ( c ) ; 17 } 18 r e t u r n f a l s e ; 19 } 2 } Graphenalgorithmen I 18/33
Topologische Sortierung Topsort Arbeitet auf gerichteten, azyklischen Graphen (sog. DAGs) Interpretiert Kanten als Abhängigkeiten und sortiert die Knoten so in eine Liste, dass die Abhängigkeiten erfüllt sind Es kann mehrere solche topologische Sortierungen geben Algorithmus: 1. Suche Knoten ohne Eingangskante 2. Markiere und entferne Knoten 3. Wiederhole, bis Graph leer Aufwand analog zu Tiefensuche Graphenalgorithmen I 19/33
Jacke Hose Schuhe Hemd Shorts Socken Graphenalgorithmen I 2/33
Jacke Hose Schuhe Hemd Socken Shorts Graphenalgorithmen I 2/33
Jacke Hose Schuhe Hemd Shorts Socken Graphenalgorithmen I 2/33
Jacke Hose Schuhe Shorts Socken Hemd Graphenalgorithmen I 2/33
Jacke Schuhe Shorts Socken Hemd Hose Graphenalgorithmen I 2/33
Jacke Shorts Socken Hemd Hose Schuhe Graphenalgorithmen I 2/33
Shorts Socken Hemd Hose Schuhe Jacke Graphenalgorithmen I 2/33
Shorts Socken Hemd Hose Schuhe Jacke Graphenalgorithmen I 2/33
Gliederung 1 Motivation 2 Grundlagen Definitionen & Begriffe Klassifizierung 3 Datenstrukturen Adjazenzliste Adjazenzmatrix 4 Algorithmen Traversierung Topologische Sortierung 5 Zusammenhangskomponenten Zusammenhang Brücken & Artikulationspunkte 6 Abschluss Zusammenfassung Ende Graphenalgorithmen I 21/33
Zusammenhang E E B D B D A C A C zusammenhängend nicht zusammenhängend Graphenalgorithmen I 22/33
Zusammenhang E E B D B D A C A C stark zusammenhängend schwach zusammenhängend Graphenalgorithmen I 23/33
Finden von Zusammenhangskomponenten in ungerichteten Graphen mittels Tiefensuche Färben des Graphen begin FindComponents c := ; visited[] := false; component[] := -1; foreach n: nodes do if! visited[n] then DFS(n, c); increment c; end end end Input: node n, component number c begin DFS n, c if! visited[n] then visited[n] := true; component[n] := c; foreach child: n.children do DFS(child, c) end end end Graphenalgorithmen I 24/33
Finden von Zusammenhangskomponenten in ungerichteten Graphen mittels Tiefensuche Färben des Graphen begin FindComponents c := ; visited[] := false; component[] := -1; foreach n: nodes do if! visited[n] then DFS(n, c); increment c; end end end Input: node n, component number c begin DFS n, c if! visited[n] then visited[n] := true; component[n] := c; foreach child: n.children do DFS(child, c) end end end Graphenalgorithmen I 24/33
Finden von Zusammenhangskomponenten in ungerichteten Graphen mittels Tiefensuche Färben des Graphen begin FindComponents c := ; visited[] := false; component[] := -1; foreach n: nodes do if! visited[n] then DFS(n, c); increment c; end end end Input: node n, component number c begin DFS n, c if! visited[n] then visited[n] := true; component[n] := c; foreach child: n.children do DFS(child, c) end end end Graphenalgorithmen I 24/33
Finden von Zusammenhangskomponenten in gerichteten Graphen mit dem Algorithmus von Kosaraju 1. Alle Knoten durch Tiefensuche nummerieren und bei der Rückkehr aus der Rekursion auf einen Stack legen 2. transponierten Graphen G T = ( V, E T ) erzeugen E T = { (v, u) (u, v) E } 3. Graph analog zur Suche bei ungerichteten Graphen durch Tiefensuche in Reihenfolge des Stacks färben Ein Knoten kann nicht in zwei Zusammenhangskomponenten sein! Graphenalgorithmen I 25/33
F E C D A B Graphenalgorithmen I 26/33
F E C D B Graphenalgorithmen I 26/33
F E 1 D B Graphenalgorithmen I 26/33
F E 1 2 B Graphenalgorithmen I 26/33
F 3 1 2 B Graphenalgorithmen I 26/33
4 3 1 2 B Graphenalgorithmen I 26/33
4F 3 1 2 F B Graphenalgorithmen I 26/33
F E3 1 2 E F B Graphenalgorithmen I 26/33
F E D 1 D2 E F B Graphenalgorithmen I 26/33
F E C D C1 D E F B Graphenalgorithmen I 26/33
A F E C D C D E F A B Graphenalgorithmen I 26/33
A F E C D C D E F A 5 Graphenalgorithmen I 26/33
B A F E C D C D E F A B Graphenalgorithmen I 26/33
B A F E C D C D E F A B Graphenalgorithmen I 26/33
B A F E C D C D E F A B Graphenalgorithmen I 26/33
B A F E C D C D E F A B Graphenalgorithmen I 26/33
B A F E C D C D E F A B Graphenalgorithmen I 26/33
B A F E C D C D E F A B Graphenalgorithmen I 26/33
B A F E C D C D E F A B Graphenalgorithmen I 26/33
B A F E C D C D E F A B Graphenalgorithmen I 26/33
Brücken Brücken Kante, durch deren Entfernung der Graph in zwei Zusammenhangskomponenten zerfallen würde Finden durch Tiefensuche 1. Beim Abstieg: Jedem Knoten Nummer zuweisen 2. Bei der Rückkehr: Jeder Kante Nummer des kleinsten über sie erreichbaren Knotens zuweisen Brücken sind diejenigen Kanten, deren kleinste über sie erreichbare Knotennummer größer als die Nummer des Knotens, von dem aus sie traversiert worden sind, ist Graphenalgorithmen I 27/33
F E C D A B Graphenalgorithmen I 28/33
F E C D B Graphenalgorithmen I 28/33
F E 1 D B Graphenalgorithmen I 28/33
F E 1 D 2 Graphenalgorithmen I 28/33
F E 1 D 2 Graphenalgorithmen I 28/33
F E 1 3 2 Graphenalgorithmen I 28/33
F 4 1 3 2 Graphenalgorithmen I 28/33
5 4 1 3 2 Graphenalgorithmen I 28/33
5 4 3 1 3 2 Graphenalgorithmen I 28/33
3 5 4 3 1 3 2 Graphenalgorithmen I 28/33
3 5 4 3 3 1 3 2 Graphenalgorithmen I 28/33
3 5 4 3 3 1 3 3 2 Graphenalgorithmen I 28/33
3 5 4 3 3 1 3 3 2 Graphenalgorithmen I 28/33
3 5 4 3 3 1 3 3 2 Graphenalgorithmen I 28/33
Artikulationspunkte Artikulationspunkt Knoten, durch dessen Entfernung der Graph in zwei oder mehr Zusammenhangskomponenten zerfallen würde Finden analog zu Brücken durch Tiefensuche Artikulationspunkte sind a diejenigen Knoten, deren kleinste über eine ihrer ausgehenden Kanten erreichbare Knotennummer größer oder gleich ihrer Knotennummer ist Der Startknoten ist Artikulationspunkt, falls zwei oder mehr Kanten davon ausgehen a mit Ausnahme des Startknotens Graphenalgorithmen I 29/33
3 5 4 3 3 1 3 3 2 Graphenalgorithmen I 3/33
3 5 4 3 3 1 3 3 2 Graphenalgorithmen I 3/33
3 5 4 3 3 1 3 3 2 Graphenalgorithmen I 3/33
Gliederung 1 Motivation 2 Grundlagen Definitionen & Begriffe Klassifizierung 3 Datenstrukturen Adjazenzliste Adjazenzmatrix 4 Algorithmen Traversierung Topologische Sortierung 5 Zusammenhangskomponenten Zusammenhang Brücken & Artikulationspunkte 6 Abschluss Zusammenfassung Ende Graphenalgorithmen I 31/33
Zusammenfassung Speicherung Adjazenzliste, Adjazenzmatrix Traversierung & Sortierung Tiefen- und Breitensuche, Topologische Sortierung Zusammenhangskomponenten Finden mit Tiefensuche und Kosaraju, Brücken, Artikulationspunkte Graphenalgorithmen I 32/33
Zusammenfassung Speicherung Adjazenzliste, Adjazenzmatrix Traversierung & Sortierung Tiefen- und Breitensuche, Topologische Sortierung Zusammenhangskomponenten Finden mit Tiefensuche und Kosaraju, Brücken, Artikulationspunkte Graphenalgorithmen I 32/33
Zusammenfassung Speicherung Adjazenzliste, Adjazenzmatrix Traversierung & Sortierung Tiefen- und Breitensuche, Topologische Sortierung Zusammenhangskomponenten Finden mit Tiefensuche und Kosaraju, Brücken, Artikulationspunkte Graphenalgorithmen I 32/33
Q&A Danke für die Aufmerksamkeit Questions & Answers Graphenalgorithmen I 33/33