Motivation Zerlegung eines Graphen in 3-Zusammenhangskomponenten Graph-Dekomposition ist ein klassisches Problem der Graphentheorie. Aber warum Algorithm Engineering ? Carsten Gutwenger • „Implementierbarkeit“ von Algorithmen • zahlreiche Anwendungen, insbesondere im Graph Drawing Planarität, c-Planarität, Aufwärtsplanarität Vorlesung Algorithm Engineering WS 05/06 vom 2. und 3. Januar 2006 praxisrelevant! • Preprocessing Universität Dortmund, FB Informatik, LS11 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 2 k-Zusammenhang Literatur Definition. Sei k ∈ N. G=(V,E) ist k-zusammenhängend genau dann wenn • |V| > k und • G-X ist zusammenhängend für jedes X⊆V mit |X| < k. W. T. Tutte, Connectivity in graphs, Vol. 15 of Mathematical Expositions, University of Toronto Press, 1966. J. E. Hopcroft, R. E. Tarjan, Dividing a graph into triconnected components, SIAM Journal on Computing 2, 1973, pp. 135-158. C. Gutwenger, P. Mutzel, A linear time implementation of SPQR-trees, in: J. Marks (ed.), Graph Drawing (GD 2000), 0-zshgd. ⇔ G ist nicht leer. 1-zshgd. ⇔ G ist zusammenhängend. LNCS 1984, pp. 77-90, Springer-Verlag, 2001. 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 3 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten k-Zusammenhang (2) 4 2-Zusammenhang Satz (Menger‘s Theorem). Bekannt: Ein Graph ist genau dann k-zusammenhängend, wenn es zwischen jedem Paar von Knoten k unabhängige Pfade gibt. a ist Schnittknoten (cutvertex) gdw. ex. Knoten v und w, so dass jeder Pfad von v nach w über a führt. Block: maximaler zusammenhängender Teilgraph, der keinen Schnittknoten enthält. unabhängige Pfade: keine internen Knoten gemeinsam v … a w ≥k 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 5 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 6 1 Block-Graph Block-Graph (2) Definition. Seien G=(V,E) und B • C ⊆ V Menge der Schnittknoten von G, C • B ⊆ G Menge der Blöcke von G. Dann ist der (bipartite) Graph B B (C ∪ B, {(c, b) | c ∈ b}) B C der Block-Graph von G. B Graph 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 7 Block-Graph B BC-Baum 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Separationspaar 8 Splitklassen Sei G=(V,E) 2-zusammenhängend. Sei {u,v} Splitpaar. {u,v} ∈ V heisst Separationspaar, falls G - {u,v} nicht zusammenhängend ist. Splitklassen von {u,v}: Partition E1 , . . . , Ek der Kantenmenge, so dass {u,v} heisst Splitpaar, falls e, f ∈ Ei ⇐⇒ e und f liegen auf einem Pfad, der u und • {u,v} Separationspaar ist, oder v höchstens als einen Endpunkt enthält. • u und v sind adjazente Knoten. 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 9 Splitklassen (2) 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 10 Split-Operation Seien E1, . . . , Ek die Splitklassen eines Splitpaares {u,v}. Für ein j mit 1 j< k seien C = E1 ∪ . . . ∪ E j und C̄ = Ej+1 ∪ . . . ∪ Ek , so dass |C| ≥ 2 und |C̄| ≥ 2. Eine Split-Operation ersetzt G durch die Split-Graphen G1 = (V (C), C ∪ e) und G2 = (V (C̄), C̄ ∪ e), wobei e=(u,v) eine neue virtuelle Kante ist. 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 11 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 12 2 Split-Operation (2) C = E1 Tutte-Split C̄ = E2 ∪ E3 Eine Split-Operation heißt Tutte-Split, falls • C = Eα und • G(C ) oder G(C̄ ) enthält keinen Schnittknoten. ⇒ G1 G G2 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 13 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Tutte-Split (2) 14 Split-Graphen Beobachtung. Jeder Split-Graph enthält keinen Schnittknoten und mindestens 3 Kanten. Tutte-Split ja oder nein? Führe solange Split-Operationen durch wie möglich. Lemma. Die Gesamtzahl aller Kanten in Splitgraphen ist beschränkt durch 3|E| − 6. Nein! Nein! Ja! 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Beweis. → Tafel 15 3-Zusammenhangskomponenten 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 16 3-Zusammenhangskomponenten (2) b Beispiel: Definition. Wir erhalten die 3-Zusammenhangskomponenten eines Graphen, indem wir solange TutteSplits durchführen wie möglich. a c e g d f k n i h o l j p m 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 17 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 18 3 3-Zusammenhangskomponenten (3) a 3-Zusammenhangskomponenten (4) b c d Theorem. Jede 3-Zusammenhangskomponente ist e A d e d f e C h h L k h L l m m h K j I j K h c) ein Bündel von mind. 3 parallelen Kanten. seriell parallel n h h n 3-zshgd. n e E D b) ein Kreis (Polygon) mit mind. 3 Kanten, oder F e e a) ein einfacher, 3-zshgd. Graph, g e B I j G n j H j J Theorem. Die 3-Zusammenhangskomponenten eines Graphen sind eindeutig. n o p j i 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 19 SPQR-Baum P 2 Was passiert, wenn wir immer beliebige Split-Operationen durchführen? S 3 → Split-Komponenten P 4 Theorem. Jede Split-Komponente ist S 5 a) ein einfacher, 3-zshgd. Graph, A 2 B 3 20 3-Zusammenhangskomponenten (4) R 1 1 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten C 4 13 L 12 K 10 D I 5 G J 11 E 8 H 9 6 F 7 P 10 P 8 b) ein Kreis mit genau 3 Kanten, oder P 6 c) ein Bündel von genau 3 parallelen Kanten. S 12 S 11 R 9 S 7 Theorem. Die Split-Komponenten eines Graphen sind nicht eindeutig. R 13 Baum T(G) SPQR-Baum 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 21 3-Zusammenhangskomponenten (4) 1. Ersetze Multi-Kanten durch virtuelle Kanten. • Dreiecke zu maximalen Polygonen, und 2. Bestimme Split-Komponenten. → Cp+1, . . . , Ck • 3-er Bündel zu maximalen Bündeln verschmelzt. 3. Verschmelze in C1 , . . . , Ck (solange wie möglich) je zwei Polygone bzw. Bündel, die die gleiche virtuelle Kante enthalten. → 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 22 Der Algorithmus Theorem. Man erhält die 3-Zusammenhangskomponenten aus den Split-Komponenten, indem man → 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 23 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 24 4 Segmente Segmente (2) b Betrachte einen Kreis c im Graphen G. a c Ein Segment relativ zu c ist ein Untergraph S von G, der entweder e g d a) aus einer einzelnen Kante e=(u,v) mit u,v∈c und e∉c, oder f b) aus einer ZK K von G\c plus allen Kanten, die K mit c verbinden, n i h o besteht. k l j p m 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 25 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Separationspaare 26 Typ-1 b Ein Segment mit mind. 2 Kanten hat nur a und b mit c gemeinsam, und ein weiterer Knoten liegt nicht darin. Lemma. Seien S1, . . . , Sn die Segmente relativ zu c. Ist {a,b} ein Separationspaar von G, dann gilt: 1. Die Knoten a und b liegen beide auf c, oder beide im gleichen Segment. a c e d f 2. Falls a und b auf c liegen, dann trifft (mind.) einer der folgenden Fälle zu: g b a k n i h o l j p m 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 27 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Typ-2 DFS-Baum b Seien p und q die beiden Pfade, in die c durch a und b geteilt wird. Betrachte DFS Baum von G: a c num(v) DFS-Nummer von v v → w Baumkante v ֒→ w Rückwärtskante e d • Kein Segment enthält ein v≠a,b in p und ein w≠a,b in q; • p und q enthalten beide einen Knoten ≠a,b. 28 g b q p f k n i h ∗ D(v) = {w | v → w} Menge der Nachfolger von v o a l j p m 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 29 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 30 5 Lowpt-Werte Nummerierung ∗ lowpt1(v) = min {num(v)} ∪ {num(w) | v →֒→ w} Aber: Wir benötigen eine spezielle Nummerierung num(v): lowpt2(v) = min ({num(v)} ∪ ∗ ({num(w) | v →֒→ w} \ {lowpt1(v)}) lowpt1(v) lowpt2(v) Sei Adj(v) die Adjazenzliste von v. (P1) Die Wurzel hat Nummer 1. (P2) Seien w1, . . . , wn die Kinder von v gemäß Adj(v). Dann ist num(wi ) = num(v)+|D(wi+1)∪. . . ∪D(wn)|+1 v 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 31 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Nummerierung (2) 32 Nummerierung (3) u (P3) Die Kanten e in Adj(v) sind aufsteigend sortiert nach lowpt1(w) falls e = v → w num(w) falls e = v ֒→ w ⋮ lowpt2(wi) ⋮ Und: Knoten wi , . . . , wj mit gleichem lowpt1-Wert u sind wie folgt gemäß lowpt2-Wert sortiert: v … … wi … lowpt2(·) < num(v) D(wi) lowpt2(·) ≥ num(v) lowpt2(wj ) … wi′ wi′ +1 wj D(wi′) D(wi′+1) D(wj ) v ֒→ u 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 33 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Nummerierung (4) h1 Beispiel: l2 3 m j k 4 n 6 16 9 g i5 p7 e 10 o8 c 11 12 d 14 f 15 a b 13 34 Nummerierung (5) 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 2 3 16, 1, 4 6, 5 1 9, 7 8, 4 4, 6 10 1, 11 12 14, 13 10, 11 15 1 1, 2 Wie kann man diese Nummerierung effizient bestimmen? 1. Sortiere Adjazenzlisten aufsteigend gemäß Φ(e) = 3lowpt1(w) if e = v → w and lowpt2(w) < v 3w + 1 if e = v ֒→ w 3lowpt1(w) + 2 if e = v → w and lowpt2(w) ≥ v → Bucket-Sort 2. Bestimme damit Nummerierung gemäß (P1) und (P2). 3. lowpt1 und lowpt2 müssen neu berechnet werden! 35 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 36 6 Pfade Pfade (2) 1 Betrachte DFS-Traversierung gemäß Adj(v). B ∗ → Menge von Pfaden der Form v → w ֒→ u C 3 4 16 6 Jeder Pfad D ∗ 5 9 • endet am Knoten mit der kleinsten möglichen Nummer; • hat nur Anfangs- und Endknoten mit vorangehenden Pfaden gemeinsam. A: B: C: D: E: F: G: H: I: J: K: L: M: N: 2 A 7 10 E 8 11 12 ∗ → erhalten Kreise u → v → w ֒→ u 14 13 1 → 2 → 3 → 16 ֒→ 1 16 ֒→ 2 3 ֒→ 1 3 → 4 → 6 → 9 → 10 ֒→ 1 10 → 11 → 12 → 14 → 15 ֒→ 1 14 ֒→ 10 14 ֒→ 11 12 → 13 ֒→ 10 13 ֒→ 11 10 ֒→ 6 6 → 7 → 8 ֒→ 4 8 ֒→ 6 7 ֒→ 4 4 → 5 ֒→ 1 15 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 37 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Separationspaare: Typ-1 38 Separationspaare: Typ-1 (2) 1 a = 1 2 {a,b} mit num(a)<num(b) ist Separationspaar, falls b = 10 3 Typ-1: 4 16 Ex. r = a, b und s = a, b mit r = 11 s = 2 6 5 • b→r 9 • lowpt1(r) = num(a) 10 • lowpt2(r) ≥ num(b) 11 lowpt1(r) = 1 7 8 lowpt2(r) = 10 ≥ num(b) 12 • s∈ / D(r) 14 13 15 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 39 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Separationspaare: Typ-2 40 Separationspaare: Typ-2 Intuitiv: {a,b} mit a≠1 und num(a)<num(b) ist Separationspaar, falls • Löschen von a und b trennt die Knoten parent(a) und r voneinander. • Die Bedingungen für Rückwärtskanten bedeuten: Typ-2: Es darf keine Rückwärtskante geben, die aus dem Bereich zwischen r und x über a hinausläuft, denn diese würde parent(a) mit r verbinden. Ex. r = b mit ∗ •a→r→b Gibt es ein Kind w von b, aus dessen Teilbaum eine Rückwärtskante in den Bereich zwischen r und x läuft, dann ist der Teilbaum an w auch nach dem Löschen von a und b mit r verbunden. Daher muss ausgeschlossen werden, dass eine Rückwärtskante aus diesem Teilbaum in den Bereich über a führt, also wird lowpt1(w) ≥ a gefordert. • b ist ein „erster“ Nachfahre von r • Für alle x ֒→ y mit gilt: y ≥ a • Für alle x ֒→ y mit num(a) < num(y) < num(b) ∗ und b → w → x gilt: lowpt1(w) ≥ num(a) 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 41 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 42 7 Separationspaare: Typ-2 (2) Separationspaare 1 1 2 a = 4 3 4 16 6 8 11 3 4 16 9 8 ֒→ 6 8 ֒→ 4 7 ֒→ 4 Typ-2: 7 10 8 11 {6,10}, {4,10}, {10,15} {10,14} 12 12 14 {1,4}, {1,6}, {4,6} {1,10}, {1,3} 5 relevante Rückwärtskanten: 7 10 b = 10 r = 6 6 5 9 Typ-1: 2 13 14 13 15 15 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 43 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten Test auf Separationspaar Test auf Separationspaar (2) Typ-1: TSTACK → Test einer einfachen Bedingung für jede Baumkante. • Enthält Tripel (h,a,b) Typ-2: h ist höchste Nummer eines Knotens in zugehöriger Split-Komponente → Einfach, falls a→ v→ b und deg(v)=2. Sonst: Benutze TSTACK {a,b} ist potentielles Typ-2 Separationspaar • • Alle 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 44 45 Test auf Separationspaar (3) sind auf aktuellem Kreis 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 46 Test auf Separationspaar (4) Nach Bearbeitung von v i → vi+1 Multi-Kanten: • Sei (h,a,b) oberstes Element auf TSTACK. Dann ist {a,b} Typ-2 Separationspaar, falls • Können beim Berechnen der Split-Komponenten auftreten. • Werden beim Erzeugen einer virtuellen Kante erkannt. a = vi • Wichtig: Ordnung der Adjazenzlisten! num(vi ) = 1 a = parent(b) Eigenschaften bzgl. Rückwärtskanten werden durch Update von TSTACK sichergestellt! 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 47 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 48 8 Split-Komponenten Split-Komponenten (2) Berechnung der Split-Komponenten: Verwaltung von ESTACK: • Verwalte aktuellen Graphen und DFS-Baum. → Update beim Abspalten von Split-Komponenten. • Bearbeitung von v→w: → Push auf ESTACK nach rekursivem Aufruf für w. • Abspalten = Löschen einiger Kanten und ersetzen durch neue virtuelle Kante. → ESTACK • Bearbeitung von : → Push auf ESTACK falls keine Multi-Kante. 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 49 Korrekturen 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 50 Laufzeit Aufbau SPQR-Baum Testgraphen: • zufällig generiert • planar, 2-zusammenhängend, simple • n = 1000,…,10000 • Dichte: m = 1.5n, m = 2n • Funktion Φ zum Sortieren der Adjazenzlisten → Erkennen von Multi-Kanten • Erzeugen der letzten Split-Komponente • Update von TSTACK • je 25 Graphen pro Datenpunkt • Test auf Typ-2 Separationspaare • Verschiedene Updates: A1(v), DEGREE(v), HIGHPT(v) System & Implementierung: • Pentium 4, 3.4 GHz, 1 GB • Windows XP, MinGW g++ 3.4.4 • OGDF (Open Graph Drawing Framework) 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 51 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 52 Laufzeit Aufbau SPQR-Baum 350 planar 2-zshgd., m = 1.5n planar 2-zshgd., m = 2n 300 Laufzeit [ms] 250 200 150 100 50 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 Anzahl Knoten 02./03.01.2006 — Algorithm Engineering: 3-Zusammenhangskomponenten 53 9