Algorithmen und Datenstrukturen SS09 Foliensatz 16 Michael Brinkmeier Technische Universität Ilmenau Institut für Theoretische Informatik Sommersemester 2009 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 1 / 45 Graphen Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 2 / 45 Graphen 1 2 1 2 3 4 3 4 5 5 6 7 6 7 8 9 8 9 Gerichteter Graph Ungerichteter Graph Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 3 / 45 Graphen Graphen sind eine in der Informatik und zur Modellierung von Anwendungssituationen allgegenwärtige (Daten-)Struktur. Graphen modellieren: Straßen und Verbindungswege Gatter und Leitungen auf einem Chip Systemkomponenten und Verbindungen Zustände eines Systems und Übergänge Flussdiagramme für Programmentwurf Datenflussdiagramme für Programm-Analyse Vorgänge mit Unverträglichkeitsbeziehungen Stationen eines Transportsystems mit Kapazitäten der Verbindungen Soziale Beziehungen u. v. a. m. Hier nur: Algorithmen zum Umgang mit den Strukturen. (Modellierung, Beispiele nur am Rande.) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 4 / 45 Gerichtete Graphen Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 5 / 45 Gerichtete Graphen 9 7 4 2 3 1 5 8 6 Definition (Gerichteter Graph) Ein gerichteter Graph (Digraph, directed graph) G ist ein Paar (V , E ), wobei V eine endliche Menge und E eine Teilmenge von V × V = {(u, v ) | u, v ∈ V } ist. Die Elemente von V werden Knoten, die von E Kanten genannt. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 6 / 45 Gerichtete Graphen Knoten zeichnet man üblicherweise als Kreise u e v Eine Kante e = (u, v ) als Pfeil zwischen den Knoten. Ist e = (u, v ) eine Kante, dann sind u und v inzident zu e (d.h. liegen auf e). sind u und v zueinander adjazent (benachbart) ist v ein Nachfolger von u ist u ein Vorgänger von v Eine Kante (v , v ) heißt Schleife (loop). v Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 7 / 45 Ein- und Ausgangsgrad Definition (Ein- und Ausgangsgrad) 1 Der Eingangsgrad indegG (v ) (in-degree) eines Knotens v ist die Anzahl der Kanten, die in v hineinführen, d.h. v indegG (v ) = |{e ∈ E | e = (u, v ) für ein u ∈ V }| . 2 Der Ausgangsgrad outdegG (v ) (in-degree) eines Knotens v ist die Anzahl der Kanten, die in v verlassen, d.h. outdegG (v ) = |{e ∈ E | e = (v , u) für ein u ∈ V }| . Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 8 / 45 v Ein- und Ausgangsgrad Lemma Für jeden gerichteten GRaphen G = (V , E ) gilt: X X indegG (v ) = outdegG (v ) = |E |. v∈V v∈V Beweis. In jeder Summe wird jede Kante genau einmal gezählt – Einmal für ihren Anfang und einmal für ihr Ende. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 9 / 45 Wege Weg G = (V , E ) sei ein gerichteter Graph. Ein Weg in G ist eine Sequenz π = (v0 , v1 , . . . , vl ) von Knoten in G , so dass (vi −1 , vi ) ∈ E für i = 1, . . . , l. l ist die Länge des Weges. Wir schreiben u G v oder v , falls ein Weg von u nach v in G existiert. Äquivalent kann man einen Weg π = (v0 , . . . , vl ) als Folge von Kanten auffassen: π = ((v0 , v1 ), (v1 , v2 ), . . . , (vl−1 , vl )) . Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 10 / 45 Wege 9 7 4 2 3 1 5 8 6 π = (1, 2, 3, 4, 5, 6) ist ein Weg der Länge 5. 1 6 aber 9 6 8. Beobachtung Die Relation ist transitiv, denn Wege können anneinander gehängt werden, und reflexiv, denn jeder Knoten ist mit sich selbst durch einen Weg der Länge 0 verbunden. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 11 / 45 Einfache Wege Definition (Einfacher Weg) Ein Weg π = (v0 , v1 , . . . , vl ) heißt einfach, wenn die Knoten v0 , v1 , . . . , vl paarweise verschieden sind. 9 7 4 2 3 1 5 8 6 (1, 2, 3, 4, 5, 6) ist einfach aber (4, 7, 8, 8) ist nicht einfach. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 12 / 45 Einfache Wege Lemma Wenn u v , dann existiert ein einfacher Weg von u nach v . Beweisskizze Ist π = (u = v0 , v1 , . . . , vl = v ) ein Weg mit vi = vk und i < k, dann ist π ′ = (v0 , . . . , vi , vk+1 , . . . , vl ) ein Weg mit mindestens einer Wiederholung weniger (entferne den Zyklus von vi nach vk = vi ). Damit kann man induktiv die Anzahl der Wiederholungen auf 0 senken und erhält einen einfachen Weg. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 13 / 45 Distanzen Definition (Distanz) Sei G = (v , E ) ein gerichteter Graph. Die Distanz gG (u, v ) von u zu v ist die minimale Länge eines Weges von u nach v , d.h. dG (u, v ) = min {l | es existiert ein Weg π = (u = v0 , . . . , vl = v )} . Ein kürzester Weg von u nach v ist ein Weg von u nach v mit der Länge dG (u, v ). Beobachtung Jeder kürzeste Weg ist ein einfacher Weg. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 14 / 45 Kreise Definition (Zyklus) Ein Weg π = (v1 , . . . , vl ) heisst Zyklus oder Kreis (cycle), wenn l ≥ 1 und v0 = vl gilt. Die Kantenzahl l heisst Länge des Kreises. Jede Schleife (v , v ) ist ein Kreis der Länge 1. 9 7 4 2 3 1 5 8 6 (3, 4, 5, 3), (8, 8) und (2, 3, 2) sind Kreise. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 15 / 45 Kreise Definition (Einfacher Kreis) Ein KReis π = (v0 , v1 , . . . , vl = v0 ) heißt einfach, wenn die Knoten v0 , . . . , vl−1 paarweise verschieden sind. Lemma Wenn G einen Kreis enthält, dann auch einen einfachen Kreis. Der Beweis verläuft analog dem, zur Existenz von einfachen Wegen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 16 / 45 DAGs Definition (DAG) Ein gerichteter Graph heißt kreisfrei oder azyklisch, wenn es in G keinen Kreis gibt. Sonmst heißt G zyklisch. Ein kreisfreier gerichteter Graph wird auch DAG genannt (directed acyclic graph). Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 17 / 45 Ungerichtete Graphen Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 18 / 45 Ungerichtete Graphen K I G D B E J H F L C A Definition (Ungerichteter Graph) Ein ungerichteter Graph (undirected graph) G ist ein Paar (V , E ), wobei V eine endliche Menge und E eine Teilmenge von [V ]2 = {{u, v } | u, v ∈ V , u 6= v } ist. Statt {u, v } schreiben wir auch (u, v ). Bei ungerichteten Graphen (und nur da), gilt somit (u, v ) = (v , u). Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 19 / 45 Grad Definition (Grad) Sei G = (V , E ) ein ungerichteter Graph. Der Grad degG (v ) (Valenz, degree) eines Knotens v ist die Anzahl der zu v inzidenten Kanten, d.h. degG (v ) := |{(u, v ) ∈ E | v 6= u ∈ V }| . Ein Knoten mit Grad 0 heißt isoliert. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 20 / 45 Grad Lemma Wenn G = (V , E ) ein ungerichteter Graph ist, dann gilt: X degG (v ) = 2|E |. v∈V Beweis Jede Kante (u, v ) ∈ E trägt jeweils 1 zu degG (v ) und degG u) bei. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 21 / 45 Wege Definition (Weg) Sei G = (V , E ) ein ungerichteter Graph. Ein Weg π = (v0 , v1 , . . . , vl ) in G ist eine Folge von Knoten vi , so dass (vi −1 , vi ) ∈ E für 1 ≤ i ≤ l. l – d.h. die Kantenzahl – ist die Länge von π = (v0 , . . . , vl ). π heißt einfach, wenn die Knoten v0 , . . . , vl paarweise verschieden sind. K I G D B E J H F C (K , L), (I , F , E , D) und (E , C , A, C , B) sind Wege. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau L Seite 22 / 45 A Einfache Wege Lemma Sei G = (V , E ) ein ungerichteter Graph und π = (v0 , . . . , vl ) ein Weg mit u = v0 und v = vl – d.h. ein Weg von u nach v – dann existiert auch ein einfacher Weg von u nach v . Beweisskizze Gilt vi = vj für i < j, dann ist π ′ = (v0 , . . . , vi , vj+1 , . . . vl ) ein Weg von u nach v mit einer Wiederholung weniger. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 23 / 45 Zusammenhang Definition (Zusammenhang) Sei G = (V , E ) eiun ungerichteter Graph. Wenn u, v ∈ V in G durch einen Weg verbunden sind, schreiben wir u ∼G v oder Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 45 u ∼ v. Zusammenhang Lemma Die zweistellige Relation ∼G auf V ist eine Äquivalenzrelation, d.h. sie ist reflexiv: v ∼G v für alle v ∈ V . symmetrisch: v ∼G u ⇒ u ∼G v . transitiv: u ∼G v und v ∼G w ⇒ u ∼G w . Beweisskizze Reflexivitität ist klar, da (v ) ein Weg ist. Die Symmetrie folgt, weil jeder Weg in beide Richtungen durchlaufen werden kann. Die Transitivität folgt aus der Tatsache, dass die zwei gegebenen Wege hintereinandergehängt werden können. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 25 / 45 Zusammenhangskomponenten Definition (Zusammenhangskomponenten) Sei G = (V , E ) ein ungerichteter Graph. Die Äquivalenzrelation ∼G zerlegt die Knotenmenge von G in Äquivalenzklassen, die sogenannten Zusammenhangskomponenten von G . Ein Graph, der nur aus einer Zusammenhangskomponenten besteht – d.h. in dem u ∼G v für jedes Knotenpaar u, v gilt – heißt zusammenhängend. K I G D B E J H F C Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau L Seite 26 / 45 A Kreise Definition (Kreis) Ein Weg π = (v0 , . . . , vl ) in einem ungerichteten Graphen G = (V , E ) mit v0 = vl heißt Kreis der Länge l, wenn l ≥ 3 und wenn vi −1 6= vi +1 für 1 ≤ i < l und vl−1 6= v1 . π heißt einfach, wenn die Knoten v0 , . . . , vl−1 paarweise verschieden sind. K I G D B E J H F L C A (I , G , D, F , I ) und (E , D, C , A, B, C , E ) sind Kreise, (I , G , D, F , I ) ist einfach Es ist nicht erlaubt, die selbe Kante direkt hintereinander zu nutzen, d.h. (K , J, K ) ist kein Kreis. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 27 / 45 Kreise Lemma Sei G = (V , E ) ein ungerichteter Graph. Enthält G einen Kreis, so enthält er auch einen einfache Kreis. Definition (Kreisfrei) Ein ungerichteter GRaph G = (V , E ) heißt kreisfrei oder azyklisch, wenn er keinen Kreis enthält. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 28 / 45 Bäume Definition (Freier Baum) Ein ungerichteter Graph G = (V , E ) heißt freier Baum (oder nur Baum), wenn er zusammenhängend und kreisfrei ist. Bemerkung Die Zusammenhangskomponenten eines kreisfreien Graphen sind Bäume. Deshalb werden kreisfreie Graphen auch (freie) Wälder genannt. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 29 / 45 Bäume Lemma Sei G = (V , E ) ein ungerichteter Graph mit n = |V | Knoten und m = |E | Kanten. Dann sind die folgenden Aussagen äquivalent: 1 G ist ein Baum 2 G ist kreisfrei und m ≥ n − 1 3 G ist zusammenhängend und m ≤ n − 1 4 Zu jedem Paar u, v von Knoten gibt es genau einen einfachen Weg von u nach v 5 G ist maximal kreisfrei, d.h. das Hinzufügen einer beliebigen weiteren Kante erzeugt einen Kreis, 6 G ist zusammenhängend, aber das Entfernen einer beliebigen Kante aus E erzeugt einen nicht zusammenhängenden Graphen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 30 / 45 Datenstrukturen für Graphen Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 31 / 45 Grundlegende Operationen u, v seien Knoten und e eine Kante. source(e): Startknoten von e (gerichtet). target(e): Zielknoten von e (gerichtet). edge(u, v ): true falls eine Kante (u.v ) existiert, sonst false. indeg (v ): Der Eingangsgrad von v (gerichtet). outdeg (v ): Der Ausgangsgrad von v (gerichtet). deg (v ): Der Grad von v (din (v ) + dout (v ) im gerichteten Fall). adj(v ): Eine Liste aller Nachbarn von v (ungerichtet). incident(v ): Eine Liste aller zu v inzidenten Kanten (ungerichtet). succ(v ): Eine Liste aller Vorgänger von v (gerichtet). in(v ): Eine Liste aller zu v führenden Kanten (gerichtet). pred(v ): Eine Liste aller Nachfolger von v (gerichtet). out(v ): Eine Liste aller von v ausgehenden Kanten (gerichtet). Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 32 / 45 Die Adjazenzmatrix Sei G = (V , E ) ein (gerichteter) Graph. Im Folgenden gehen wird davon aus, dass V = {1, . . . , n} mit n = |V | gilt. Unter diesen Voraussetzungen können wir einen (gerichteten) Graphen G = (V , E ) mittels einer Adjazenzmatrix A = (au,v )u,v∈V , einer n × n-Matrix über X mit ( 1 falls (u, v ) ∈ E , au,v = 0 sonst darstellen. Um diese Matrix zu speichern benötigen wir ein zweidimensionales Array A[1n, 1 . . . n] mit Einträgen aus {0, 1}. Konsequenz: Lesen/Schreiben von au,v in Zeit O(1). Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 33 / 45 Die Adjazenzmatrix 1 4 2 5 8 3 6 9 7 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 Anzahl der “1”en in Zeile u = outdeg (u) Anzahl der “1”en in Spalte v = indeg (v ) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 34 / 45 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 Die Adjazenzmatrix 1 2 4 5 8 3 6 7 9 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 1 1 Im ungerichteten Fall ist die Adjazenzmarix symmetrisch Anzahl der “1”en in Zeile u = Anzahl der “1”en in Spalte u = deg (v ) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 35 / 45 Adjazenzmatrix Die Adjazenzmatrix eines (gerichteten) Graphen G = (V , E ) mit n = |V | und m = |E | . . . . . . hat Speicherbedarf Θ(n2 ), . . . Zeitbedarf O(1) um au,v zu ermitteln, bzw. zu setzen, . . . ermöglicht die Ermittlung aller Nachfolger, Vorgänger oder Nachbarn eines Knotens in Zeit Θ(n) (Zeilen/Spaltendurchlauf). Problem Bei m ≪ n2 ist der Speicheraufwand im Vergleich zu den vorhandenen Informationen sehr hoch (viele “0”en, dünn besetzte Graphen). Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 36 / 45 Kantenmarkierungen Die Adjazenzmatrix bietet auch eine einfache Möglichkeit Kantenmarkierungen, wie z.B. Gewichte, Bezeichnungen, Farben, zu speichern. Definition (Kantenmarkierungen) Sei G = (V , E ) ein Graph und M eine Menge von Kantenmarkierungen. Eine (Kanten-)Markierung von G ist eine Abbildung mark : E → M, d.h. jeder Kante e wird eine Marke mark(e) zugeordnet. Man spricht auch häufig von Farben. Sind die Markierungen Zahlen, so wird – je nach ANwendung – auch häufig von Längen, Gewichten, Kapazitäten oder Kosten gesprochen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 37 / 45 Kantenmarkierungen Ist G ein Graph mit Kantenmarkierungen, so können die Werte mark(e) direkt in der Adjazenzmatrix gespeichert werden. adju,v = ( mark(u, v ) − falls (u, v ) ∈ E sonst Dabei steht − für einen Null-Zeiger oder eine beliebige Markierung, dass die Kante nicht eistiert und deshalb auch keine Markierung hat. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 38 / 45 Die Adjazenzlisten Eine Alternative besteht darin, für jeden Knoten eine Liste von adjazenten Kanten zu halten, die so genannten Adjazenzlisten. 1 ... 2 ... 3 ... .. . Die Struktur besteht aus einer Liste von Knoteneinträgen, die wiederrum einen Zeiger auf die Adjazenzliste des jeweiligen Knoten enthalten. Jeder Eintrag einer Adjazenzliste hat drei Komponenten: Den Zielknoten, die Markierung und einen Zeiger auf den nächsten adjazenten Knoten. Insgesamt ergibt sich somit ein Speicherbedarf von O(|V | + |E |). Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 39 / 45 Die Adjazenzlisten 1 1 1 2 4 1 8 3 2 1 5 1 1 2 2 6 2 1 2 9 2 7 1: 2: 3: 4: 5: 6: 7: 8: 9: 1 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 40 / 45 (2, 1), (4, 1), (5, 2) (3, 1) (2, 2), (7, 1) (8, 1), (9, 2) (6, 2), (8, 1) (9, 1) (6, 2) (9, 2) (9, 1) Doppelt verkettete Adjazenzlisten Statt einfach verketteter Adjazenzlisten, können selbstverständlich auch doppelt verkettete Listen verwendet werden. Außerdem kann für jede Kante noch ein zusätzlicher Zeiger auf den entsprechenden Knoten angelegt werden. Ein Knoteneintrag besteht somit aus 1 der Nummer des Knotens, 2 3 zwei Zeigern auf die beiden Nachbarn in der Knotenliste und einem Zeiger auf den Beginn der Liste der Inzidenten Kanten. Ein Kanteneintrag besteht aus 1 2 dem Gewicht der Kante, zwei Zeigern auf die beiden Nachbarn in der Kantenliste, einem Zeiger auf den Knoteneintrag des Zieles und Wie bei den einfach verketteten Adjazenzlisten, ist der Speicherbedarf O(|V | + |E |). 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 41 / 45 Doppelt verkettete Adjazenzlisten 1 2 3 4 1 • • • • • • • • ◦ 2 • • • • • • • • • 3 • • ◦ 4 • • ◦ Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 42 / 45 • • ◦ Bemerkungen In allen vorgestellten Darstellungen, können statt der Gewichte natürlich auch Zeiger auf Strukturen verwaltet werden, die zusätzliche Attribute der Kanten enthalten. Die Adjazenzlistendarstellungen ermöglichen direkt die Verwendung von parallelen Kanten, indem einfach für jede Kante ein Eintrag in der Adjazenzliste gemacht wird. In der Adjazenzmatrix können parallele Kanten so hinzugefügt werden, dass jeder Matrixeintrag ein Zeiger auf eine Liste von Kanten zwischen den beiden jeweiligen Knoten ist. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 43 / 45 Übersicht Adjazenzmatrix Vorteile Nachteile Adjazenzliste Schneller Zugriff auf Kanten in O(1) Niedriger Speicherbedarf bei wenig“ Kanten ” Dynamischer Hoher Speicherbedarf O(|V |2 ) aufwändigere Verwaltung Zugriff auf Kanten langsamer Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 44 / 45