ADS: Algorithmen und Datenstrukturen 2 Traversierung Breiten

Werbung
Traversierung
Durchlaufen eines Graphen, bei dem jeder vom gewählten Startknoten
erreichbare Knoten (bzw. jede Kante) genau 1-mal aufgesucht wird. Jeweils
ADS: Algorithmen und Datenstrukturen 2
nächster besuchter Knoten hat mindestens einen Nachbarn in der zuvor
Teil 3
besuchten Knotenmenge.
Generische Lösungsmöglichkeit für Graphen
Prof. Peter F. Stadler & Sebastian Will
G
= (V , E ):
FOREACH v in V DO {markiere v als unbearbeitet};
B={s}; // Menge besuchter Knoten, anfangs = Startknoten s
markiere s als bearbeitet;
WHILE es gibt unbearbeiteten Knoten v'
mit (v,v') in E und v in B
{ B = B + {v'}; markiere v';}
Bioinformatik/IZBI
Institut für Informatik
& Interdisziplinäres Zentrum für Bioinformatik
Universität Leipzig
23. April 2014
Realisierungen unterscheiden sich bezüglich Verwaltung der noch
abzuarbeitenden Knotenmenge und Auswahl der jeweils nächsten Kante.
1 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
Breiten- und Tiefendurchlauf
ADS 2, V3
23. April 2014
2 / 16
Breitensuche (BFS)
Breitendurchlauf (Breadth First Search, BFS)
ausgehend von Startknoten werden zunächst alle direkt erreichbaren
Knoten bearbeitet,
n Schritten von u erreichbar ist, erst, wenn
n − 1 Schritten erreichbar sind.
gerichteter Graph G = (V , E ); Startknoten s; Q sei
danach die über mindestens zwei Kanten vom Startknoten
Bearbeite einen Knoten, der in
erreichbaren Knoten, dann die über drei Kanten usw.
alle Knoten abgearbeitet wurden, die in
es werden also erst die Nachbarn besucht, bevor zu den Kindern
gegangen wird.
FIFO-Warteschlange.
kann mit FIFO-Datenstruktur für noch zu bearbeitende Knoten
realisiert werden.
Tiefendurchlauf (Depth First Search, DFS)
ausgehend von Startknoten werden zunächst rekursiv alle Kinder
u werden der aktuelle Farbwert und der Vorgänger
p[u ], von dem aus u erreicht wurde, gespeichert.
p-Werte liefern nach Abarbeitung für zusammenhängende Graphen
zu jedem Knoten
einen Spannbaum.
(Nachfolger) bearbeitet; erst dann wird zu den (anderen) Nachbarn
gegangen.
kann mit Stack-Datenstruktur für noch zu bearbeitende Knoten
realisiert werden.
Verallgemeinerung der Traversierung von Bäumen.
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Breitensuche: Algorithmus
3 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
4 / 16
23. April 2014
6 / 16
23. April 2014
6 / 16
Breitensuche: Beispiel
BFS(G,s)
FOREACH v in V DO {farbe(v)=weiss; p[v]=null; }
farbe[s]=grau; INIT(Q); Q=ENQUEUE(Q,s);
WHILE NOT (EMPTY(Q)) DO
{
v=FRONT(Q);
FOREACH u in succ(v) DO
{
If farbe[u]=weiss THEN
{ farbe[u]=grau; p[u]=v; Q=ENQUEUE(Q,u);}
}
DEQUEUE(Q); farbe[v]=schwarz;
}
Startknoten
s=3
1
2
Q = []
4
3
5
6
Farben:
weiss=unbearbeitet, grau=in
P.F. Stadler & S. Will (Bioinf, Uni LE)
Bearbeitung,
ADS 2, V3
schwarz=bearbeitet
23. April 2014
Breitensuche: Beispiel
Startknoten
5 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
Breitensuche: Beispiel
s=3
Startknoten
1
s=3
1
2
2
Q = [3]
Q = [3, 1]
4
3
4
3
5
6
5
6
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
Breitensuche: Beispiel
Startknoten
Breitensuche: Beispiel
s=3
Startknoten
1
s=3
1
2
2
Q = [3, 1, 4]
Q = [3, 1, 4, 6]
4
3
4
3
5
6
5
6
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Breitensuche: Beispiel
Startknoten
6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
s=3
Startknoten
6 / 16
23. April 2014
6 / 16
23. April 2014
6 / 16
23. April 2014
6 / 16
s=3
1
2
2
Q = [1, 4, 6]
Q = [1, 4, 6, 2]
4
3
4
3
5
6
5
6
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Breitensuche: Beispiel
6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
Breitensuche: Beispiel
s=3
Startknoten
1
s=3
1
2
2
Q = [4, 6, 2]
Q = [4, 6, 2, 5]
4
3
4
3
5
6
5
6
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Breitensuche: Beispiel
Startknoten
23. April 2014
Breitensuche: Beispiel
1
Startknoten
ADS 2, V3
6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
Breitensuche: Beispiel
s=3
Startknoten
1
s=3
1
2
2
Q = []
Q = [6, 2, 5]
4
3
4
3
5
6
5
6
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
6 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
Tiefensuche (DFS)
Bearbeite einen Knoten
Tiefensuche: Algorithmus
v
erst dann, wenn alle seine Kinder bearbeitet
v liegt)
G = (V , E );
zu jedem Knoten v werden gespeichert: der aktuelle Farbwert
sind (auÿer wenn ein Kind auf dem Weg zu
gerichteter Graph
farbe[v],
die Zeitpunkte
in[v]
und
out[v],
zu denen der Knoten
im Rahmen der Tiefensuche erreicht bzw. verlassen wurde und der
Vorgänger
die
in-
p[v], von dem aus v erreicht wurde
out-Zeitpunkte ergeben eine Reihenfolge
bzw.
der Knoten
analog zur Vor- bzw. Nachordnung bei Bäumen.
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Tiefensuche: Beispiel
Startknoten
DFS(G){
FOR EACH v in V do { farbe[v]=weiss; p[v]=null; }
zeit=0
FOR EACH v in V do { IF farbe[v]=weiss THEN DFS-visit[v] }
}
DFS-visit(G,v){ // rekursiver Teil der Tiefensuche
farbe[v]=grau; zeit=zeit+1; in[v]=zeit;
FOR EACH u in succ(v) DO
{ IF farbe[u]=weiss THEN { p[u]=v; DFS-visit[u]; } }
farbe[v]=schwarz; zeit=zeit+1; out[v]=zeit;
}
7 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
Startknoten
1
in[v]
v
3
4
4
3
5
5
ADS 2, V3
23. April 2014
Tiefensuche: Beispiel
Startknoten
v
in[v]
1
2
out[v]
2
1
4
4
3
5
5
ADS 2, V3
23. April 2014
Tiefensuche: Beispiel
Startknoten
1
4
ADS 2, V3
s=3
1
v
in[v]
1
2
2
3
3
1
out[v]
2
4
4
4
3
v
in[v]
1
2
2
3
3
1
out[v]
4
4
5
6
6
6
P.F. Stadler & S. Will (Bioinf, Uni LE)
3
3
6
5
5
2
out[v]
Tiefensuche: Beispiel
s=3
3
2
9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
1
4
in[v]
1
6
6
P.F. Stadler & S. Will (Bioinf, Uni LE)
v
5
6
2
9 / 16
1
3
Startknoten
23. April 2014
s=3
2
5
ADS 2, V3
Tiefensuche: Beispiel
s=3
3
9 / 16
6
9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
1
4
23. April 2014
6
6
2
1
4
5
6
Startknoten
9 / 16
out[v]
2
3
P.F. Stadler & S. Will (Bioinf, Uni LE)
in[v]
1
2
2
5
23. April 2014
s=3
out[v]
1
3
8 / 16
1
v
4
23. April 2014
Tiefensuche: Beispiel
s=3
2
ADS 2, V3
5
ADS 2, V3
23. April 2014
5
6
9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
Tiefensuche: Beispiel
Startknoten
Tiefensuche: Beispiel
s=3
Startknoten
s=3
1
2
4
3
1
v
in[v]
1
2
2
3
3
1
out[v]
2
4
4
4
3
5
6
5
5
ADS 2, V3
23. April 2014
3
Startknoten
1
4
5
6
ADS 2, V3
23. April 2014
9 / 16
23. April 2014
9 / 16
s=3
1
v
in[v]
out[v]
1
2
7
2
3
4
3
1
4
8
6
2
4
5
3
6
6
5
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Tiefensuche: Beispiel
Startknoten
4
3
9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
5
5
3
6
1
4
7
2
Tiefensuche: Beispiel
s=3
2
out[v]
2
6
6
Tiefensuche: Beispiel
Startknoten
in[v]
1
5
5
6
P.F. Stadler & S. Will (Bioinf, Uni LE)
v
v
in[v]
out[v]
1
2
7
2
3
4
3
1
4
8
5
9
6
5
6
6
9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
Bäume aus Breiten- und Tiefensuche
s=3
1
1
1
1
2
4
5
3
v
in[v]
out[v]
1
2
7
2
3
4
3
1
12
4
8
11
5
9
10
6
5
6
2
4
3
5
6
Graph
6
P.F. Stadler & S. Will (Bioinf, Uni LE)
2
ADS 2, V3
23. April 2014
Starke Zusammenhangskomponenten
G = (V , E ) heiÿt
stark zusammenhängend, wenn für alle u , v ∈ V
Es gibt einen Pfad von u nach v .
G
9 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
2
4
3
4
5
6
5
3
6
BFS-Baum
DFS-Baum
ADS 2, V3
23. April 2014
Starke Zusammenhangskomponenten
G = (V , E ) heiÿt
stark zusammenhängend, wenn für alle u , v ∈ V
Es gibt einen Pfad von u nach v .
Ein gerichteter Graph
Ein gerichteter Graph
gilt:
gilt:
1
Eine
starke Zusammenhangskomponente von G
G.
1
Eine
2
ist ein maximaler stark zusammenhängender
Teilgraph von
starke Zusammenhangskomponente von G
4
3
5
6
Teilgraph von
G.
Jeder Knoten eines Graphen ist in genau einer starken
Zusammenhangskomponente enthalten. Wieso?
Zusammenhangskomponente enthalten. Wieso?
ADS 2, V3
2
ist ein maximaler stark zusammenhängender
Jeder Knoten eines Graphen ist in genau einer starken
P.F. Stadler & S. Will (Bioinf, Uni LE)
10 / 16
23. April 2014
11 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
4
3
5
6
23. April 2014
11 / 16
gegenseitige Erreichbarkeit = Äquivalenzrelation
Sei
G
= (V , E )
Starke Zus.hang-Komponenten durch Tiefensuche
u , v ∈ V gegenseitig
u ∼ v . Die so denierte Relation ∼ auf V ist eine
ein gerichteter Graph. Sind Knoten
erreichbar, schreiben wir
Äquivalenzrelation also
Die Knotenmengen der starken Zusammenhangskomponenten von
G
∼.
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Algorithmus von Tarjan (1972)
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Tarjan: Beispiel
werden dann gleich ausgegeben und nicht mehr weiter betrachtet
sind
(denn jeder Knoten ist in nur einer Komponente).
12 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
2
3
23. April 2014
13 / 16
v
in[v]
l[v]
1
1
1
2
2
2
3
3
3
4
4
2
5
5
23. April 2014
15 / 16
23. April 2014
15 / 16
23. April 2014
15 / 16
4
5
14 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
1
v
in[v]
l[v]
1
1
1
v
in[v]
l[v]
1
1
2
2
1
2
2
2
3
2
3
3
3
3
3
4
4
2
4
4
2
5
5
5
5
5
2
3
4
5
5
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Tarjan: Beispiel
15 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
Tarjan: Beispiel
1
1
v
in[v]
l[v]
1
1
1
v
in[v]
l[v]
1
1
2
2
1
2
2
2
3
2
3
3
3
3
3
4
4
2
4
4
2
5
5
5
5
5
5
2
3
Zshk: 5
4
5
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
1
4
4
l[v] = frühester Knoten, der
in[] gegebenen Reihenfolge.
v abgearbeitet sind und l[v]=in[v], ist v
erreichbar ist in der durch
Tarjan: Beispiel
1
3
aus.
Tarjan: Beispiel
Tarjan-visit(G,v){
farbe[v]=grau; zeit=zeit+1; in[v]=zeit; l[v]=zeit;
PUSH(S,v)
FOR EACH u in succ(v) DO {
IF farbe[u]=weiss THEN
{ Tarjan-visit[u]; l[v]=min(l[v],l[u]) ;}
ELSEIF u in S THEN l[v]=min(l[v],in[u]);
}
IF (l[v]=in[v]) {
Ausgabe("starke ZshK":)
DO { u=TOP(S); Ausgabe(u); POP(S); }
UNTIL u=v;
}
farbe[v]=schwarz; zeit=zeit+1;
}
2
G
berechne dabei
die Wurzel einer starken Zusammenhangskomponente. Deren Knoten
reexiv
3
v
v
Wenn alle Kindsknoten von
transitiv und
2
Für jeden Knoten
von
symmetrisch
die Äquivalenzklassen von
Führe Tiefensuche (DFS) auf
Zshk: 5
5
ADS 2, V3
23. April 2014
15 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
Tarjan: Beispiel
Tarjan: Beispiel
1
2
3
4
1
v
in[v]
l[v]
1
1
1
v
in[v]
l[v]
1
1
2
2
1
2
2
2
3
2
3
2
3
3
2
4
4
2
4
4
2
5
5
5
5
5
5
2
3
Zshk: 5
Zshk: 5
4
Zshk: 2,3,4
5
5
P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
23. April 2014
Tarjan: Beispiel
15 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
Komponentengraph
ADS 2, V3
G
23. April 2014
15 / 16
∗
Fasse alle Knoten jeweils einer starken Zusammenhangskomponente zu
einem einzigen Knoten zusammen. Kante von Komponente
1
Komponente
2
3
v
in[v]
l[v]
1
1
1
2
2
2
3
3
2
4
4
2
5
5
5
G
gibt, so daÿ
A nach
(u , v )
2
4
3
5
6
Zshk: 2,3,4
Zshk: 1
5
Graph
G
Komponentengraph
Erlaubt z.B. schnellere Berechnung der transitiven Hülle von
P.F. Stadler & S. Will (Bioinf, Uni LE)
eine Kante in
1
Zshk: 5
4
ist.
B , wenn es u ∈ A und v ∈ B
ADS 2, V3
23. April 2014
15 / 16 P.F. Stadler & S. Will (Bioinf, Uni LE)
ADS 2, V3
G.
G∗
23. April 2014
16 / 16
Herunterladen