Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

29
Algorithmes et structures de données avancées Cours 7 Patrick Reuter http://www.labri.fr/~preuter

Transcript of Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Page 1: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Algorithmes et structures de données

avancées

Cours 7 Patrick Reuter

http://www.labri.fr/~preuter

Page 2: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Les graphes

• Un graphe G = (V,E) un couple de deux ensembles

– Un ensemble V(G) = {v1, v2, …, vn} de sommets (anglais : one vertex, two vertices)

– Un ensemble E(G) V x V d’arêtes (anglais : edges)

Page 3: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Définitions• Orientation :

– les graphes non orientés– les graphes orientés

• degré• boucle• parité (sommets pairs et impairs)• adjacence, voisin et voisinage• sommet isolé • sous-graphe, clique• Graphe régulier• Graphe complet• Isomorphisme• Chaîne, chaîne simple, cycle• Connexité

• Stockage des graphes

Page 4: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Matrice d’adjacence

• Pour des graphes orientés et non-orientés• Soit G = (V,E) avec V = {s1, s2, …, sn} • La matrice d’adjacence A est une matrice

quadratique binaire de taille n x n avec

Ai,k = 1 si (si, sk) E, Ai,k = 0 sinon• La matrice d’adjacence d’un graphe non

orienté est symétrique• Suivant l’ordre des nœuds, il y a plusieurs

matrice d’adjacence du même graphe

Page 5: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Graphe de contacts• Comment montrer les contacts des

contacts des contacts …

Patrick

Pierre

Clémentine

Jérôme

Petra

Luc

Axl

Page 6: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Matrice d’adjacence

0 1 0 0 0 0 0

1 0 1 0 0 0 0

0 1 0 1 1 0 0

A = 0 0 1 0 0 0 0

0 0 1 0 0 0 0

0 0 0 0 0 0 1

0 0 0 0 0 1 0

Patrick (1)

Pierre (2)Clémentine (3)

Jérôme (5)Petra (4)

Luc (6)

Axl (7)

Page 7: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Fermeture transitive

• La fermeture transitive d’un graphe G est le Graphe G* + = (V, E*+), où une arête (i, j) є E+ ssi il y a une chaîne de i à j.

• Si les chaînes de longueur 0 sont aussi considérées, le résultat est la fermeture transitive et réflexive G* .

Page 8: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Fermeture transitive

1 1 1 1 1 0 0

1 1 1 1 1 0 0

1 1 1 1 1 0 0

A* = 1 1 1 1 1 0 0

1 1 1 1 1 0 0

0 0 0 0 0 1 1

0 0 0 0 0 1 1

Page 9: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

• A : Matrice d’adjacence

• Pour une chaîne maximale de longueur n

Matrice d’adjacence de la fermeture transitive

Fermeture transitive

Page 10: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

• G(V,E) : (Matrice d’adjacence A):– Ai,k = 1 si (si, sk) E, Ai,k = 0 sinon

• G*(V,E*) : Fermeture transitive de G (Matrice d’adjacence A*)– A*i,k = 1 ssi il y a une chaîne de si à sk.

Page 11: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Logiciels pour le calcul scientifique

– Maple– Matlab– Mathematica– Mupad– Scilab– …

Page 12: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

MuPad

• Démonstration

Page 13: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Algorithme de Warshall

• permet de construire la fermeture transitive d'un graphe orienté ou non orienté.

Page 14: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Algorithme de Warshall• À partir de la matrice d'adjacence A du graphe G(V,E), on va

calculer la matrice d'adjacence A* de G*(V, E*)

• On suppose que Ak[i,j] représente l'existence d'une chaîne de i à j passant uniquement par des sommets inférieurs ou égaux à k.

Ak[i,j]=Ak-1[i,j] OU (Ak-1[i,k] ET Ak-1[k,j])

• Il existe donc une chaîne de i à j passant seulement par des sommets inférieurs ou égaux à k – s'il existe une chaîne de i à j passants seulement par des

sommets inférieurs ou égaux à k-1 – ou alors s'il existe une chaîne de i à k passant par des sommets

inférieurs ou égaux à k-1 ET une chaîne de k à j passant par des sommets inférieurs ou égaux à k-1

• Matrice d’adajcence de G*: An[i,j]

Page 15: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Algorithme de WarshallEntrée : Matrice d’adjacence A

pour k de 1 à |V(G)| fairepour i de 1 à |V(G)| faire

pour j de 1 à |V(G)| faireif (A[i][j]=1 OU (A[i][k]=1 ET A[k][j]=1))

A[i][j]=1 else

A[i][j]=0

A[i][j] = A[i][j] OU (A[i][k] ET A[k][j])

Sortie : A est la matrice décrivant la fermeture transitive

Page 16: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Algorithme de Warshall

• Complexité – O(n3)– il peut être intéressant de construire la

fermeture transitive d'un graphe une fois pour toute, on peut savoir si les sommets si et sj

appartiennent à la même composante connexe en un temps constant

Page 17: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

• Peut-on utiliser la fermeture transitive pour tester si un graphe est connexe ?

Page 18: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Connexité

• La notion de connexité exprime la possibilité d'aller de n'importe quel sommet du graphe à n'importe quel autre sommet du graphe.

Plus formellement :

• Un graphe G est connexe si et seulement si

s, t V(G), il existe une chaîne entre s et t.

Page 19: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Graphe connexe/complet

• Un graphe G est connexe si et seulement si s, t V(G), il existe une chaîne entre s et t.

• Un graphe G est complet si et seulement si s, t V(G), il existe une arête entre s et t.

Page 20: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.
Page 21: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Récapitulatif des preuves

• Preuve par récurrence

• Preuve par contradiction

• Preuve par construction

Page 22: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Preuve preuve par induction ou preuve par récurrence

• Une preuve par induction contient deux parties : – le cas de base – et la partie d'induction.

Page 23: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Preuve par contradiction

Raisonnement par l’absurde :

L’idée d’une telle preuve est de supposer que l’énoncé est fausse, puis de montrer que cette supposition conduit à une contradiction.

Puisque la logique ne peut être contradictoire , c’est la supposition qui est fausse, et par conséquent l’énoncé est vrai.

Page 24: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Preuve par construction

• Cette preuve nous prouve non seulement l'existence d'un objet, mais aussi une méthode pour le trouver

• Une telle preuve est toujours plus appréciée par un informaticien qu'une preuve qui indique seulement qu'un objet existe.

• La raison est que l'informaticien peut souvent convertir une preuve constructive en un algorithme pour trouver l'objet.

• De manière générale, une preuve constructive est toujours plus convaincante qu'une preuve d'existence.

Page 25: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

• Preuve No. 1– Par récurrence

Page 26: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Théorème : s V(G) d(s) = 2 | E(G) |

« La somme de degrés de tous les sommets est égal à deux fois le nombre d’arêtes »

Page 27: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

Technique de preuve par induction

Preuve : • Vérifier que s V(G) d(s) = 2 | E(G) | pour un

graphe sans arête • Supposer que s V(G) d(s) = 2 | E(G) | pour

n'importe quel graphe avec au plus k arêtes,• Prouver que si s V(G) d(s) = 2 | E(G) | est vrai

pour n'importe quel graphe avec au plus k arêtes, c'est aussi vrai pour n'importe quel graphe avec k+1 arêtes.

Page 28: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

La preuve du théorème (1/2)

• Par induction sur le nombre d'arêtes dans le graphe.– (cas de base) La propriété est trivialement

vraie pour un graphe avec |E| = 0, car le degré de chaque sommet du graphe est 0.

– (hypothèse d'induction) On suppose que pour un graphe G avec au moins un sommet et au plus k arêtes, s V(G) d(s) = 2 | E(G) |

Page 29: Algorithmes et structures de données avancées Cours 7 Patrick Reuter preuter.

La preuve du théorème (2/2)• (induction) Nous construisons un graphe G' en rajoutant une arête à G.

• Les sommets extrémités de la nouvelle arête, disons s1 et s2 (il est possible que s1 et s2 soient le même sommet), vont avoir leur degré augmenté de 1 chacun.

• Il est donc vrai que s V(G’) d(s) = s V(G) d(s) + 2. De plus, nous avons rajouté une arête dans G'. Par conséquent |E(G')| = |E(G)| + 1.

• Donc, s V(G’) d(s) = s V(G) d(s) + 2 = 2|E(G)|+ 2 = 2(|E(G)| + 1) = 2|E(G')|.

• Nous avons donc s V(G’) d(s) = 2|E(G')|

Nous avons donc prouvé la propriété par récurrence.