• Aucun résultat trouvé

Structures de donnees elementaires

5.3 Fermeture transitive

1

2 3

4

7 8

6 5

1

2 3

4

7 8

6 5

Figure 5.4 : Un graphe et sa fermeture transitive

Dans cet algorithme, les procedures Multiplier(n, u, v, w) etAjouter(n, u, v, w) sont respectivement des procedures qui multiplient et ajoutent les deux matrices nn uetvpour obtenir la matricew.

Remarques

1. L'algorithme utilise le fait, facile a demontrer, que l'existence d'un chemin d'ori-ginexet d'extremiteyimplique celle d'un tel chemin ayant une longueur inferieure au nombre total de sommets du graphe.

2. Le nombre d'operations eectuees par l'algorithme est de l'ordre den4 car le pro-duit de deux matrices carreesnndemanden3operations et l'on peut ^etre amene a eectuer n produits de matrices. La recherche du meilleur algorithme possible pour le calcul du produit de deux matrices a ete tres intense ces dernieres annees et plusieurs ameliorations de l'algorithme elementaire demandant n3 multiplica-tions ont ete successivement trouvees, et il est rare qu'une annee se passe sans que quelqu'un n'ameliore la borne. Coppersmith et Winograd ont ainsi propose un algorithme en O(n2:5); mais ceci est un resultat de nature theorique car la programmation de l'algorithme de Coppersmith et Winograd est loin d'^etre aisee et l'ecacite esperee n'est atteinte que pour des valeurs tres grandes den. Il est donc necessaire de construire d'autres algorithmes, faisant intervenir des notions dierentes.

3. Cet algorithme construit une matrice (notee ici u) qui peut ^etre utilisee chaque fois que l'on veut tester s'il existe un chemin entre deux sommets (xi et yi). Dans le cas ou on se limite a la recherche de l'existence d'un chemin entre deux sommets donnes (et si ceci ne sera fait qu'une seule fois) on peut ne calculer qu'une ligne de la matrice, ce qui diminue notablement la complexite.

5.3 Fermeture transitive

La fermeture transitive d'un graphe G = (X;A) est la relation transitive minimale contenant la relation (X;A), il s'agit d'un graphe G = (X;) tel que (x;y) 2 si et seulement s' il existe un chemin f dans Gd'originex et d'extremitey.

Le calcul de la fermeture transitive permet de repondre aux questions concernant l'existence de chemins entre x ety dans G et ceci pour tout couple de sommetsx;y. Ce calcul complet n'est pas vraiment utile s'il s'agit de repondre un petit nombre de fois a des questions sur l'existence de chemins entre des couples de sommets, on

y1

z1

x

z2

z3

y2

y1

z1

x

z2

z3

y2

Figure 5.5 : L'eet de l'operation x: les arcs ajoutes sont en pointille

utilise alors des algorithmes qui seront decrits dans les paragraphes suivants. Par contre lorsque l'on s'attend a avoir a repondre de nombreuses fois a ce type de question il est preferable de calculer au prealable (X;), la reponse a chaque question est alors immediate par simple consultation d'un des ccients de la matrice d'adjacence de G. On dit que l'on eectue un pretraitement, operation courante en programmation dans maintes applications, ainsi le tri des elements d'un chier peut aussi ^etre considere comme un pretraitement en vue d'une serie de consultations du chier, le temps mis pour trier le chier est recupere ensuite dans la rapidite de la consultation. Le calcul de la fermeture transitive d'un graphe se revele tres utile par exemple, dans certains compilateurs-optimiseurs: un graphe est associe a chaque procedure d'un programme, les sommets de ce graphe representent les variables de la procedure et un arc entre la variableaet la variablebindique qu'une instruction de calcul deafait appara^trebdans son membre droit. On l'appelle souvent graphe de dependance. La fermeture transitive de ce graphe donne ainsi toutes les variables necessaires directement ou indirectement au calcul de a; cette information est utile lorsque l'on veut minimiser la quantite de calculs a eectuer en machine pour l'execution du programme.

Le calcul de (X;) s'eectue par iteration de l'operation de base x(A) qui ajoute a A les arcs (y;z) tels quey est un predecesseur de x et z un de ses successeurs. Plus formellement on pose :

x(A) =A[f(y;z) j(y;x);(x;z) 2Ag Cette operation satisfait les deux proprietes suivantes:

Proposition 1

Pour tout sommet x on a

x(x(A)) = x(A) et pour tout couple de sommets (x;y) :

x(y(A)) = y(x(A))

Preuve

La premiere partie est tres simple, on l'obtient en remarquant que (u;x) 2 x(A) implique (u;x)2A et que (x;v)2x(A) implique (x;v)2A .

Pour la seconde partie, il sut de verier que si (u;v) appartient a x(y(A)) il appartient aussi a y(x(A)), le resultat s'obtient ensuite par raison de symetrie. Si

5.3. FERMETURE TRANSITIVE 117 (u;v)2x(y(A)) alors ou bien (u;v)2y(A) ou bien (u;x) et (x;v)2y(A). Dans le premier cas y(A0) y(A) pour tout A0 A implique (u;v) 2y(x(A)). Dans le second cas il y a plusieurs situations a considerer suivant que (u;x) ou (x;v) appar-tiennent ou non a A; l'examen de chacune d'entre elles permet d'obtenir le resultat.

Examinons en une a titre d'exemple, supposons que (u;x) 2 A et (x;v) 2= A, comme (x;v)2y(A) on a (x;y);(y;v) 2A, ceci implique (u;y)2x(A) et (u;v)2y(x(A))

2

Proposition 2

La fermeture transitive est donnee par :

= x1(x2(:::xn(A):::))

Preuve

On se convainc facilement que contient l'iteree de l'action des xi sur A, la partie la plus complexe a prouver est que x1(x2(:::xn(A):::)) contient . Pour cela on considere un chemin joignant deux sommetsx ety deGalors ce chemin s'ecrit

(x;y1)(y1;y2):::(yp;y)

ainsi (x;y) 2 y1(y2(:::yp(A):::)) les proprietes demontrees ci-dessus permettent d'ordonner les y suivant leurs numeros croissants; le fait que y(A0) A0, pour tout A0 permet ensuite de conclure. 2

De ces deux resultats on obtient l'algorithme suivant pour le calcul de la fermeture transitive d'un graphe, il est en general attribue a Roy et Warshall:

procedure PHI (var m: GrapheMat; x: IntSom; n: integer);

var

u, v: IntSom;

begin

for u := 1 to n do

if (m[u, x] = 1) then for v := 1 to n do

if (m[x, v] = 1) then m[u, v] := 1;

end;

procedure FermetureTransitive (var m: GrapheMat; n: integer);

var

x: IntSom;

begin

for x := 1 to n do PHI(m, x, n);

end;

Remarque

L'algorithme ci-dessus eectue un nombre d'operations que l'on peut ma-jorer par n3, chaque execution de la procedure PHI pouvant necessiter n2 operations;

cet algorithme est donc meilleur que le calcul des puissances successives de la matrice d'adjacence.

Documents relatifs