IFT 436 - Algorithmes et structures de données Algorithmes de base

publicité
Parcours des graphes
IFT 436 - Algorithmes et structures de données
Algorithmes de base sur les Graphes
Rachid Kadouche
Université de Sherbrooke
18 juillet 2013
1
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Algo BFS
Soit G = (S, A) et une racine s ∈ S.
BFS trouve tous les sommets atteignable à partir de s.
Calcule la distance entre s et les sommets.
Produit un Breadth-First-Tree (BFT) de racine s.
Algo fonctionne pour les graphes orienté et non-orienté.
2
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
BFS : détails
Assume que nous utilisons une liste d’adjacence
Maintient 4 structures de données
color[u] : la couleur du sommet u ∈ S.
π[u] : le prédécesseur de u.
d[u] : la distance entre s et u.
Q : une liste FIFO pour gérer les sommets gris.
3
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
BFS - Pseudo
Algorithme : BFS(G, s)
1
2
3
4
5
6
7
8
9
10
11
4
foreach u ∈ S − {s} do
color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
Q ← ∅ ; Enqueue(Q,s);
while Q 6= ∅ do
u ← Dequeue(Q);
foreach v ∈ Adj[u] do
if color[v] = Blanc then
color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
Enqueue(Q,v);
color[u] ← Noir;
Parcours des graphes
Exemple BFS
5
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Breadth-First Tree
BFS produit un arbre représenté par π.
Soit G = (S, A) de racine s, on définit le graphe des
prédécesseurs de G, Gπ (Sπ , Aπ ), par :
Sπ = {v ∈ S : π[v ] 6= NIL} ∪ {s}
Aπ = {(π[v ], v ) ∈ A : v ∈ Sπ − {s}}
Notez que le chemin de s vers v dans Gπ est le plus court
chemin de s vers v dans G .
6
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Analyse de l’algorithme BFS
Algorithme : BFS(G, s)
1
2
3
4
5
6
7
8
9
10
11
7
foreach u ∈ S − {s} do
color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
Q ← ∅ ; Enqueue(Q,s);
while Q 6= ∅ do
u ← Dequeue(Q);
foreach v ∈ Adj[u] do
if color[v] = Blanc then
color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
Enqueue(Q,v);
color[u] ← Noir;
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Analyse de l’algorithme BFS
Algorithme : BFS(G, s)
1
2
3
4
5
6
7
8
9
10
11
foreach u ∈ S − {s} do
color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
Q ← ∅ ; Enqueue(Q,s);
while Q 6= ∅ do
u ← Dequeue(Q);
foreach v ∈ Adj[u] do
if color[v] = Blanc then
color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
Enqueue(Q,v);
color[u] ← Noir;
T (A, S) dépend de TBFSligne:5−11 (A, S)
8
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Analyse de l’algorithme BFS
Algorithme : BFS(G, s)
1
2
3
4
5
6
7
8
9
10
11
foreach u ∈ S − {s} do
color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
Q ← ∅ ; Enqueue(Q,s);
while Q 6= ∅ do
u ← Dequeue(Q);
foreach v ∈ Adj[u] do
if color[v] = Blanc then
color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
Enqueue(Q,v);
color[u] ← Noir;
T (A, S) dépend de TBFSligne:5−11 (A, S)
X
|Adj[v ]| = O(A)
TBFSligne:5−11 (A, S) =
v ∈S
9
pour tous les sommets v atteignables à partir de s.
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Analyse de l’algorithme BFS
Algorithme : BFS(G, s)
1
2
3
4
5
6
7
8
9
10
11
10
foreach u ∈ S − {s} do
color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
Q ← ∅ ; Enqueue(Q,s);
while Q 6= ∅ do
u ← Dequeue(Q);
foreach v ∈ Adj[u] do
if color[v] = Blanc then
color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
Enqueue(Q,v);
color[u] ← Noir;
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Analyse de l’algorithme BFS
Algorithme : BFS(G, s)
1
2
3
4
5
6
7
8
9
10
11
foreach u ∈ S − {s} do
color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
Q ← ∅ ; Enqueue(Q,s);
while Q 6= ∅ do
u ← Dequeue(Q);
foreach v ∈ Adj[u] do
if color[v] = Blanc then
color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
Enqueue(Q,v);
color[u] ← Noir;
T (A, S) = O(S + A)
11
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
DFS : détails
Entrée : G(S,A), orienté ou non. (pas de racine)
Sortie :
2 timestamps pour chaque noeud :
d[v ] : début
f [v ] : fin
π[v ] le prédécesseur de v
On colore les sommets :
Blanc : non découvert
Gris découvert mais pas encore exploré toutes les arêtes.
Noir : terminé.
12
Parcours des graphes
DFS - Pseudo
Algorithme : DFS(G)
1 foreach u ∈ S do
2
color[u] ← Blanc;
3
π[u] ← NIL ;
4 time ← 0;
5 foreach u ∈ S do
6
if color[u] = Blanc then
7
DFS-Visit(u)
Algorithme : DFS-Visit(u)
1
2
3
4
5
6
7
color[u] ← Gris;
time ← time + 1;
d[u] ← time;
foreach v ∈ Adj[u] do
if color[v] = Blanc then
π[v ] ← u;
DFS-Visit(v);
8 color[u] ← Noir;
9 time ← time +1;
10 f[u] ← time;
13
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Parcours des graphes
Exemple DFS
14
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Parcours des graphes
Exemple DFS
15
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Forêt des prédécesseurs
DFS produit une forêt représenté par π
Soit G = (S, A) de racine s, on définit la forêt des
prédécesseurs de G, Gπ (S, Aπ ), par :
Aπ = {(π[v ], v ) : v ∈ S ∧ π[v ] 6= NIL}
Le sous-graphe des prédécesseurs (SGP) d’une DFS forme
une “depth-first forest” composé de plusieurs “depth-first
tree”
16
Parcours des graphes
Analyse de l’algorithme DFS
Algorithme : DFS(G)
1 foreach u ∈ S do
2
color[u] ← Blanc;
3
π[u] ← NIL ;
4 time ← 0;
5 foreach u ∈ S do
6
if color[u] = Blanc then
7
DFS-Visit(u)
Algorithme : DFS-Visit(u)
1
2
3
4
5
6
7
color[u] ← Gris;
time ← time + 1;
d[u] ← time;
foreach v ∈ Adj[u] do
if color[v] = Blanc then
π[v ] ← u;
DFS-Visit(v);
8 color[u] ← Noir;
9 time ← time +1;
10 f[u] ← time;
17
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Parcours des graphes
Analyse de l’algorithme DFS
18
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Analyse de l’algorithme DFS
T (A, S) = Θ(S) + TDFSligne:5−7 (A, S)
19
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Analyse de l’algorithme DFS
T (A, S) = Θ(S) + TDFSligne:5−7 (A, S)
TDFS−Visit (v ) = |Adj[v ]|
TDFSligne:5−7 (A, S) =
X
v ∈S
20
|Adj[v ]| = Θ(A)
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Analyse de l’algorithme DFS
T (A, S) = Θ(S) + TDFSligne:5−7 (A, S)
TDFS−Visit (v ) = |Adj[v ]|
TDFSligne:5−7 (A, S) =
X
v ∈S
T (A, S) = Θ(S + A)
21
|Adj[v ]| = Θ(A)
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
DFS : Structure en parenthèse
22
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Théorème des parenthèses
Pour un DFS sur G = (S, A) et 2 sommets u et v , seule une
des 3 conditions suivantes est valide :
1
l’intervalle [d[u], f [u]] et [d[v ], f [v ]] sont disjoints et ni u
ni v est un descendant de l’autre dans la DFF
(Depth-First Forest)
2
[d[u], f [u]] est contenu dans [d[v ], f [v ]] et u est un
descendant de v .
3
L’inverse du point 2.
Corolaire : v est un descendant de u dans la DFF ssi
d[u] < d[v ] < f [v ] < f [u]
23
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Tri-Topologique
Opération fondamentale d’un graphe orienté acyclique
(DAG).
Produit un ordonnancement linéaire de tous les noeuds de
G tel que pour une arêtes (u, v ) u apparaı̂t avant v .
Utile dans des application qui veulent représenter la
précédence des événements.
Ses somets sont ordonnés de gauche à droite par ordre
décroissant des dates de fin de traitement
Tous les arcs sont orientés de gauche à droite
24
Parcours des graphes
Parcours en largeur (BFS)
Parcours en profondeur (DFS)
Tri-Topologique
Tri-Topologique (Comment le savant Cosinus s’habille le
matin )
25
Téléchargement