bei Knoten

Werbung
Informatik II - SS 2016
(Algorithmen & Datenstrukturen)
Vorlesung 14 (10.6.2016)
Graphenalgorithmen II
Fabian Kuhn
Algorithmen und Komplexität
Fabian Kuhn
Informatik II, SS 2016
Repräsentation von Graphen
Beispiele aus [CLRS]:
Fabian Kuhn
Informatik II, SS 2016
2
Graph-Traversierung
Graph-Traversierung (Graph-Exploration) informell
• Gegeben ein Graph ๐บ = ๐‘‰, ๐ธ und ein Knoten ๐‘  ∈ ๐‘‰, besuche
“systematisch” alle Knoten, welche von ๐‘  aus erreichbar sind.
• Das haben wir bereits bei den Binärbäumen gesehen
• Wie bei den Bäumen gibt es zwei grundsätzliche Verfahren
• Breitensuche (BFS = breadth first search)
– zuerst “in die Breite” (nähere Knoten zu ๐‘  zuerst)
• Tiefensuche (DFS = depth first search)
– zuerst “in die Tiefe” (besuche alles, was an einem Knoten ๐‘ข “dranhängt”,
bevor der nächste Nachbar von ๐‘ข besucht wird)
• Graph-Traversierung ist wichtig, da es oft als Subroutine auftaucht
– z.B., um die Zusammenhangskomponenten eines Graphen zu finden
– Wir werden einige Beispiele sehen…
Fabian Kuhn
Informatik II, SS 2016
3
BFS Traversierung / BFS Baum: Pseudocode
• Wir merken uns zusätzlich die Distanz zu ๐‘  im Baum
BFS-Tree(s):
Q = new Queue();
for all u in V: u.marked = false;
s.marked = true;
s.parent = NULL;
s.d = 0
Q.enqueue(s)
while not Q.empty() do
u = Q.dequeue()
visit(u)
for v in u.neighbors do
if not v.marked then
v.marked = true;
v.parent = u;
v.d = u.d + 1;
Q.enqueue(v)
Fabian Kuhn
Informatik II, SS 2016
4
Analyse Breitensuche
In der Folge benennen wir die Knoten folgendermaßen
• weiße Knoten: Knoten, welche der Alg. noch nicht gesehen hat
• graue Knoten: markierte Knoten
– Knoten werden grau, wenn sie in die Warteschlange eingefügt werden
– Knoten sind grau, solange sie in der Warteschlange sind
• schwarze Knoten: besuchte Knoten
– Knoten werden schwarz, wenn sie aus der Warteschlange genommen
werden
Fabian Kuhn
Informatik II, SS 2016
5
Analyse Breitensuche
Im BFS-Baum eines ungewichteten Graphen ist die Distanz von
jedem Knoten ๐’– zur Wurzel ๐’” gleich ๐’…๐‘ฎ ๐’”, ๐’– .
• Baumdistanz zur Wurzel: ๐‘‘ ๐‘‡ ๐‘ , ๐‘ข = ๐‘ข. ๐‘‘
• Wir müssen also zeigen, dass ๐‘ข. ๐‘‘ = ๐‘‘๐บ ๐‘ , ๐‘ข
• Wir zeigen zuerst, dass ๐’–. ๐’… ≥ ๐’…๐‘ฎ ๐’”, ๐’–
Lemma: Annahme: Während BFS-Traversal ist Zustand der Queue
๐‘„ = ๐‘ฃ1 , ๐‘ฃ2 , … , ๐‘ฃ๐‘Ÿ ๐‘ฃ1 : head, ๐‘ฃ๐‘Ÿ : tail
Dann gilt ๐‘ฃ๐‘Ÿ . ๐‘‘ ≤ ๐‘ฃ1 . ๐‘‘ + 1 und ๐‘ฃ๐‘– . ๐‘‘ ≤ ๐‘ฃ๐‘–+1 . ๐‘‘ (für ๐‘– = 1, … , ๐‘Ÿ − 1)
Fabian Kuhn
Informatik II, SS 2016
6
Analyse Breitensuche
Im BFS-Baum eines ungewichteten Graphen ist die Distanz von
jedem Knoten ๐’– zur Wurzel ๐’” gleich ๐’…๐‘ฎ ๐’”, ๐’– .
• Widerspruchsbeweis:
– Annahme: ๐‘ฃ ist Knoten mit kleinstem ๐‘‘๐บ (๐‘ , ๐‘ฃ), für welchen ๐’—. ๐’… > ๐’…๐‘ฎ (๐’”, ๐’—)
๐’—. ๐’… > ๐‘‘๐บ ๐‘ , ๐‘ฃ = ๐‘‘๐บ ๐‘ , ๐‘ข + 1 = ๐’–. ๐’… + ๐Ÿ
๐‘ 
Betrachte dequeue von ๐’–:
• ๐‘ฃ wird als ein Nachbar von ๐‘ข betrachtet
• ๐‘ฃ ist weiss โŸน ๐‘ฃ. ๐‘‘ = ๐‘ข. ๐‘‘ + 1
• ๐‘ฃ ist schwarz โŸน ๐‘ฃ. ๐‘‘ ≤ ๐‘ข. ๐‘‘
๐‘ข ๐‘ข. ๐‘‘ = ๐‘‘๐บ ๐‘ , ๐‘ข
• ๐‘ฃ is grau โŸน ๐‘ฃ ist in der Warteschlange
Lemma: ๐‘ฃ. ๐‘‘ ≤ ๐‘ข. ๐‘‘ + 1
๐‘ฃ ๐‘‘๐บ ๐‘ , ๐‘ฃ = ๐‘‘๐บ ๐‘ , ๐‘ข + 1
Fabian Kuhn
Informatik II, SS 2016
7
Tiefensuche in allgemeinen Graphen
Grundidee Tiefensuche in ๐‘ฎ (Start bei Knoten ๐’” ∈ ๐‘ฝ)
• Markiere Knoten ๐’— (am Anfang ist ๐‘ฃ = ๐‘ )
• Besuche die Nachbarn von ๐‘ฃ der Reihe nach rekursiv
• Nachdem alle Nachbarn besucht sind, besuche ๐’”
• rekursiv: Beim Besuchen der Nachbarn werden deren Nachbarn
besucht, und dabei deren Nachbarn, etc.
• Zyklen in G: Besuche jeweils nur Knoten, welche noch nicht
markiert sind
• entspricht der Postorder-Traversierung in Bäumen
• Fall man gleich beim Markieren den Knoten besucht, entspricht es
der Preorder-Traversierung
Fabian Kuhn
Informatik II, SS 2016
8
Tiefensuche: Pseusocode
DFS-Traversal(s):
for all u in V: u.color = white;
DFS-visit(s, NULL)
DFS-visit(u, p):
u.color = gray;
u.parent = p;
for all v in u.neighbors do
if v.color = white
DFS-visit(v, u)
visit node u;
u.color = black;
Fabian Kuhn
Informatik II, SS 2016
9
Tiefensuche: Beispiel
1
2
3
4
5
7
8
Fabian Kuhn
6
Informatik II, SS 2016
10
Tiefensuche: Analyse
In der gleichen Art wie bei der Breitensuche, kann man auch bei der
Tiefensuche einen Spannbaum konstruieren
• Die Eigenschaften dieses DFS-Baums werden wir noch anschauen
Die Laufzeit der Tiefensuche (DFS-Traversierung) ist ๐‘ถ ๐’ + ๐’Ž .
• Wir färben die Knoten weiß, grau und schwarz wie vorher
– nicht markiert = weiß, markiert = grau, besucht = schwarz
Fabian Kuhn
Informatik II, SS 2016
11
Zusammenhangskomponenten
• Die Zusammenhangskomponenten (oder einfach Komponenten)
eines Graphen sind seine zusammenhängenden Teile.
1
9
2
8
4
5
3
14
12
10
11
7
6
13
Ziel: Finde alle Komponenten eines Graphen.
for u in V do
if not u.marked then
start new component
explore with DFS/BFS starting at u
• Die Zusammenhangskomponenten eines Graphen können in
๐‘‚ ๐‘› + ๐‘š Zeit identifiziert werden. (mit Hilfe von DFS oder BFS)
Fabian Kuhn
Informatik II, SS 2016
12
DFS- “Klammer”-Theorem
Wir definieren für jeden Knoten ๐‘ฃ die folgenden zwei Zeitpunkte
• ๐‘ก๐‘ฃ,1 : Zeitpunkt, wenn ๐‘ฃ in der DFS-Suche grau gefärbt wird
• ๐‘ก๐‘ฃ,2 : Zeitpunkt, wenn ๐‘ฃ in der DFS-Suche schwarz gefärbt wird
Theorem: Im DFS-Baum ist ein Knoten ๐‘ฃ genau dann im Teilbaum
eines Knoten ๐‘ข, falls das Intervall ๐‘ก๐‘ฃ,1 , ๐‘ก๐‘ฃ,2 vollständig im Intervall
๐‘ก๐‘ข,1 , ๐‘ก๐‘ข,2 enthalten ist. Zudem sind zwei Intervalle entweder
disjunkt, oder das eine ist komplett im anderen enthalten.
Beispiel:
1
2
3
4
5
7
Fabian Kuhn
Informatik II, SS 2016
13
DFS- “Klammer”-Theorem
Theorem: Im DFS-Baum ist ein Knoten ๐‘ฃ ist genau dann im Teilbaum
eines Knoten ๐‘ข, falls das Intervall ๐‘ก๐‘ฃ,1 , ๐‘ก๐‘ฃ,2 vollständig im Intervall
๐‘ก๐‘ข,1 , ๐‘ก๐‘ข,2 enthalten ist. Zudem sind zwei Intervalle entweder
disjunkt, oder das eine ist komplett im anderen enthalten.
Beweis:
Fabian Kuhn
Informatik II, SS 2016
14
DFS- “Klammer”-Theorem
Theorem: Im DFS-Baum ist ein Knoten ๐‘ฃ ist genau dann im Teilbaum
eines Knoten ๐‘ข, falls das Intervall ๐‘ก๐‘ฃ,1 , ๐‘ก๐‘ฃ,2 vollständig im Intervall
๐‘ก๐‘ข,1 , ๐‘ก๐‘ข,2 enthalten ist. Zudem sind zwei Intervalle entweder
disjunkt, oder das eine ist komplett im anderen enthalten.
Beweis:
Fabian Kuhn
Informatik II, SS 2016
15
DFS- “Klammer”-Theorem
Theorem: Im DFS-Baum ist ein Knoten ๐‘ฃ ist genau dann im Teilbaum
eines Knoten ๐‘ข, falls das Intervall ๐‘ก๐‘ฃ,1 , ๐‘ก๐‘ฃ,2 vollständig im Intervall
๐‘ก๐‘ข,1 , ๐‘ก๐‘ข,2 enthalten ist.
Implikationen
• Zwei Intervalle sind entweder disjunkt, oder das eine ist komplett
im anderen enthalten.
• Ein weisser Knoten ๐‘ฃ, welcher in der rekursiven Suche von ๐‘ข
entdeckt wird, wird schwarz, bevor die Rekursion zu ๐‘ข zurückkehrt.
• Wieso “Klammer”-Theorem:
Wenn man bei jedem ๐‘ก๐‘ฃ,1 eine öffnende Klammer und bei jedem
๐‘ก๐‘ฃ,2 eine schließende Klammer hinschreibt, bekommt man ein
Klammerausdruck, welcher korrekt geschachtelt ist.
Fabian Kuhn
Informatik II, SS 2016
16
Weiße Pfade
Theorem: In einem DFS-Baum ist ein Knoten ๐‘ฃ genau dann im
Teilbaum eines Knoten ๐‘ข, falls unmittelbar vor dem Markieren von ๐‘ข,
ein komplett weißer Pfad von ๐‘ข nach ๐‘ฃ besteht.
Beweis:
Fabian Kuhn
Informatik II, SS 2016
17
Klassifizierung der Kanten (bei DFS-Suche)
Baumkanten:
• (๐‘ข, ๐‘ฃ) ist eine Baumkante, falls
๐‘ฃ von ๐‘ข aus entdeckt wird
2
8
1
Rückwärtskanten:
• ๐‘ข, ๐‘ฃ ist eine Rückwärtskante, falls
๐‘ฃ ein Vorgängerknoten von ๐‘ข ist
Vorwärtskanten:
• ๐‘ข, ๐‘ฃ ist eine Vorwärtskante, falls
๐‘ฃ ein Nachfolgerknoten von ๐‘ข ist
Querkanten:
• Alle übrigen Kanten
Fabian Kuhn
7
3
9
4
5
6
Informatik II, SS 2016
18
Klassifizierung der Kanten (bei DFS-Suche)
Baumkante (๐’–, ๐’—):
Rückwärtskante (๐’–, ๐’—):
Vorwärtskante (๐’–, ๐’—):
Querkante (๐’–, ๐’—):
Fabian Kuhn
Informatik II, SS 2016
19
DFS – Ungerichtete Graphen
Theorem: Bei einer DFS-Suche in ungerichteten Graphen ist jede
Kante entweder eine Baumkante oder eine Rückwärtskante.
Fabian Kuhn
Informatik II, SS 2016
20
DFS – Gerichtete Graphen
Theorem: Ein gerichteter Graph hat genau dann keine Zyklen, falls es
bei der DFS-Suche keine Rückwärtskanten gibt.
Fabian Kuhn
Informatik II, SS 2016
21
Anwendung: Topologische Sortierung
Zyklenfreie, gerichtete Graphen:
• DAG: directed acyclic graph
• Modellieren z.B. zeitliche Abhängigkeiten von Aufgaben
• Beispiel: Anziehen von Kleidungsstücken
Unterhemd
Pullover
Mantel
Unterhose
Hose
Schuhe
Brille
Socken
Topologische Sortierung:
• Sortiere die Knoten eines DAGs so, dass ๐‘ข vor ๐‘ฃ erscheint, falls ein
gerichteter Pfad von ๐‘ข nach ๐‘ฃ existiert
• Im Beispiel: Finde eine mögliche Anziehreihenfolge
Fabian Kuhn
Informatik II, SS 2016
22
Topologische Sortierung: Etwas formaler…
Zyklenfreie, gerichtete Graphen:
• repräsentieren partielle Ordnungsrelationen
– asymmetrisch:
๐‘Ž<๐‘ โŸน ¬ ๐‘<๐‘Ž
transitiv:
๐‘Ž<๐‘ ∧ ๐‘<๐‘ โŸน ๐‘Ž<๐‘
– partielle Ordnung: nicht alle Paare müssen vergleichbar sein
• Beispiel: Teilmengenrelation bei Mengen
Topologische Sortierung:
• Sortiere die Knoten eines DAGs so, dass ๐‘ข vor ๐‘ฃ erscheint, falls ein
gerichteter Pfad von ๐‘ข nach ๐‘ฃ existiert
• Erweitere eine partielle Ordnung zu einer totalen Ordnung
Fabian Kuhn
Informatik II, SS 2016
23
Topologische Sortierung: Algorithmus
Führe DFS aus…
2
1
3
7
6
11
5
4
8
12
9
13
10
14
Beobachtung:
• Knoten ohne Nachfolger werden als erstes besucht (schwarz gef.)
• Besuchreihenfolge ist umgekehrte topologische Sortierung
Fabian Kuhn
Informatik II, SS 2016
24
Topologische Sortierung: Algorithmus
Theorem: Umgekehrte “Visit”-Reihenfolge (schwarz färben) der
Knoten bei DFS-Traversierung ergibt topologische Sortierung
Fabian Kuhn
Informatik II, SS 2016
25
Herunterladen