Algorithmen und Datenstrukturen Prof. Martin Lercher Institut für Informatik Heinrich-Heine-Universität Düsseldorf Teil 9 Graphen Version vom 13. Dezember 2016 1/1 Vorlesung Fortsetzung 13. Dezember 2016 2/1 Grundlagen: Graph Definition (Graph) Ein Graph G = (V , E ) besteht aus einer endlichen Menge von Knoten V = {u1 , . . . , un } und einer endlichen Menge E von Kanten. 1 In einem gerichteten Graphen ist jede Kante e ein Paar (u, v ) von zwei Knoten u, v ∈ V , u ist der Startknoten und v der Zielknoten der Kante (u, v ). E ⊆V ×V 2 In einem ungerichteten Graphen ist jede Kante e ein Menge {u, v } von zwei verschiedenen Knoten u, v ∈ V , u und v sind die Endknoten der Kante {u, v }. E ⊆ {{u, v } | u, v ∈ V , u 6= v } 2 / 13 Grundlagen: Darstellung Wir zeichnen die Knoten als Kreise oder Punkte. Eine gerichtete Kante (u, v ) zeichnen wir als Pfeil von u nach v . Eine ungerichtete Kante zeichnen wir als verbindende Linie zwischen u und v . Beispiel (Gerichteter Graph) G = (V , E ), V = {u1 , u2 , u3 , u4 , u5 , u6 , u7 }, E = {(u1 , u2 ), (u1 , u4 ), (u2 , u3 ), (u3 , u4 ), (u3 , u5 ), (u4 , u6 ), (u4 , u7 ), (u5 , u6 ), (u7 , u1 )} 2 1 3 5 7 4 6 3 / 13 Grundlagen: Adjazenzmatrix Sei e = (u, v ) bzw. e = {u, v } eine Kante. Die Knoten u und v sind zueinander adjazent und mit Kante e inzident. Definition (Adjazenzmatrix) Sei n die Anzahl der Knoten in einem gerichteten Graphen G = (V , E ) mit V = {u1 , . . . , un }. Die Adjazenzmatrix für G ist eine n × n-Matrix AG = (ai,j ) mit 1 falls (ui , uj ) ∈ E ai,j = 0 falls (ui , uj ) 6∈ E Für die Repräsentation von ungerichteten Graphen mit Adjazenzmatrizen wird jede ungerichtete Kante e = {u, v } als zwei gerichtete Kanten (u, v ), (v , u) gespeichert. 4 / 13 Grundlagen: Adjazenzmatrix Beispiel (Adjazenzmatrix) Sei V = {u1 , u2 , u3 , u4 , u5 , u6 , u7 } und E = {(u1 , u2 ), (u1 , u4 ), (u2 , u3 ), (u3 , u4 ), (u3 , u5 ), (u4 , u6 ), (u4 , u7 ), (u5 , u6 ), (u7 , u1 )}, dann ist die Adjazenzmatrix AG für G : u1 u2 u3 AG = u4 u5 u 6 u7 u1 0 0 0 0 0 0 1 u2 1 0 0 0 0 0 0 u3 0 1 0 0 0 0 0 u4 1 0 1 0 0 0 0 u5 0 0 1 0 0 0 0 u6 0 0 0 1 1 0 0 u7 0 0 0 1 0 0 0 5 / 13 Grundlagen: Adjazenzliste Definition (Adjazenzliste) In der Adjazenzlistendarstellung werden für jeden Knoten u alle von u ausgehenden und einlaufenden Kanten bzw. alle mit u inzidenten Kanten in einer doppelt verkettete Liste gespeichert. Anmerkungen: 1 Die Repräsentation eines Graphen G = (V , E ) mit n Knoten und m Kanten als Adjazenzmatrix benötigt Θ(n2 ) Platz. 2 Typische Operationen wie etwa das Inspizieren aller mit einem Knoten inzidenten Kanten sind auf Adjazensmatrizen ineffizient. 3 Die Darstellung eines Graphen G mit n Knoten und m Kanten als Adjazenzliste benötigt Θ(n + m) Platz. 4 Adajzenzlisten unterstützen sehr gut das Verfolgen von Kanten (die Wegesuche). 6 / 13 Grundlagen: Adjazenzliste Beispiel (Adjazenzliste) (1,2) (1,4) auslaufende Kanten 1 (7,1) einlaufende Kanten (2,3) 2 (1,2) (3,4) (3,5) 3 (2,3) (4,6) (4,7) (1,4) (3,4) 4 (5,6) 5 (3,5) 6 (4,6) (5,6) (7,1) 7 (4,7) 7 / 13 Grundlagen: Notationen Definition (Notationen) Sei G = (V , E ) ein Graph. • Der Eingangsgrad bzw. Ausgangsgrad eines Knotens u, bezeichnet mit indeg(u) bzw. outdeg(u), ist die Anzahl der in u einlaufenden bzw. aus u laufenden Kanten. • Der Knotengrad eines Knotens u, bezeichnet mit deg(u), ist die Anzahl der mit u inzidenten Kanten. • Ein Graph G 0 = (V 0 , E 0 ) ist ein Teilgraph von G , bezeichnet mit G 0 ⊆ G , falls V 0 ⊆ V und E 0 ⊆ E . • G 0 = (V 0 , E 0 ) ⊆ G ist ein induzierter Teilgraph von G , falls E 0 = E ∩ {{u, v } | u, v ∈ V 0 } bzw. E 0 = E ∩ (V 0 × V 0 ). • Für eine Knotenmenge V 0 ⊆ V ist G |V 0 = (V 0 , E ∩ {{u, v } | u, v ∈ V 0 } bzw. G |V 0 = (V 0 , E ∩ (V 0 × V 0 ) der durch V 0 induzierte Teilgraph von G . 8 / 13 Grundlagen: Notationen Definition (Notationen) • Eine Folge p = (v1 , . . . , vk ) von k ≥ 1 Knoten mit (vi , vi+1 ) ∈ E bzw. {vi , vi+1 } ∈ E für 1 ≤ i ≤ k − 1 ist ein Weg von Knoten v1 nach Knoten vk . • Weg p ist ein Kreis, wenn zusätzlich (vk , v1 ) ∈ E bzw. k > 2 uns {vk , v1 } ∈ E . • Weg bzw. Kreis p ist einfach, wenn alle Knoten in p paarweise verschieden sind. • Ein Graph ist kreisfrei, wenn er keinen einfachen Kreis enthält. • Ein ungerichteter Wald ist ein ungerichteter, kreisfreier Graph. • Ein ungerichteter Baum ist ein ungerichteter Wald in dem es zwischen jedem Knotenpaar einen Weg gibt. 9 / 13 Grundlagen: Notationen Anmerkung: In einem ungerichteten Baum gibt es zwischen jedem Knotenpaar genau einen einfachen Weg. Definition (Notationen) • Ein (von den Wurzeln zu den Blättern) gerichteter Wald ist ein gerichteter, kreisfreier Graph mit indeg(u) ≤ 1 für alle Knoten u ∈ V. • Die Knoten mit Eingangsgrad 0 heißen Wurzeln. • Ein gerichteter Wald mit genau einer Wurzel ist ein gerichteter Baum. Anmerkungen: • In einem gerichteten Baum gibt es von der Wurzel zu jedem Knoten genau einen Weg. • Gelegentlich werden die Kanten in gerichteten Bäumen/Wäldern auch anders herum orientiert. 10 / 13 Grundlagen: Graphisomorphie Definition (Graphisomorphie) Zwei Graphen G = (V , E ) und J = (V 0 , E 0 ) sind isomorph, falls es eine Bijektion b : V −→ V 0 gibt mit (u, v ) ∈ E ⇐⇒ (b(u), b(v )) ∈ E 0 , falls G und J gerichtet sind, bzw. {u, v } ∈ E ⇐⇒ {b(u), b(v )} ∈ E 0 , falls G und J ungerichtet sind. Anmerkung: Graphisomorphie nachzuweisen ist im allgemeinen schwer (in NP aber vermutlich jedoch nicht NP-vollständig). Die √ log(n) O( n besten Algorithmen haben eine Laufzeit von 2 ) (Eugene Luks, 1983). 11 / 13 Grundlagen: Adjazenzmatrix/Adjazenzlisten Anmerkung: Die Speicherung eines Graphen mit n Knoten als Adjazenzmatrix benötigt Θ(n2 ) Platz, unabhängig davon, ob der Graph sehr viele oder nur sehr wenige Kanten hat. Algorithmen, die als interne Datenstruktur eine Adjazenzmatrix verwenden, benötigen wegen der Initialisierung der Adjazenzmatrix immer mindestens Ω(n2 ) Rechenschritte. Die Verwendung einer Adjazenzmatrix ist somit nur dann sinnvoll, wenn die Laufzeit der besten Algorithmen im besten Fall (also bezüglich der Best-case-Zeitkomplexität) Ω(n2 ) nicht unterschreitet. Selbst wenn der Graph bereits in Form einer Adjazenzmatrix als Eingabe gegeben ist und die Adjazenzmatrix nicht erst aufgebaut werden muss, kann die Laufzeit der Algorithmen für viele Graphenprobleme Ω(n2 ) nicht unterschreiten. Dies zeigt der folgende Satz von Rivest und Vuillemin in [RV76], den wir hier jedoch nicht beweisen möchten. 12 / 13 Grundlagen: Satz von Rivest und Vuillemin Satz (Rivest und Vuillemin [aus RV76]) Sei E eine Grapheigenschaft, für die gilt: 1 E ist nicht trivial, d. h., es gibt mindestens einen Graphen, der die Eigenschaft E hat, und es gibt mindestens einen Graphen, der die Eigenschaft E nicht hat. 2 E ist monoton, d. h., wenn ein Graph G die Eigenschaft E hat, dann haben auch alle Teilgraphen von G die Eigenschaft E. 3 E ist unabhängig von der Anordnung der Knoten der Graphen mit Eigenschaft E, d. h., für alle Graphen G und alle zu G isomorphen Graphen G 0 gilt E(G ) = E(G 0 ). Dann benötigt jeder Algorithmus, der die Eigenschaft E auf der Basis einer Adjazenzmatrix entscheidet, mindestens Ω(n2 ) Rechenschritte. Beispiele: Planarität, Kreisfreiheit, . . . 13 / 13