O(n) Planarität durch Edge Addition 1 Grundbegriffe 2 Edge Addition

Werbung
O(n) Planarität durch Edge Addition
Algorithmus nach Boyer/Myrvold
von Thomas Thüm
Magdeburg, den 9. Mai 2007
1 Grundbegriffe
Mit dem Begriff Komponente sei im Folgenden eine zweifach-zusammenhängende Komponente gemeint. Der DFI
(depth first search index) eines Knotens ist die Position an der der Knoten während einer Tiefensuche (DFS)
zuerst angetroffen wurde. Ein Knoten v heißt DFS-Kind (DFS child) eines Knotens w, wenn v ein Kindknoten
im DFS-Baum ist. Ein Knoten v ist ein DFS-Vorfahre (DFS ancestor) bzw. DFS-Nachfahre (DFS descendant)
von w, wenn v durch aufsteigende bzw. absteigende Kanten im DFS-Baum von w aus erreichbar ist.
Definition. Eine Kante {v, w} heißt Rückkante, wenn v DFS-Vorfahre von w, aber w kein DFS-Kind von v ist.
Definition. Ein Knoten v heißt Artikulation (cut vertex), wenn sein Entfernen zwei andere Knoten x und y
trennt.
2 Edge Addition
Das Grundlegende Konzept des Algorithmus von Boyer/Myrvold ist Edge Addition. Es wird jede Kante einzeln
so eingefügt, das für spätere Einbettungen von Kanten keine Änderungen vorgenommen werden müssen. Die
Knoten werden mit einer Tiefensuche traversiert und in umgekehrter Reihenfolge verarbeitet. Dadurch ist es
möglich alle unverarbeiteten Knoten in ein Land einzubetten, insbesondere in das Außenland. Da beim Hinzufügen von Rückkanten einige Knoten vom Außenland getrennt werden, müssen bestimmte Komponenten gedreht
werden (siehe Abbildung 1).
Abbildung 1: Edge Addition. (a) r ist eine Artikulation. Die Kante {v, w} soll eingefügt werden. (b) Durch
Entfernen von r ist der Graph nicht mehr zusammenhängend. (c) r wird durch zwei virtuelle
Knoten ersetzt. (d) Durch Umdrehen der unteren Komponente bleibt y außen.
3 External Activity
Definition. Sei w ein DFS-Nachfahre von v in einer Komponente B. Der Knoten w heißt extern aktiv (externally
active), wenn es einen Pfad von w zu einem DFS-Vorfahren u von v gibt, bestehend aus einer Rückkante und
keinem oder mehr DFS-Nachfahren von w, die nicht in B sind (siehe Abbildung 2).
Definition. Der Tiefpunkt (lowpoint) eines Knotens ist der DFS-Vorfahre mit kleinstem DFI, der über einen
Pfad mit keiner oder mehr absteigenden DFS-Baum-Kanten und einer Rückkante erreicht werden kann.
Bemerkung. Der Tiefpunkt wird zunächst für alle Knoten mit Rückkante bestimmt und anschließend für alle
übrigen.
Jeder Knoten erhält eine Liste namens seperatedDFSChildList, in der alle Kindknoten - nach Tiefpunkt aufsteigend sortiert - enthalten sind. In der Liste einer Artikulation, wird ein Knoten gelöscht, wenn zwei Komponenten
verschmelzen.
Folgerung. Ein Knoten w ist extern aktiv während der Verarbeitung von v, wenn er eine Rückkante zu einem
Vorfahren von v hat oder das erste Element der seperatedDFSChildList einen kleineren DFI hat als v.
1
Abbildung 2: Beispiel für extern aktive Knoten (Quadrate)
4 Flipping
Lemma 1. In jeder Komponente B hat der Knoten r mit dem kleinsten DFI nicht mehr als ein DFS-Kind in
B.
Beweis. Sei c ein DFS-Kind von r. Angenommen er hätte ein weiteres Kind d. Da B 2-fach zusammenhängend ist, existiert eine Kante {r, d} und ein Pfad von r nach d über c. Letzteres stellt einen Widerspruch zur
Tiefensuche dar.
Definition. Wir bezeichnen den Knoten r als Wurzel von B und die Kante zu seinem einzigen Kindknoten c
als Wurzelkante {r, c}. rc bezeichnet einen virtuellen Knoten der nur mit einem Kind c adjazent ist und r0 den
virtuellen Knoten, der keinen Kindknoten hat.
Lemma 2. Es sind O(n) Verschmelzungen von Komponenten nötig.
Beweis. Jede Wurzel rc einer 2-fach zusammenhängenden Komponente wird genau einmal während des Algorithmus verschmolzen mit r0 . Da jeder Knoten c maximal mit einer Wurzel rc verbunden ist, gibt es höchstens
O(n) Verschmelzungen.
Jede Kante {v c , c} wird als 2-fach zusammenhängende Komponente aufgefasst und bekommt eine Orientierung.
Die schwarzen und weißen Punkte in Abbildung 3 stellen Verweise auf den nächsten Knoten im Uhrzeigersinn
oder gegen den Uhrzeigersinn entlang der Außenfläche jeder Komponente dar. Durch das Flippen und Verschmelzen kann es zur Vertauschung der Richtungen kommen, so dass man beim Traversieren den richtigen
Verweis auswählen muss.
Abbildung 3: (a) G̃ vor der Einbettung von {1, 4}, Knoten 2 und 6 sind extern aktiv. (b) Komponente mit
Wurzel 34 wurde geflippt, wobei die Orientierungen von 4, 5 und 6 unverändert sind. (c) {1, 4}
wurde eingefügt, Orientierungen angepasst.
5 Der Algorithmus
Algorithmus: BM-Planarity
2
Eingabe: Schlichter Graph G mit n ≥ 2 Knoten und m ≤ 3n − 5 Kanten
Ausgabe: PLANAR und eine Einbettung in G̃ oder
NONPLANAR und einen Kuratowski Untergraphen von G in G̃
BEGIN
DFS und lowpoint Berechnungen für G
Initialisiere G̃ ausgehend von G (inkl. seperatedDFSChildList)
FOR jeden Knoten v mit DFI = n bis 1 DO
FOR jedes DFS Kind c von v in G DO {v c , c} einbetten
FOR jede Rückkante {v, w} mit w ∈ G̃ DO Walkup(G̃, v, w)
FOR jedes DFS Kind c von v in G DO Walkdown(G̃, v c )
FOR jede Rückkante {v, w} mit w ∈ G̃ DO
IF {v c , w} ∈
/ G̃ THEN
IsolateKuratowskiSubgraph(G̃, G, v), return(NONPLANAR, G̃)
RecoverPlanarEmbedding(G̃), return(PLANAR, G̃)
END.
Die Methoden Walkup und Walkdown werden im Folgenden nur am Beispiel erläutert. Auf die Beschreibung der
Methoden IsolateKuratowskiSubgraph und RecoverPlanarEmbedding wird an dieser Stelle verzichtet. Der geneigte
Leser sei an dieser Stelle auf die Originalliteratur verwiesen [BM04].
6 Walkup und Walkdown
Definition. Der relevante Untergraph (pertinent subgraph) von v ist die Menge von Komponenten in G̃, die
durch Hinzufügen von Rückkanten verschmelzen.
Definition. Eine Komponente mit der Wurzel wc ist eine Kind-Komponente (child biconnected component)
von w. Ein Nachfahre w des aktuellen Knotens v ist relevant (pertinent), wenn G eine Rückkante {v, w} ∈
/ G̃
hat oder wenn w eine Kind-Komponente in G̃ hat, die einen relevanten Knoten enthält.
Definition. Eine relevante Komponente (pertinent biconnected component) enthält einen relevanten Knoten.
Eine extern aktive Komponente (externally active biconnected component) enthält einen extern aktiven Knoten.
Knoten und Komponenten sind intern aktiv (internally active), wenn sie relevant aber nicht extern aktiv sind.
Knoten und Komponenten sind inaktiv (inactive), wenn sie weder intern aktiv noch extern aktiv sind.
Die Methode Walkup ermittelt den relevanten Untergraphen zur Einbettung der Rückkanten. Es wird von jedem Knoten, der Teil einer einzubettenden Rückkante ist, eine Traversierung bis zum aktuellen Knoten gestartet. Dabei wird
parallel in beide Richtungen am Rand des Außenrandes nach der Wurzel der Komponente gesucht. Bereits besuchte
Knoten werden markiert, damit keine Komponenten doppelt traversiert werden müssen (siehe Abbildung 4).
Abbildung 4: Walkup am Beispiel. Walkup(G̃, v, w) started in w und sucht über beide Richtungen des Außenlandes nach der Wurzel der Komponente. c0 wird in pertinentRoots von c aufgenommen. In c
wird erneut Traversierung gestartet und v 0 gefunden. Walkup(G̃, v, y) started in y und r0 wird in
pertinentRoots von r aufgenommen. Stopp bei r, da schon besucht.
3
Die Methode Walkdown traversiert den durch den Walkup markierten relevanten Untergraphen vom aktuellen Knoten
ausgehend und bettet - sofern möglich - alle Rückkanten ein (siehe Abbildung 5). Dabei müssen die folgenden zwei
Regeln eingehalten werden, damit der Algorithmus korrekt arbeitet.
1. Regel Knoten v wird eingebettet und Knoten w angetroffen.
(a) Bette die Rückkante {v, w} ein, falls vorhanden.
(b) Besuche alle intern aktiven Kind-Komponenten.
(c) Besuche alle extern aktiven Kind-Komponenten.
2. Regel Es wird ein Pfad entlang des externen Landes gesucht.
(a) Wähle einen Pfad zu einem intern aktiven Knoten, falls vorhanden.
(b) Wähle einen Pfad zu einem relevanten Knoten, sonst.
Abbildung 5: Walkdown am Beispiel. (a) Kante {v 0 , w} wurde eingebettet. Wegen Regel 1 (Fall a) wurde w vor
r gewählt. Pfad über w ist nicht mehr möglich. (b) y wird gewählt, da z nicht relevant. Wegen
Wechsel von Uhrzeigersinn zu Gegenuhrzeigersinn muss r0 geflippt werden.
7 Zeitkomplexität und Korrektheit
Satz 3. Für einen Graphen G mit n Knoten entscheided der Algorithmus in O(n), ob G planar ist.
Beweis. Für die Tiefensuche und die Berechnung der Tiefpunkte wurden aus der Literatur bekannte lineare
Algorithmen verwendet. Zum Erkennen von extern aktiven Knoten und Komponenten werden die Tiefpunkte
und die seperatedDFSChildList verwendet. Dadurch kann in O(1) entschieden werden, ob ein Knoten extern
aktiv ist und welche die den Regeln des Walkdown’s entsprechende nächste zu besuchende Komponente ist.
Das Einbetten einer BFS-Baum Kante hat den Aufwand O(1) und in der Summe O(m). Wegen m ≤ 3n − 5
gilt O(m) = O(n). Die Kosten für jeden Walkup und Walkdown entsprechen der Kantenanzahl die das Land
umschließen, welches durch die entsprechende Rückkante gebildet wird. Da jedoch dabei jede Kante doppelt
gezählt wird, haben auch diese Methoden in der Summe einen Aufwand von O(n). Der Test am Ende der
Hauptschleife, benötigt zusätzlich O(1) pro Kante und damit O(n) in der Summe.
Korollar 4. Für einen planaren Graphen G mit n Knoten erzeugt der Algorithmus eine planare Einbettung
von G in O(n).
Satz 5. Sei B eine Komponente mit der Wurzel v c . Wenn eine Rückkante von v zu einem DFS-Nachfolger von
c durch Walkdown nicht eingebettet werden konnte, so ist der Graph nicht planar.
Korollar 6. Der Algorithmus bestimmt ob der Graph G planar ist.
8 Literaturverzeichnis
Literatur
[Aig84] M. Aigner. Graphentheorie - Eine Entwicklung aus dem 4-Farben Problem. Stuttgart, 1984.
[BM04] John M. Boyer and Wendy J. Myrvold. On the Cutting Edge: Simplified O(n) Planarity by Edge Addition,
pages 241–273. 2004.
4
Herunterladen