Datenstrukturen & Algorithmen Matthias Zwicker Universität Bern Frühling 2010 Übersicht Graphenalgorithmen • Begriffe & Darstellung von Graphen • Breitensuche & Tiefensuche • Topologisches Sortieren • Starke Zusammenhangskomponenten 2 Darstellung von Graphen • Graph G=(V,E) – Menge von Knoten V g von Kanten E – Menge • Anzahl Knoten |V| • Anzahl Kanten |E| • Laufzeit La f eit ausgedrückt a sgedrückt in |V| und nd |E| – Vereinfachte Notation, Beispiel O(V O(V+E) E) 3 Darstellung von Graphen Begriffe • Ungerichtete Graphen: Kanten haben keine Orientierung • Gerichtete Graphen: Kanten haben je eine von zwei möglichen Orientierungen • Gewichtete Graphen: Jede Kante hat reelle Zahl als Gewicht • Grad eines Knoten – Anzahl Kanten, die diesen Knoten enthalten – Gerichtete Graphen: p Unterscheiden Eingangsgrad g g g und Ausgangsgrad 4 Darstellung von Graphen • Knoten V={a,b,c,d} • Kanten – Ungerichtet: beide Richtungen der Kante implizit mitgemeint E E={(a {(a,b), b) (a (a,c),(b,c),(c,d)} c) (b c) (c d)} – Gerichtet E={(a,b), (b,a),(a,c),(b,c),(c,d)} 5 Darstellung von Graphen • Knoten V={a,b,c,d} • Kanten – Ungerichtet: beide Richtungen der Kante implizit mitgemeint E E={(a {(a,b), b) (a (a,c),(b,c),(c,d)} c) (b c) (c d)} – Gerichtet E={(a,b), (b,a),(a,c),(b,c),(c,d)} b a b a d c ungerichtet d c gerichtet 6 Darstellung von Graphen Begriffe • Pfad: Sequenz q von Knoten die über Kanten entsprechender Richtung verbunden sind • Erreichbar: Knoten ist von einem anderen erreichbar, wenn es einen i Pf Pfad d gibt, ibt der d b beide id K Knoten t verbindet bi d t • Zyklus: Pfad, der als ersten und letzten Knoten denselben Knoten enthält • Zusammenhangskomponenten: Äquivalenzklassen der Knoten bezüglich der Relation „erreichbar von“ von • Starke Zusammenhangskomponenten: Äquivalenzklassen q der Knoten in g gerichteten Graphen p bezüglich der Relation „gegenseitig erreichbar von“ 7 Darstellung von Graphen Adjazenzlisten • Feld F ld Adj der d G Grösse ö |V| von Listen Li t – Eine Liste p pro Knoten • Liste von Knoten u enthält alle Knoten v so dass (u, (u v) ∈ E • Funktioniert für gerichtete und ungerichtete Graphen • Speicher: O(V+E) • Zeit um zu bestimmen ob ((u,, v)) ∈ E : O(Grad(u)) 8 Darstellung von Graphen Adjazenzmatrix • Matrix A der Grösse |V| x |V| • Elemente • Speicher: O(V 2) • Zeit um zu bestimmen ob (u, v) ∈ E : k t t konstant • Gewichtete Graphen: Gewichte direkt in Matrix speichern 9 Darstellung von Graphen 10 Darstellung von Graphen • Adjazenzlisten vorteilhaft für dünn besetzte Graphen – |E| viel kleiner als |V 2| • Adjazenzmatrix vorteilhaft für dichte Graphen – Jeder Knoten mit fast jedem verbunden – |E| nahe an |V 2| • Adjazenzmatrix symmetrisch für ungerichtete Graphen – aij=aji, müssen nur obere oder untere Hälfte der Matrix speichern 11 Übersicht Graphenalgorithmen • Begriffe & Darstellung von Graphen • Breitensuche & Tiefensuche • Topologisches Sortieren • Starke Zusammenhangskomponenten 12 Breitensuche • Findet alle Knoten, die von einem Startknoten aus erreichbar (durch eine Serie von Kanten verbunden) sind • Berechnet zusätzlich Abstand (kleinste Anzahl Kanten), Kanten) um jeden Knoten zu erreichen – Knoten werden in ansteigendem Abstand g gefunden • (Einige Details aus Buch weggelassen hier) 13 Breitensuche • Eingabe: Graph G=(V,E), gerichtet oder ungerichtet, Startknoten s • Ausgabe: d[v] = Distanz von s nach v, für alle v • Idee: Sende Welle ausgehen von s – Trifft zuerst alle Knoten erreichbar über eine Kante von s – Von da aus alle Knoten erreichbar über zwei Kanten von s – Etc. • Wellenfront in FIFO O Warteschlange g Q verwaltet – Knoten v in Q falls Welle v erreicht hat, aber noch nicht von v weitergeleitet wurde 14 Breitensuche 15 Breitensuche 16 Breitensuche FIFO Warteschlange: s,a,c,e,g,b,h,f,i 17 Breitensuche • Zeitkomplexität O(V+E) – O(V) weil il jeder j d Knoten K t höchstens hö h t einmal i l iin FIFO eingetragen wird – O(E) weil il jeder j d Knoten K höchstens hö h einmal i l aus FIFO genommen wird, und Kanten nur untersucht werden wenn Knoten aus Queue genommen wird => jede Kante wird einmal (gerichtet) oder zweimal (ungerichtet) untersucht • Anmerkung: weitere Konzepte zur B it Breitensuche h (V (Vorgängerteilgraph, ä t il h Breitensuchbaum) aus Buch gehören auch zum Prüfungsstoff 18 Tiefensuche • Suche geht „tiefer“ in Graphen wenn immer möglich – Untersuche die Kanten als nächstes, die vom zuletzt entdeckten Knoten ausgehen, der noch ungeprüfte Kanten hat • Gefundene Knoten werden mit Zeitstempel versehen – Zeit, wann zuerst gefunden – Zeit, wann letzte Kante geprüft 19 Tiefensuche • Eingabe: Graph G=(V, E), gerichtet oder ungerichtet, kein Startknoten • Ausgabe: Zeitstempel für jeden Knoten v – Entdeckunszeit d[v] – Prüfung aller Kanten beendet f[v] • Suchstrategie: sobald Knoten entdeckt, entdeckt folge seinen Kanten • Farben zeigen Zustand des Knotens – white = noch nicht entdeckt – gray = entdeckt, aber noch nicht fertig (hat Kanten, die noch nicht verfolgt wurden) – black = fertig (alle Kanten verfolgt) 20 Tiefensuche 21 Tiefensuche 22 Tiefensuche 23 Tiefensuche • Zeitkomplexität – Analyse ähnlich wie Breitensuche – Θ(V ( + E)) , weil jjeder Knoten ( + E)) statt O(V und jede Kante besucht werden • Tiefensuche führt zu Tiefensuchwald – Besteht aus mehreren Tiefensuchbäumen – Bäume besten aus Kanten (u,v), wo gilt u=gray und v=white,, als ((u,v)) g gefunden wurde – Details im Buch 24 Eigenschaften der Tiefensuche • Klammerungstheorem – Intervalle [d[u],f[u]] und [d[v],f[v]] sind paarweise disjunkt – Intervall [d[u],f[u]] ist vollständig in [d[v],f[v]] enthalten – Intervall [d[v],f[v]] ist vollständig in [d[u],f[u]] enthalten • Wie Klammern – Ok: ()[] oder ([]) oder [()] – Kommt nicht vor: ([)] oder [(]) 25 Eigenschaften der Tiefensuche • Intervalle der Nachfahren: Knoten v ist Nachfahre von u im Tiefensuchwald, Tiefensuchwald wenn d[u] < d[v] < f[v] < f[u] • Theorem der weissen Pfade: Knoten v ist Nachfahre von u im Tiefensuchwald, Tiefensuchwald wenn Knoten v zur Zeit d[u] von u aus entlang Pfad erreichbar ist ist, der n nurr weisse eisse Knoten enthält 26 Eigenschaften der Tiefensuche • Klassifikation der Kanten – Baumkanten: Kante, die im Tiefensuchwald vorkommt – Rückwärtskante: (u,v), wobei u ein Nachfolger von v im Tiefensuchbaum ist – Vorwärtskante: (u,v), wobei u ein Vorgänger von v im Tiefensuchbaum ist – Querkante: alle anderen • Th Theorem: Bei B i Tiefensuche Ti f h in i ungerichtetem Graphen ist jede Kante entweder Baumkante oder Rückwärtskante 27 Übersicht Graphenalgorithmen • Begriffe & Darstellung von Graphen • Breitensuche & Tiefensuche • Topologisches Sortieren • Starke Zusammenhangskomponenten 28 Topologisches Sortieren • Für gerichtete azyklische Graphen (directed acyclic graph graph, DAG) • Nützlich zur Darstellung g von Abläufen mit partieller Ordnung – a>b und d b>c => a>c – Aber möglich dass a und b so dass weder a>b noch b>c • Topologisches Sortieren: finde totale Ordnung gegeben partielle Ordnung 29 Topologisches Sortieren 30 Topologisches Sortieren 31 Topologisches Sortieren • Lemma: Gerichteter Graph is azyklisch genau dann wenn DFS keine Rückwärtskanten enthält • Beweis: zeige „Rückwärtskante => Zyklus“ und „Zyklus Zyklus => Rückwärtskante Rückwärtskante„ 32 Topologisches Sortieren • Topologische Sortierung eines DAG: lineare Sequenz von Knoten so dass u vor v erscheint, wenn (u, v) ∈ E • Algorithmus – R Rufe f DFS(G) auff – Füge jeden abgearbeiteten Knoten am Kopf einer verketteten Liste ein – Return die verkettete Liste 33 Übersicht Graphenalgorithmen • Begriffe & Darstellung von Graphen • Breitensuche & Tiefensuche • Topologisches Sortieren • Starke Zusammenhangskomponenten 34 Starke Zusammenhangskomponenten • Sei G=(V, E) gerichteter Graph • Starke Zusammenhangskomponente ((strongly g y connected component, p , SCC)) von G ist maximale Menge von Knoten C ⊆ V so dass für alle u, u v ∈ C sowohl u → v als auch v → u • Algorithmus braucht transponierten Graphen GT = (V, (V E T ), ) E T = {(u, {(u v)|(v, v)|(v u) ∈ E} • Beobachtung: G und GT haben dieselben SCC 35 Starke Zusammenhangskomponenten Starke Zusammenhangs Zusammenhangskomponenten Starke Zusammenhangskomponenten Starke Zusammenhangs Zusammenhangskomponenten Komponentengraph SCC Algorithmus 37 Komponentengraphen • Komponentengraph GSCC = (V SCC , E SCC ) – V SCC hat h t einen i Knoten K t fü für jjede d SCC iin G – E SCC hat eine Kante wenn es eine Kante zwischen i h entsprechenden h d SCC SCCs iin G • Lemma: GSCC ist ein DAG – D.h. seien C und C´ verschiedene SCCs in G, sei u v in C, u,v C u u´, vv´ in C C´, und sei Pfad u -> > uu´ in G – Dann kann Pfad v´ -> v nicht in G sein •B Beweis: i Widerspruch, Wid h ffalls ll v´´ -> > v existieren i ti würde, wären C und C´ dieselbe Zusammenhangskomponente h k 38 Starke Zusammenhangskomponenten Algorithmus 1. Berechne DFS(G) und Endzeiten f[u] 2 Berechne transponierten Graphen GT 2. 3. Berechne DFS(GT), wobei in der DFS Hauptschleife Knoten in der Reihenfolge fallender f[u] (wie in Zeile 1 berechnet) betrachtet werden 4. Gib Knoten jedes Tiefensuchbaumes aus Schritt 3 als eine separate SCC aus 39 Starke Zusammenhangskomponenten • Idee: Knoten in zweiter DFS auf transponiertem Graphen in fallender Reihenfolge nach Endzeiten von ersten DFS => Knoten K t d des Komponentengraphen K t h werden topologisch sortiert besucht • Notation – d[u] und f[u] beziehen sich auf Resultat der ersten DFS – d(U) früheste Startzeit aller Knoten in U – f(U) späteste Endzeit aller Knoten in U 40 Starke Zusammenhangskomponenten • Lemma: Seien C und C´ verschiedene SCCs in G G=(V, (V, E). Sei Kante (u, v) in E so dass u in C und v in C´. Dann f(C) > f(C´) • Korollar: Seien C und C´ verschiedene SCCs. Sei Kante (u, v) in ET so dass u in C und v in C´. Dann f(C) < f(C´) • Korollar: Seien C und C´ verschiedene SCCs f(C) > f(C SCCs, f(C´)). Dann kann es in ET keine Kante von C nach C´ geben. 41 Starke Zusammenhangskomponenten Beweis Lemma • Falls d(C) ( ) < d(C´) ( ) – Sei x erste Knoten entdeckt in C. Zur Zeit d(x) sind alle Knoten in C und C´ weiss – Theorem der weissen Pfade: alle Knoten in C und C C´ sind Nachkommen von x in DFS Baum – Klammerungstheorem: f[x] = f(C) > f(C´) • Falls d(C) > d(C´) – – – – – Sei y erste Knoten entdeckt in C´ Z Z Zur Zeit it d[y] d[ ] sind i d alle ll K Knoten t iin C´ weiss i Alle Knoten in C´ sind Nachkommen von y Zur Zeit d[y] [y] sind alle Knoten in C weiss Wegen Kante (u, v) gibt es keinen Pfad von C nach C´. Kein Knoten in C erreichbar von y – Zur Zeit f[y] sin alle Knoten in C weiss – Für alle w in C gilt f[w] > f[y], und f(C) > f(C´) 42 Starke Zusammenhangskomponenten Intuition für Algorithmus • Bei zweiter DFS auf GT, starte mit SCC C so dass f(C) Maximum • Korollar: Weil f(C) > f(C´) für alle anderen Komponenten C´, gibt es in ET keine Kanten von C nach C´ • DFS besucht nur Kanten in C • Nächste Wurzel in zweiter DFS ist in SCC C´, so dass f(C´) Maximum über alle SCCs auser C. DFS besucht alle Knoten in C´, und alle Kanten aus C´ gehen nach C, welche schon besucht wurden. • Deshalb nur Knoten in C C´ besucht – Etc. mit nächster Wurzel • Von jeder neuen Wurzel der zweiten DFS, erreichen nur – Knoten in seiner SCC – Knoten, die bereits besucht wurden in zweiter DFS • Besuchen Knoten von (GT)SCC in umgekehrter topologisch sortierte Reihenfolge 43 Nächstes Mal • Mehr Graphenalgorithmen 44