Graphes - Séance 7 G. Richomme [email protected] Université Paul Valéry Montpellier 3 Licence AES parcours Misahs cours 2012-2013 1 [email protected] Graphes - Séance 7 Complexité d'un parcours 2 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? 3 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? Complexité en temps Fonction qui exprime le temps d'exécution d'un algorithme par rapport à la taille des données. 3 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? Complexité en temps Fonction qui exprime le temps d'exécution d'un algorithme par rapport à la taille des données. Complexité en espace Fonction qui exprime l'espace mémoire nécessaire pour l'exécution d'un algorithme par rapport à la taille des données. 3 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? Complexité en temps Fonction qui exprime le temps d'exécution d'un algorithme par rapport à la taille des données. Cette complexité en temps dépend potentiellement : de l'implémentation (donc du programmeur) 3 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? Complexité en temps Fonction qui exprime le temps d'exécution d'un algorithme par rapport à la taille des données. Cette complexité en temps dépend potentiellement : de l'implémentation (donc du programmeur) → on supposera une implémentation au meilleur coût. 3 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? Complexité en temps Fonction qui exprime le temps d'exécution d'un algorithme par rapport à la taille des données. Cette complexité en temps dépend potentiellement : de l'implémentation (donc du programmeur) → on supposera une implémentation au meilleur coût. de la structure des données : 3 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? Complexité en temps Fonction qui exprime le temps d'exécution d'un algorithme par rapport à la taille des données. Cette complexité en temps dépend potentiellement : de l'implémentation (donc du programmeur) → on supposera une implémentation au meilleur coût. de la structure des données : → estimation dans le pire des cas. 3 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? Complexité en temps Fonction qui exprime le temps d'exécution d'un algorithme par rapport à la taille des données. Cette complexité en temps dépend potentiellement : de l'implémentation (donc du programmeur) → on supposera une implémentation au meilleur coût. de la structure des données : → estimation dans le pire des cas. de la machine : 3 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? Complexité en temps Fonction qui exprime le temps d'exécution d'un algorithme par rapport à la taille des données. Cette complexité en temps dépend potentiellement : de l'implémentation (donc du programmeur) → on supposera une implémentation au meilleur coût. de la structure des données : → estimation dans le pire des cas. de la machine : → on se donnera un modèle de machine (RAM) 3 [email protected] Graphes - Séance 7 Complexité d'un algorithme ? Complexité en temps Fonction qui exprime le temps d'exécution d'un algorithme par rapport à la taille des données. Cette complexité en temps dépend potentiellement : de l'implémentation (donc du programmeur) → on supposera une implémentation au meilleur coût. de la structure des données : → estimation dans le pire des cas. de la machine : → on se donnera un modèle de machine (RAM) → on essaiera juste de donner l'ordre de grandeur. 3 [email protected] Graphes - Séance 7 Modèle de machine (RAM simplié et imprécis) RAM = Random Access Machine Fonctionnement séquentiel Mémoire centrale partagée Chaque instruction "élémentaire" de la machine coûte 1 accès à la mémoire aux variables (aectation ou lecture) opération numérique de base (+, -, . . . ) ... Remarque : déterminer si une opération peut être considérée comme élémentaire est souvent source de discussion. Important : dans ce modèle, on peut supposer que les opérations sur les piles et sur les les sont élémentaires 4 [email protected] Graphes - Séance 7 Instructions élémentaires Dire que Chaque instruction "élémentaire" de la machine coûte 1 est à comprendre par : Le coût de chacune de ces instructions est inférieur à une borne xe commune. 5 [email protected] Graphes - Séance 7 Exemple Algo : for i in range(0, len( L ) ): print( L[i] ) 6 [email protected] Graphes - Séance 7 Exemple Algo : for i in range(0, len( L ) ): print( L[i] ) Posons n = len( L). Nombre d'opérations bornées par C .n pour une constante C . Le temps d'exécution est de l'ordre de n. 6 [email protected] Graphes - Séance 7 Exemple Algo : for i in range(0, len( L ) ): print( L[i] ) Posons n = len( L). Nombre d'opérations bornées par C .n pour une constante C . Le temps d'exécution est de l'ordre de n. Type d'information apportée : si n double, grosso-modo le temps d'exécution aussi. 6 [email protected] Graphes - Séance 7 Exemple Algo : num = 0 for i in range(0, len( M ) ): for j in range(0, M[i]): if M[i][j] = 1: num = num + 1 7 [email protected] Graphes - Séance 7 Exemple Algo : num = 0 for i in range(0, len( M ) ): for j in range(0, M[i]): if M[i][j] = 1: num = num + 1 Posons n = len(M) et m = max{ M[i] | i = 0, . . . , n − 1}. Nombre d'opérations majoré par 1 + Cnm pour une constante C . 7 [email protected] Graphes - Séance 7 Exemple Algo : num = 0 for i in range(0, len( M ) ): for j in range(0, M[i]): if M[i][j] = 1: num = num + 1 Posons n = len(M) et m = max{ M[i] | i = 0, . . . , n − 1}. Nombre d'opérations majoré par 1 + Cnm pour une constante C . Nombre d'opérations majoré par C 0 nm pour une constante C 0 . 7 [email protected] Graphes - Séance 7 Exemple Algo : num = 0 for i in range(0, len( M ) ): for j in range(0, M[i]): if M[i][j] = 1: num = num + 1 Posons n = len(M) et m = max{ M[i] | i = 0, . . . , n − 1}. Nombre d'opérations majoré par 1 + Cnm pour une constante C . Nombre d'opérations majoré par C 0 nm pour une constante C 0 . Le temps d'exécution est de l'ordre de nm. 7 [email protected] Graphes - Séance 7 Exemple Algo : num = 0 for i in range(0, len( M ) ): for j in range(0, M[i]): if M[i][j] = 1: num = num + 1 Posons n = len(M) et m = max{ M[i] | i = 0, . . . , n − 1}. Nombre d'opérations majoré par 1 + Cnm pour une constante C . Nombre d'opérations majoré par C 0 nm pour une constante C 0 . Le temps d'exécution est de l'ordre de nm. Quand n = m, le temps d'exécution est de l'ordre de n2 . 7 [email protected] Graphes - Séance 7 Exemple Algo : num = 0 for i in range(0, len( M ) ): for j in range(0, M[i]): if M[i][j] = 1: num = num + 1 Posons n = len(M) et m = max{ M[i] | i = 0, . . . , n − 1}. Nombre d'opérations majoré par 1 + Cnm pour une constante C . Nombre d'opérations majoré par C 0 nm pour une constante C 0 . Le temps d'exécution est de l'ordre de nm. Quand n = m, le temps d'exécution est de l'ordre de n2 . Type d'information apportée : si n double, grosso-modo le temps d'exécution est multiplié par 4. 7 [email protected] Graphes - Séance 7 Ordre de grandeur Majoration asymptotique Soient f et g deux fonctions telles que : il existe un entier N et une constante C > 0 tels que pour tout n ≥ N, f (n) ≤ Cg (n). On dit que f est majorée asymptotiquement par g . On note f = O (g ). 8 [email protected] Graphes - Séance 7 Ordre de grandeur Majoration asymptotique Soient f et g deux fonctions telles que : il existe un entier N et une constante C > 0 tels que pour tout n ≥ N, f (n) ≤ Cg (n). On dit que f est majorée asymptotiquement par g . On note f = O (g ). Les opérations élémentaires ont une complexité en temps en O (1). 8 [email protected] Graphes - Séance 7 Ordre de grandeur Majoration asymptotique Soient f et g deux fonctions telles que : il existe un entier N et une constante C > 0 tels que pour tout n ≥ N, f (n) ≤ Cg (n). On dit que f est majorée asymptotiquement par g . On note f = O (g ). Les opérations élémentaires ont une complexité en temps en O (1). Notre premier exemple a une complexité en temps en O (n). 8 [email protected] Graphes - Séance 7 Ordre de grandeur Majoration asymptotique Soient f et g deux fonctions telles que : il existe un entier N et une constante C > 0 tels que pour tout n ≥ N, f (n) ≤ Cg (n). On dit que f est majorée asymptotiquement par g . On note f = O (g ). Les opérations élémentaires ont une complexité en temps en O (1). Notre premier exemple a une complexité en temps en O (n). Notre deuxième exemple a une complexité en temps en O (nm) et O (n2 ) quand n = m. 8 [email protected] Graphes - Séance 7 Quelques propriétés utiles si f = O (g ) et g = O (h) alors f = O (h). 9 [email protected] Graphes - Séance 7 Quelques propriétés utiles si f = O (g ) et g = O (h) alors f = O (h). si P (n) = ak nk + ak −1 nk −1 + . . . + ak , alors P = O (nk ) 9 [email protected] Graphes - Séance 7 Quelques propriétés utiles si f = O (g ) et g = O (h) alors f = O (h). si P (n) = ak nk + ak −1 nk −1 + . . . + ak , alors P = O (nk ) si f = O (h) et g = O (h) alors f + g = O (h) 9 [email protected] Graphes - Séance 7 Complexité en temps de l'algorithme de parcours O (n + m) où n est le nombre de sommets et m est le nombre d'arcs ! 10 [email protected] Graphes - Séance 7 Complexité en temps de l'algorithme de parcours O (n + m) où n est le nombre de sommets et m est le nombre d'arcs ! fonction Graphe_Accessible( G, x ) ens_som_acc = { x } # ensemble des sommets accessibles ens_arcs = vide # ensemble des arcs résultats ens_arcs_a_voir = vide # ensemble des arcs à visiter Pour chaque successeur y de x faire ajouter (x, y) dans ens_arcs_a_voir tant que ens_arcs_a_voir n'est pas vide faire (i, f) = un arc retiré de ens_arcs_a_voir si f n'est pas dans ens_som_acc alors ajouter (i, f) dans ens_arcs ajouter f dans ens_som_acc Pour chaque successeur y de f faire ajouter (f, y) dans ens_arcs_a_voir retourner le graphe (ens_som_acc, ens_arcs) [email protected] Graphes - Séance 7 10 Degré d'un sommet 11 [email protected] Graphes - Séance 7 Degrés 5 bS aZ Cd e yb yy y yy yy yy a GG wd GG ww GG w w GG GG wwww w c c Le degré d'un sommet s d'un graphe non orienté est le nombre d'arêtes incidentes. Notation d (s ). 12 [email protected] Graphes - Séance 7 Degrés 5 bS aZ Cd e yb yy y yy yy yy a GG wd GG ww GG w w GG GG wwww w c c Le degré d'un sommet s d'un graphe non orienté est le nombre d'arêtes incidentes. Notation d (s ). Le degré extérieur d'un sommet s d'un graphe orienté est le nombre d'arcs sortant de s. Notation d + (s ). Le degré intérieur d'un sommet s d'un graphe orienté est le nombre d'arcs entrant de s. Notation d − (s ). 12 [email protected] Graphes - Séance 7 Degrés 5 bS aZ Cd e yb yy y yy yy yy a GG wd GG ww GG w w GG GG wwww w c c Le degré d'un sommet s d'un graphe non orienté est le nombre d'arêtes incidentes. Notation d (s ). Le degré extérieur d'un sommet s d'un graphe orienté est le nombre d'arcs sortant de s. Notation d + (s ). Le degré intérieur d'un sommet s d'un graphe orienté est le nombre d'arcs entrant de s. Notation d − (s ). Le degré d'un sommet s d'un graphe orienté est la somme d + (s ) + d − (s ). [email protected] Graphes - Séance 7 12 Liens degrés - nombre d'arcs Théorème Dans n'importe quel graphe orienté les trois valeurs suivantes sont égales : la somme des degrés extérieurs ; la somme des degrés intérieurs ; le nombre d'arcs. 13 [email protected] Graphes - Séance 7 Liens degrés - nombre d'arcs Théorème Dans n'importe quel graphe orienté les trois valeurs suivantes sont égales : la somme des degrés extérieurs ; la somme des degrés intérieurs ; le nombre d'arcs. Conséquence : dans un graphe orienté, la somme des degrés est égale au double du nombre d'arcs du graphe. 13 [email protected] Graphes - Séance 7 Liens degrés - nombre d'arcs Théorème Dans n'importe quel graphe orienté les trois valeurs suivantes sont égales : la somme des degrés extérieurs ; la somme des degrés intérieurs ; le nombre d'arcs. Conséquence : dans un graphe orienté, la somme des degrés est égale au double du nombre d'arcs du graphe. idem dans un graphe non orienté. 13 [email protected] Graphes - Séance 7 Liens degrés - nombre d'arcs Théorème Dans n'importe quel graphe orienté les trois valeurs suivantes sont égales : la somme des degrés extérieurs ; la somme des degrés intérieurs ; le nombre d'arcs. Conséquence : dans un graphe orienté, la somme des degrés est égale au double du nombre d'arcs du graphe. idem dans un graphe non orienté. Exercice : Dans un graphe non orienté, montrer que le nombre de sommets de degré impair est pair. 13 [email protected] Graphes - Séance 7 Exercice Euler : les ponts de K÷nisberg Source image = wikipedia commons (domaine public) Prouver qu'il n'existe pas de chemin partant d'un point, passant une fois et une seule par tous les ponts, et revenant au point de départ ? 14 [email protected] Graphes - Séance 7 Exercice Euler : les ponts de K÷nisberg Source image = wikipedia commons (domaine public) Prouver qu'il n'existe pas de chemin partant d'un point, passant une fois et une seule par tous les ponts, et revenant au point de départ ? Comment généraliser le raisonnement ? [email protected] Graphes - Séance 7 14 Graphe eulérien Dénition Un graphe non orienté est eulérien s'il existe un cycle qui passe une fois et une seule par toutes les arêtes (un tel cycle sera appelé eulérien). 15 [email protected] Graphes - Séance 7 Graphe eulérien Dénition Un graphe non orienté est eulérien s'il existe un cycle qui passe une fois et une seule par toutes les arêtes (un tel cycle sera appelé eulérien). Exemple d'application : élaboration d'une tournée de facteur. 15 [email protected] Graphes - Séance 7 Graphe eulérien Dénition Un graphe non orienté est eulérien s'il existe un cycle qui passe une fois et une seule par toutes les arêtes (un tel cycle sera appelé eulérien). Exemple d'application : élaboration d'une tournée de facteur. Théorème d'Euler Un graphe connexe d'au moins deux sommets est eulérien si et seulement si tous les sommets sont de degrés pairs. 15 [email protected] Graphes - Séance 7 Une preuve en 3 étapes Si un graphe possède un cycle eulérien, alors tous les sommets sont de degrés pairs. 16 [email protected] Graphes - Séance 7 Une preuve en 3 étapes Si un graphe possède un cycle eulérien, alors tous les sommets sont de degrés pairs. Si un graphe connexe d'au moins 2 sommets a tous ses sommets de degrés pairs, alors il contient un cycle passant au plus une fois par chaque arête. 16 [email protected] Graphes - Séance 7 Une preuve en 3 étapes Si un graphe possède un cycle eulérien, alors tous les sommets sont de degrés pairs. Si un graphe connexe d'au moins 2 sommets a tous ses sommets de degrés pairs, alors il contient un cycle passant au plus une fois par chaque arête. Si un graphe connexe d'au moins 2 sommets a tous ses sommets de degrés pairs, alors il contient un cycle eulérien. 16 [email protected] Graphes - Séance 7 Éléments de preuve (2/5) Si un graphe connexe d'au moins 2 sommets a tous ses sommets de degrés pairs, alors il contient un cycle passant au plus une fois par chaque arête. Preuve constructive par algorithme glouton suivant qui cherche un cycle (non nécessairement eulérien) dans le graphe Choisir un sommet x0 Considérer un successeur y 6= x0 Marquer l'arête [x0 , y ] x ←y Tant que x 6= x0 faire Considérer un successeur y de x avec [x , y ] non marqué Marquer [x , y ] x ←y 17 [email protected] Graphes - Séance 7 Éléments de preuve (3/5) Remarques le graphe obtenu en enlevant les arêtes marquées à la n de l'algorithme précédent : vérie encore : le degré de chaque sommet est pair ; pas nécessairement connexe ; chaque composante connexe a moins d'arêtes que le graphe initial. Il est donc possible pour chaque composante connexe d'appliquer l'algorithme glouton précédent. 18 [email protected] Graphes - Séance 7 Éléments de preuve (4/5) Fusion de cycle Considérons deux cycles passant par un sommet x, l'un partant de x suivant un chemin c et l'autre partant de x suivant un chemin c 0 , alors il existe un cycle partant de x suivant le chemin c puis le chemin c 0 . 19 [email protected] Graphes - Séance 7 Éléments de preuve (5/5) Si un graphe connexe d'au moins 2 sommets a tous ses sommets de degrés pairs, alors il contient un cycle eulérien. Algorithme récursif : Construire un cycle C dans G avec algo glouton précédent Considérer le graphe G 0 des arêtes non marquées Enlever de G 0 les sommets isolés Pour chaque composante connexe G 0 construire un cycle eulérien C 0 fusionner C 0 à C et prendre pour C le résultat 20 [email protected] Graphes - Séance 7 Exercices Les graphes suivants sont-ils eulériens ? Si oui, proposer un cycle eulérien. A terminer oo a' OOO w a& FF w & F ww & FFF FF ww && w FF w && ww && c b* AA && ** AA ~~ ~ && ~~ ** AA ~ ** AAA ~& ~ ** AAA ~~~ && ** ~~~AA && * ~~ AAA && ~ d e oo '' OOOO OOO ooo ' o o OOO '' oo o O o o '' c b* N@@NN ' p p p '' ** @@NNN p p ' pppp ** @@ NNNNN ** @@@ NNN ppp'''pp @@ f ** ' @@ 00 '' ** @@ 0 ' ** 0 ' @ @@@00 '' ** 0 ' ** @@@ 00 ' @@ 00 '' ** @@0 ' * @0' d e 21 [email protected] Graphes - Séance 7 Exercices Les graphes suivants sont-ils eulériens ? Si oui, proposer un cycle eulérien. A terminer oo a' OOO w a& FF w & F ww & FFF FF ww && w FF w && ww && c b* AA && ** AA ~~ ~ && ~~ ** AA ~ ** AAA ~& ~ ** AAA ~~~ && ** ~~~AA && * ~~ AAA && ~ d e oo '' OOOO OOO ooo ' o o OOO '' oo o O o o '' c b* N@@NN ' p p p '' ** @@NNN p p ' pppp ** @@ NNNNN ** @@@ NNN ppp'''pp @@ f ** ' @@ 00 '' ** @@ 0 ' ** 0 ' @ @@@00 '' ** 0 ' ** @@@ 00 ' @@ 00 '' ** @@0 ' * @0' e d A quelle condition un graphe complet est-il eulérien ? A faire 21 [email protected] Graphes - Séance 7 Exercice A faire Peut-on adapter la recherche d'un parcours eulérien à un graphe orienté ? Si oui, comment ? 22 [email protected] Graphes - Séance 7