Vous êtes sur la page 1sur 91

Algorithmique avance

IUP 2
Frdric Vivien
24 avril 2002
Table des matires
1 Introduction 9
1.1 Quest-ce que lalgorithmique ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Motivation : calcul de x
n
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.1 Problme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.2 Algorithme trivial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.3 Mthode binaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.4 Algorithme des facteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2.5 Algorithme de larbre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.6 Et aprs ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2 Complexit et optimalit ; premier algorithme de tri 13
2.1 Dnition de la complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.1 Notations de Landau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.2 Complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.3 Modle de machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 Illustration : cas du tri par insertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.1 Problmatique du tri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.2 Principe du tri par insertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.3 Algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.4 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.5 Complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 La rcursivit et le paradigme diviser pour rgner 17
3.1 Rcursivit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.1 Dnition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.2 Rcursivit simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.3 Rcursivit multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.4 Rcursivit mutuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.1.5 Rcursivit imbrique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.1.6 Principe et dangers de la rcursivit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.1.7 Non dcidabilit de la terminaison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.8 Importance de lordre des appels rcursifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.9 Exemple dalgorithme rcursif : les tours de Hano . . . . . . . . . . . . . . . . . . . . . . . 20
3.2 Drcursivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2.1 Rcursivit terminale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2.2 Rcursivit non terminale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2.3 Remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3 Diviser pour rgner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3.2 Premier exemple : multiplication nave de matrices . . . . . . . . . . . . . . . . . . . . . . . 24
3.3.3 Analyse des algorithmes diviser pour rgner . . . . . . . . . . . . . . . . . . . . . . . . . 24
3
4 TABLE DES MATIRES
3.3.4 Rsolution des rcurrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.3.5 Deuxime exemple : algorithme de Strassen pour la multiplication de matrices . . . . . . . . 25
4 Algorithmes de tri 29
4.1 Tri par fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.1.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.1.2 Algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.1.3 Complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2 Tri par tas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2.1 Dnition dun tas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2.2 Conservation de la structure de tas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2.3 Construction dun tas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.4 Algorithme du tri par tas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.3 Tri rapide (Quicksort) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.3.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.3.2 Algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3.3 Complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5 Structures de donnes lmentaires 39
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.2 Piles et les . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.2.1 Piles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.2.2 Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.3 Listes chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.3.1 Dnitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.3.2 Algorithmes de manipulation des listes chanes . . . . . . . . . . . . . . . . . . . . . . . . 43
5.3.3 Comparaison entre tableaux et listes chanes . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6 Programmation dynamique 47
6.1 Multiplication dune suite de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.2 lments de programmation dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2.1 Sous-structure optimale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2.2 Sous-problmes superposs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2.3 Recensement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7 Algorithmes gloutons 53
7.1 Location dune voiture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.2 lments de la stratgie gloutonne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.2.1 Proprit du choix glouton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.2.2 Sous-structure optimale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.3 Fondements thoriques des mthodes gloutonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.3.1 Matrodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.3.2 Algorithmes gloutons sur un matrode pondr . . . . . . . . . . . . . . . . . . . . . . . . . 55
8 Graphes et arbres 57
8.1 Graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
8.2 Arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
8.3 Parcours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
8.3.1 Parcours des arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
8.3.2 Parcours des graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
TABLE DES MATIRES 5
9 Arbres de recherche et arbres de recherche quilibrs 63
9.1 Arbres binaires de recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
9.1.1 Dnition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
9.1.2 Recherches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
9.1.3 Insertion dun lment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
9.1.4 Suppression dun lment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
9.1.5 Complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
9.2 Arbres rouge et noir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
9.2.1 Dnition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
9.2.2 Rotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.2.3 Insertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.2.4 Suppression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.2.5 Complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
10 Plus courts chemins 75
10.1 Plus courts chemins origine unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
10.1.1 Algorithme de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
10.1.2 Algorithme de Bellman-Ford . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
10.2 Plus courts chemins pour tout couple de sommets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
10.2.1 Programmation dynamique nave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
10.2.2 Algorithme de Floyd-Warshall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
11 NP-compltude 83
11.1 La classe P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
11.1.1 Problmes abstraits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
11.1.2 Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
11.2 La classe NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
11.2.1 Algorithme de validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
11.2.2 La classe de complexit NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
11.3 NP-compltude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
11.3.1 Rductibilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
11.3.2 Dnition de la NP-compltude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
11.3.3 Exemples de problmes NP-complets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
11.3.4 Preuves de NP-compltude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
12 Heuristiques 89
12.1 Le problme de la couverture de sommet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
12.1.1 Heuristique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
12.1.2 Exemple dutilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
12.1.3 Garantie de performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
12.2 Le problme du voyageur de commerce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
12.2.1 Exemple dutilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
12.2.2 Garantie de performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Table des gures
1.1 Arbre de puissances. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2 Schma de calcul pour n = 23. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.1 Exemple dutilisation de lalgorithme TRI-INSERTION. . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1 Mthode de rsolution du jeu des tours de Hano. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2 Exemple dexcution de lalgorithme drcursiv. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1 Algorithme FUSIONNER. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2 Algorithme TRI-FUSION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.3 Exemple de tas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.4 Algorithme ENTASSER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.5 Exemple dutilisation de lalgorithme ENTASSER. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.6 Algorithme CONSTRUIRE-TAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.7 Exemple dutilisation de lalgorithme CONSTRUIRE-TAS. . . . . . . . . . . . . . . . . . . . . . . . 34
4.8 Exemple dutilisation de lalgorithme TRIER-TAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.1 Exemple de manipulation de pile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.2 Implmentation dune pile par un tableau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.3 Algorithmes de manipulation des piles implmentes par des tableaux. . . . . . . . . . . . . . . . . . 41
5.4 Exemple de manipulation de le. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.5 Implmentation dune le par un tableau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.6 Algorithmes de manipulation des les implmentes par des tableaux. . . . . . . . . . . . . . . . . . 42
5.7 Exemple de manipulation de liste chane. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.8 Exemple de manipulation de liste doublement chane. . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.9 Efcacits respectives des listes chanes et des tableaux. . . . . . . . . . . . . . . . . . . . . . . . . 45
6.1 Illutration de lalgorithme ORDONNER-CHANEDEMATRICES. . . . . . . . . . . . . . . . . . . . . 50
8.1 Exemple de graphe orient. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
8.2 Exemple de graphe non orient. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
8.3 Exemple de graphe contenant un cycle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
8.4 Exemple de fort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
8.5 Exemple darbre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
8.6 Exemple darbres qui ne diffrent que sils sont enracins. . . . . . . . . . . . . . . . . . . . . . . . 59
8.7 Exemple darbres (enracins) qui ne diffrent que sils sont ordonns. . . . . . . . . . . . . . . . . . 59
8.8 Exemple darbres ordonns qui ne diffrent que quand ils sont vus comme des arbres binaires. . . . . 60
8.9 Algorithme de parcours en profondeur dun arbre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
8.10 Parcours prxe, inxe et postxe dun arbre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
8.11 Algorithme de parcours en largeur dun arbre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
8.12 Algorithme de parcours en profondeur dun graphe. . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
8.13 Algorithme de parcours en largeur dun graphe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7
8 TABLE DES FIGURES
9.1 Deux arbres binaires de recherche contenant les mmes valeurs. . . . . . . . . . . . . . . . . . . . . 63
9.2 Localisation du successeur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
9.3 Algorithme dinsertion dans un arbre binaire de recherche. . . . . . . . . . . . . . . . . . . . . . . . 65
9.4 Cas de gure lors de la suppression dun nud dun arbre binaire de recherche. . . . . . . . . . . . . 65
9.5 Suppression dun lment dans un arbre binaire de recherche. . . . . . . . . . . . . . . . . . . . . . . 66
9.6 Exemple darbre rouge et noir. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.7 Rotations sur un arbre binaire de recherche. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.8 Algorithme de rotation gauche pour un arbre binaire. . . . . . . . . . . . . . . . . . . . . . . . . . . 68
9.9 Premire srie de congurations pathologiques pour linsertion dans un arbre rouge et noir. . . . . . . 68
9.10 Deuxime srie de congurations pathologiques pour linsertion dans un arbre rouge et noir. . . . . . 69
9.11 Algorithme dinsertion dans un arbre rouge et noir. . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
9.12 Exemple dinsertion dans un arbre rouge et noir. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.13 Congurations pathologiques pour la suppression dans un arbre rouge et noir. . . . . . . . . . . . . . 72
9.14 Suppression dun lment dans un arbre rouge et noir. . . . . . . . . . . . . . . . . . . . . . . . . . . 73
9.15 Correction dun arbre rouge et noir aprs suppression dun lment. . . . . . . . . . . . . . . . . . . 74
10.1 Algorithme de Dijkstra pour le calcul des plus courts chemins. . . . . . . . . . . . . . . . . . . . . . 76
10.2 Exemple dexcution de lalgorithme de Dijkstra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
10.3 Algorithme de Bellman-Ford pour le calcul des plus courts chemins. . . . . . . . . . . . . . . . . . . 77
10.4 Exemple dexcution de lalgorithme de Bellman-Ford. . . . . . . . . . . . . . . . . . . . . . . . . . 78
10.5 Algorithme naf par programmation dynamique pour le calcul des plus courts chemins. . . . . . . . . 80
10.6 Un graphe orient et la squence des matrices calcules par PLUS-COURTS-CHEMINS. . . . . . . . . 80
10.7 Algorithme de Floyd-Warshall pour le calcul des plus courts chemins. . . . . . . . . . . . . . . . . . 81
10.8 Exemple dexcution de lalgorithme de Floyd-Warshall. . . . . . . . . . . . . . . . . . . . . . . . . 82
12.1 Exemple dutilisation de lalgorithme COUVERTURE-SOMMET-APPROCHE. . . . . . . . . . . . . . 90
12.2 Exemple dutilisation de lalgorithme TOURNE-APPROCHE. . . . . . . . . . . . . . . . . . . . . . 92
Avertissement
Ce cours ne traite pas :
la recherche de motifs dans une chane de caractres (problme suppos tre abondamment trait dans le cours
de Programmation Oriente Objet) ;
lalgorithmique gomtrique (suppose tre traite dans les cours lis au traitement dimage).
Chapitre 1
Introduction
1.1 Quest-ce que lalgorithmique ?
Dnition 1 (Algorithme). Un algorithme est suite nie doprations lmentaires constituant un schma de calcul
ou de rsolution dun problme.
Historique : Le mot algorithme provient de la forme latine (Algorismus) du nom du mathmaticien arabe AL-
KHAREZMI ou AL-KHW

ARIZM

I auteur entre autres mais ce n est pas le plus important dun manuel de vulga-
risation sur le calcul dcimal positionnel indien (v. 830) expliquant son utilisation et, surtout, la manipulation des
diffrents algorithmes permettant de raliser les oprations arithmtiques classiques (addition, soustraction, multipli-
cation, division, extraction de racines carres, rgle de trois, etc.).
Double problmatique de lalgorithmique
1. Trouver une mthode de rsolution (exacte ou approche) du problme.
Soient trois nombres rels a, b et c, quelles sont les solutions de lquation ax
2
+bx +c ? (Rsultat bien
connu.)
Soient cinq nombres rels a, b, c, d et e, quelles sont les solutions de lquation ax
5
+bx
4
+cx
3
+dx
2
+ex+ f ?
(Pas de mthode gnrale, cf. la thorie de GALOIS.)
2. Trouver une mthode efcace.
Savoir rsoudre un problme est une chose, le rsoudre efcacement en est une autre, comme nous allons le voir
la section 1.2.
Diffrences entre algorithmes et programmes
Un programme est la ralisation (limplmentation) dun algorithme au moyen dun langage donn (sur une
architecture donne). Il sagit de la mise en uvre du principe. Par exemple, lors de la programmation on soccupera
parfois explicitement de la gestion de la mmoire (allocation dynamique en C) qui est un problme dimplmentation
ignor au niveau algorithmique.
1.2 Motivation : calcul de x
n
1.2.1 Problme
Donnes : un entier naturel n et un rel x. On veut calculer x
n
.
Moyens : Nous partons de y
1
= x. Nous allons construire une suite de valeurs y
1
, ..., y
m
telle que la valeur y
k
soit
obtenue par multiplication de deux puissances de x prcdemment calcules : y
k
= y
u
y
v
, avec 1 u, v < k,
k [2, m].
9
10 CHAPITRE 1. INTRODUCTION
But : y
m
= x
n
. Le cot de lalgorithme sera alors de m1, le nombre de multiplications faites pour obtenir le rsultat
recherch.
1.2.2 Algorithme trivial
y
i
= y
i1
y
1
, i [2, n]. Rsultat : y
n
= x
n
. Cot : m1 = n1 multiplications.
Algorithme
y[1] = x
Pour i 2 n faire
y[i] = y[i 1] y[1]
renvoyer y[n]
1.2.3 Mthode binaire
Algorithme
1. crire n sous forme binaire
2. Remplacer chaque :
1 par la paire de lettres SX ;
0 par la lettre S .
3. liminer la paire SX la plus gauche.
4. Rsultat : un mode de calcul de x
n
o
S signie lever au carr (squaring) ;
X signie multiplier par x .
Le tout en partant de x.
Illustration avec n = 23
1. n = 10111
1 0 1 1 1
2. SX S SX SX SX
3. S SX SX SX
4. Nous partons de x et nous obtenons successivement :
x
2
, x
4
, x
5
, x
10
, x
11
, x
22
, x
23
.
Nous sommes donc capables de calculer x
23
en 7 multiplications au lieu de 22 !
Explication de la mthode
criture binaire de n : n =
i=p
i=0
a
i
2
i
.
Plaons nous au cours du calcul de puissances de x. Soit j le dernier bit de la reprsentation binaire de n qui ait
t dcod et soit y
j
le dernier rsultat obtenu. Initialement, j = p et y
p
= x = x
a
p
.
Deux cas sont possibles pour a
j1
:
1. a
j1
= 1. a
j1
est remplac par SX, nous levons y
j
au carr puis multiplions le rsultat par x. Le nouveau
rsultat est y
j1
= y
2
j
x.
2. a
j1
=0. a
j1
est remplac par S et nous levons simplement y
j
au carr. Le nouveau rsultat est y
j1
=y
2
j
.
Dans tous les cas nous avons : y
j1
= y
2
j
(x
a
j1
).
Do, y
p1
= y
2
p
(x
a
p1
) = (x
a
p
)
2
(x
a
p1
) = (x
2a
p
) (x
a
p1
) = (x
2a
p
+a
p1
). Par rcurrence, nous pouvons
montrer que y
1
= x

i=p
i=0
a
i
2
i
= x
n
...
1.2. MOTIVATION : CALCUL DE X
N
11
Complexit (cot)
Note : les nombres dont la reprsentation binaire a exactement p chiffres forment exactement lintervalle [2
p1
, 2
p
1].
Nombres de chiffres dans lcriture binaire de n : 1+[log
2
n]. Notons (n) le nombre de 1 dans lcriture binaire
de n. Nombre doprations effectues :
(1+[log
2
n]) 1 lvations au carr (ne pas oublier ltape 3) ;
(n) 1 multiplications par x (ne pas oublier ltape 3).
Soit en tout T(n) = [log
2
n] +(n) 1 multiplications. Trivialement, 1 (n) [log
2
n] et [log
2
n] T(n) 2[log
2
n].
Pour n = 1000, lalgorithme trivial effectue 999 multiplications, et la mthode binaire moins de 20.
Historique
Cette mthode a t prsente avant 200 avant J.C. en Inde, mais il semblerait quil ait fallu attendre un millnaire
avant que cette mthode ne soit connue en dehors de lInde [3, p. 441].
Peut-on faire mieux ?
Prenons le cas n = 15.
1. n = 1111
1 1 1 1
2. SX SX SX SX
3. SX SX SX
4. Nous partons de x et nous obtenons successivement : x
2
, x
3
, x
6
, x
7
, x
14
, x
15
. Nous sommes donc capables de
calculer x
15
en 6 multiplications.
Autre schma de calcul : x
2
, x
3
, x
6
, x
12
, x
15
= x
12
x
3
. Nous obtenons ainsi x
15
en 5 multiplications et la mthode
binaire nest donc pas optimale (cest--dire que lon peut faire mieux).
1.2.4 Algorithme des facteurs
Algorithme
x
n
=
_
_
_
x si n = 1;
x
n1
x si n premier;
(x
p
)
n
/
si n = pn
/
avec p plus petit diviseur premier de n.
Illustration avec n = 15
1. 15 = 35, 3 tant le plus petit diviseur (facteur) premier de 15. Donc x
15
= (x
3
)
5
.
Nous rappliquons lalgorithme pour calculer x
3
et y
5
, o y = x
3
.
2. Calcul de x
3
:
(a) 3 est premier. Donc x
3
= x
2
x. Nous rappliquons lalgorithme pour calculer x
2
.
(b) 2 est premier. Donc x
2
= x x.
(c) Finalement, x
3
est calcul comme suit : x
3
= x x x, soit en deux multiplications.
3. Calcul de y
5
:
(a) 5 est premier. Donc y
5
= y
4
y. Nous rappliquons lalgorithme pour calculer y
4
.
(b) 4 = 22, o 2 est le plus petit facteur premier de 4. Donc y
4
= (y
2
)
2
.
(c) Finalement y
5
est calcul comme suit : t = y y, u =t t, y
5
= uy, soit en 3 multiplications.
4. Finalement, x
15
est calcul en 5 multiplications.
12 CHAPITRE 1. INTRODUCTION
Peut-on faire mieux ?
Oui...
1.2.5 Algorithme de larbre
Le k +1
e
niveau de larbre est dni comme suit :
on suppose que lon a dj les k premiers niveaux ;
on construit le k +1
e
de la gauche vers la droite en ajoutant sous le nud n les nuds de valeur n+1, n+a
1
, ...,
n+a
k1
o 1, a
1
, ..., a
k1
est le chemin de la racine au nud n ;
on supprime tous les nuds qui dupliquent une valeur dj obtenue.
Cf. la gure 1.1.
FIG. 1.1 Arbre de puissances (minimisant le nombre
de multiplications pour n 76 [3]).
FIG. 1.2 Schma de calcul pour n = 23.
Illustration avec n = 23
Sur la gure 1.2 nous pouvons constater que cette mthode permet de calculer x
23
en 6 multiplications, au lieu de
7 pour la mthode binaire et celle des facteurs... Cette mthode nest optimale que pour n 76.
1.2.6 Et aprs ?
KNUTH [3] consacre prs de 26 pages ce problme...
Moralit : nous avons affaire un problme simple, que tout le monde sait rsoudre, mais quil est trs difcile de
rsoudre efcacement...
Dans ce cours nous verrons des problmes classiques, des mthodes classiques de rsolutions (qui ne rsoudrons
pas tout, loin sen faut), des structures de donnes classiques.
1.3 Conclusion
Pour conclure, citons [2] : Un bon algorithme est comme un couteau tranchant il fait exactement ce que lon
attend de lui, avec un minimum defforts. Lemploi dun mauvais algorithme pour rsoudre un problme revient
essayer de couper un steak avec un tournevis : vous nirez sans doute par obtenir un rsultat digeste, mais vous ac-
complirez beaucoup plus defforts que ncessaire, et le rsultat aura peu de chances dtre esthtiquement satisfaisant.

Chapitre 2
Complexit et optimalit ; premier
algorithme de tri
2.1 Dnition de la complexit
2.1.1 Notations de Landau
Quand nous calculerons la complexit dun algorithme, nous ne calculerons gnralement pas sa complexit
exacte, mais son ordre de grandeur. Pour ce faire, nous avons besoin de notations asymptotiques.
O : f = O(g) n
0
, c 0, n n
0
, f (n) c g(n)
: f = (g) g = O( f )
o : f = o(g) c 0, n
0
, n n
0
, f (n) c g(n)
: f = (g) f = O(g) et g = O( f )
Exemples
O : n = O(n), 2n = O(3n), n+2 = O(n) (pour sen convaincre, prendre n
0
= 2 et c = 2),

n = O(n), log(n) = O(n),
n = O(n
2
).
o :

n = o(n), log(n) = o(n), n = o(n
2
), log(n) = o(

n).
: n+log(n) = (n+

n).
2.1.2 Complexit
Dnition 2 (Complexit). La complexit dun algorithme est la mesure du nombre doprations fondamentales quil
effectue sur un jeu de donnes. La complexit est exprime comme une fonction de la taille du jeu de donnes.
Nous notons D
n
lensemble des donnes de taille n et T(d) le cot de lalgorithme sur la donne d.
Complexit au meilleur : T
min
(n) =min
dD
n
C(d). Cest le plus petit nombre doprations quaura excuter lalgo-
rithme sur un jeu de donnes de taille xe, ici n. Cest une borne infrieure de la complexit de lalgorithme
sur un jeu de donnes de taille n.
Complexit au pire : T
max
(n) = max
dD
n
C(d). Cest le plus grand nombre doprations quaura excuter lalgo-
rithme sur un jeu de donnes de taille xe, ici n.
Avantage : il sagit dun maximum, et lalgorithme nira donc toujours avant davoir effectu T
max
(n) oprations.
Inconvnient : cette complexit peut ne pas reter le comportement usuel de lalgorithme, le pire cas pouvant
ne se produire que trs rarement, mais il nest pas rare que le cas moyen soit aussi mauvais que le pire cas.
13
14 CHAPITRE 2. COMPLEXIT ET OPTIMALIT; PREMIER ALGORITHME DE TRI
Complexit en moyenne : T
moy
(n) =

dDn
C(d)
[D
n
[
. Cest la moyenne des complexits de lalgorithme sur des jeux de
donnes de taille n (en toute rigueur, il faut bien videmment tenir compte de la probabilit dapparition de
chacun des jeux de donnes).
Avantage : rete le comportement gnral de lalgorithme si les cas extrmes sont rares ou si la complexit
varie peu en fonction des donnes.
Inconvnient : la complexit en pratique sur un jeu de donnes particulier peut tre nettement plus importante
que la complexit en moyenne, dans ce cas la complexit en moyenne ne donnera pas une bonne indication du
comportement de lalgorithme.
En pratique, nous ne nous intresserons qu la complexit au pire et la complexit en moyenne.
Dnition 3 (Optimalit). Un algorithme est dit optimal si sa complexit est la complexit minimale parmi les
algorithmes de sa classe.
Nous nous intresserons quasi exclusivement la complexit en temps des algorithmes. Il est parfois intressant de
sintresser dautres de leurs caractristiques, comme la complexit en espace (taille de lespace mmoire utilis), la
largeur de bande passante requise, etc.
2.1.3 Modle de machine
Pour que le rsultat de lanalyse dun algorithme soit pertinent, il faut avoir un modle de la machine sur laquelle
lalgorithme sera implment (sous forme de programme). On prendra comme rfrence un modle de machine
accs alatoire (RAM) et processeur unique, o les instructions sont excutes lune aprs lautre, sans oprations
simultanes.
2.2 Illustration : cas du tri par insertion
2.2.1 Problmatique du tri
Entre : une squence de n nombres, a
1
, ..., a
n
.
Sortie : une permutation, a
/
1
, ..., a
/
n
, de la squence dentre, telle que a
/
1
a
/
2
... a
/
n
.
2.2.2 Principe du tri par insertion
De manire rpte, on retire un nombre de la squence dentre et on linsre la bonne place dans la squence
des nombres dj tris (ce principe est le mme que celui utilis pour trier une poigne de cartes).
2.2.3 Algorithme
TRI-INSERTION
Pour j 2 n faire
cl A[ j]
i j 1
tant que i > 0 et A[i] > cl faire
A[i +1] A[i]
i i 1
A[i +1] cl
On retire un nombre de la squence dentre
Les j 1 premiers lments de A sont dj tris.
Tant que lon nest pas arriv au dbut du tableau,
et que llment courant est plus grand que celui insrer.
On dcale llment courant (on le met dans la place vide).
On sintresse llment prcdent.
Finalement, on a trouv o insrer notre nombre.
2.2.4 Exemple
Les diffrentes tapes de lexcution de lalgorithme TRI-INSERTION sur le tableau [5; 2; 4; 6; 1; 3] sont prsentes
gure 2.1.
2.2. ILLUSTRATION : CAS DU TRI PAR INSERTION 15
FIG. 2.1 Action de TRI-INSERTION sur le tableau [5; 2; 4; 6; 1; 3] ; llment insrer est entour par un cercle.
2.2.5 Complexit
Nous passons en revue les diffrentes tapes de notre algorithme an dvaluer son temps dexcution. Pour ce
faire, nous attribuons un cot en temps chaque instruction, et nous comptons le nombre dexcutions de chacune des
instructions. Pour chaque valeur de j [2, n], nous notons t
j
le nombre dexcutions de la boucle tant que pour cette
valeur de j. Il est noter que la valeur de t
j
dpend des donnes...
TRI-INSERTION
Pour j 2 n faire
cl A[ j]
i j 1
tant que i > 0 et A[i] > cl faire
A[i +1] A[i]
i i 1
A[i +1] cl
Cot
c
1
c
2
c
3
c
4
c
5
c
6
c
7
Nombre dexcutions
n
n1
n1

n
j=2
t
j

n
j=2
(t
j
1)

n
j=2
(t
j
1)
n1
Le temps dexcution total de lalgorithme est alors :
T(n) = c
1
n+c
2
(n1) +c
3
(n1) +c
4
n

j=2
t
j
+c
5
n

j=2
(t
j
1) +c
6
n

j=2
(t
j
1) +c
7
(n1)
Complexit au meilleur : le cas le plus favorable pour lalgorithme TRI-INSERTION est quand le tableau est dj
tri, comme le montre le cas j = 4 de la gure 2.1. Dans ce cas t
j
= 1 pour tout j.
T(n) = c
1
n+c
2
(n1) +c
3
(n1) +c
4
(n1) +c
7
(n1)
= (c
1
+c
2
+c
3
+c
4
+c
7
)n(c
2
+c
3
+c
4
+c
7
).
T(n) peut ici tre crit sous la forme T(n) = an +b, a et b tant des constantes indpendantes des entres, et
T(n) est donc une fonction linaire de n.
Le plus souvent, comme cest le cas ici, le temps dexcution dun algorithme est x pour une entre donne ;
mais il existe des algorithmes alatoires intressants dont le comportement peut varier mme pour une entre
xe. Nous verrons un algorithme de ce style au chapitre 4 : une version alatoire du tri rapide
Complexit au pire : le cas le plus dfavorable pour lalgorithme TRI-INSERTION est quand le tableau est dj tri
dans lordre inverse, comme le montre le cas j = 5 de la gure 2.1. Dans ce cas t
j
= j pour tout j.
Rappel :
n
j=1
j =
n(n+1)
2
. Donc
n
j=2
j =
n(n+1)
2
1 et
n
j=2
( j 1) =
n(n1)
2
.
T(n) = c
1
n+c
2
(n1) +c
3
(n1) +c
4
_
n(n+1)
2
1
_
+c
5
_
n(n1)
2
_
+c
6
_
n(n1)
2
_
+c
7
(n1)
=
_
c
4
2
+
c
5
2
+
c
6
2
_
n
2
+
_
c
1
+c
2
+c
3
+
c
4
2

c
5
2

c
6
2
+c
7
_
n(c
2
+c
3
+c
4
+c
7
).
T(n) peut ici tre crit sous la forme T(n) = an
2
+bn +c, a, b et c tant des constantes, et T(n) est donc une
fonction quadratique de n.
16 CHAPITRE 2. COMPLEXIT ET OPTIMALIT; PREMIER ALGORITHME DE TRI
Complexit en moyenne : supposons que lon applique lalgorithme de tri par insertion n nombres choisis au ha-
sard. Quelle sera la valeur de t
j
? Cest--dire, o devra-t-on insrer A[ j] dans le sous-tableau A[1.. j 1] ?
En moyenne, pour moiti les lments de A[1.. j 1] sont infrieurs A[ j], et pour moiti suprieurs. Donc
t
j
= j/2. Si lon reporte cette valeur dans lquation dnissant T(n), on obtient, comme dans le pire cas, une
fonction quadratique en n.
Caveat : ce raisonnement est partiellement faux ; un raisonnement prcis doit bien videmment tenir compte des
valeurs des lments dj tris. Pour un calcul prcis, voir KNUTH [4, p. 82]. CORI et LVY [1, p. 26] font un
autre raisonnement et trouve un autre rsultat (de mme ordre de grandeur). Les deux sont justes : tout dpend de
lhypothse que lon prend sur les jeux de donnes. Ainsi [1] suppose que les permutations sont quiprobables,
et [4] que les valeurs trier sont quiprobables...
Ordre de grandeur
Ce qui nous intresse vraiment, cest lordre de grandeur du temps dexcution. Seul le terme dominant de la
formule exprimant la complexit nous importe, les termes dordres infrieurs ntant pas signicatifs quand n devient
grand. On ignore galement le coefcient multiplicateur constant du terme dominant. On crira donc, propos de la
complexit du tri par insertion :
meilleur cas : (n).
pire cas : (n
2
).
en moyenne : (n
2
).
En gnral, on considre quun algorithme est plus efcace quun autre si sa complexit dans le pire cas a un ordre
de grandeur infrieur.
Classes de complexit
Les algorithmes usuels peuvent tre classs en un certain nombre de grandes classes de complexit :
Les algorithmes sub-linaires dont la complexit est en gnral en O(logn).
Les algorithmes linaires en complexit O(n) et ceux en complexit en O(nlogn) sont considrs comme ra-
pides.
Les algorithmes polynomiaux en O(n
k
) pour k > 3 sont considrs comme lents, sans parler des algorithmes
exponentiels (dont la complexit est suprieure tout polynme en n) que lon saccorde dire impraticables
ds que la taille des donnes est suprieure quelques dizaines dunits.
Chapitre 3
La rcursivit
et le paradigme diviser pour rgner
3.1 Rcursivit
De lart dcrire des programmes qui rsolvent des problmes que lon ne sait pas rsoudre soi-mme !
3.1.1 Dnition
Dnition 4 (Dnition rcursive, algorithme rcursif). Une dnition rcursive est une dnition dans laquelle
intervient ce que lon veut dnir. Un algorithme est dit rcursif lorsquil est dni en fonction de lui-mme.
Dans le cadre de ce cours, nous ne nous intresserons quaux programmes et algorithmes rcursifs. Mais la notion
de dnition rcursive est beaucoup plus gnrale :
en mathmatiques : dnition de lexponentielle : x R, f
/
(x) = f (x) et f (0) = 1.
en programmation : dnition en Ocaml dune liste innie dont tous les lments valent 1 :
let rec z = 1::z ; ;
3.1.2 Rcursivit simple
Revenons la fonction puissance x x
n
. Cette fonction peut tre dnie rcursivement :
x
n
=
_
1 si n = 0;
x x
n1
si n 1.
Lalgorithme correspondant scrit :
PUISSANCE (x, n)
Si n = 0 alors renvoyer 1
sinon renvoyer xPUISSANCE(x, n1)
3.1.3 Rcursivit multiple
Une dnition rcursive peut contenir plus dun appel rcursif. Nous voulons calculer ici les combinaisons C
p
n
en
se servant de la relation de Pascal :
C
p
n
=
_
1 si p = 0 ou p = n;
C
p
n1
+C
p1
n1
sinon.
Lalgorithme correspondant scrit :
17
18 CHAPITRE 3. LA RCURSIVIT ET LE PARADIGME DIVISER POUR RGNER
COMBINAISON (n, p)
Si p = 0 ou p = n alors renvoyer 1
sinon renvoyer COMBINAISON (n1, p) + COMBINAISON (n1, p1)
Bref, rien de particulier...
3.1.4 Rcursivit mutuelle
Des dnitions sont dites mutuellement rcursives si elles dpendent les unes des autres. a peut tre le cas pour
la dnition de la parit :
pair(n) =
_
vrai si n = 0;
impair(n1) sinon;
et impair(n) =
_
faux si n = 0;
pair(n1) sinon.
Les algorithmes correspondants scrivent :
PAIR (n)
Si n = 0 alors renvoyer vrai
sinon renvoyer IMPAIR (n1)
IMPAIR (n)
Si n = 0 alors renvoyer faux
sinon renvoyer PAIR (n1)
3.1.5 Rcursivit imbrique
La fonction dAckermann est dnie comme suit :
A(m, n) =
_
_
_
n+1 si m = 0
A(m1, 1) si m > 0 et n = 0
A(m1, A(m, n1)) sinon
do lalgorithme :
ACKERMANN(m, n)
si m = 0
alors n+1
sinon si n = 0 alors ACKERMANN(m1, 1)
sinon ACKERMANN(m1, ACKERMANN(m, n1))
En rsum : on peut utiliser la rcursivit comme lon veut, peu prs nimporte comment...
3.1.6 Principe et dangers de la rcursivit
Principe et intrt : ce sont les mmes que ceux de la dmonstration par rcurrence en mathmatiques. On doit avoir :
un certain nombre de cas dont la rsolution est connue, ces cas simples formeront les cas darrt de la
rcursion ;
un moyen de se ramener dun cas compliqu un cas plus simple .
La rcursivit permet dcrire des algorithmes concis et lgants.
Difcults :
la dnition peut tre dnue de sens :
Algorithme A(n)
renvoyer A(n)
il faut tre srs que lon retombera toujours sur un cas connu, cest--dire sur un cas darrt ; il nous faut
nous assurer que la fonction est compltement dnie, cest--dire, quelle est dnie sur tout son domaine
dapplications.
Moyen : existence dun ordre strict tel que la suite des valeurs successives des arguments invoqus par la dnition
soit strictement monotone et nit toujours par atteindre une valeur pour laquelle la solution est explicitement
dnie.
Lalgorithme ci-dessous teste si a est un diviseur de b.
3.1. RCURSIVIT 19
DIVISEUR (a,b)
Si a 0 alors Erreur
sinon si a b alors a = b (test dgalit)
sinon DIVISEUR(a,ba)
La suite des valeurs b, ba, b2a, etc. est strictement dcroissante, car a est strictement positif, et on nit
toujours pas aboutir un couple darguments (a, b) tel que ba est ngatif, cas dni explicitement.
Cette mthode ne permet pas de traiter tous les cas :
SYRACUSE(n)
Si n = 0 ou n = 1 alors 1
sinon si n mod 2 = 0 alors SYRACUSE (n/2)
sinon SYRACUSE (3n+1)
Problme ouvert : lalgorithme est bien dni et vaut 1 sur N.
Question : Ny a-t-il vraiment aucun moyen de dterminer automatiquement si un algorithme rcursif quelconque va
terminer ? Rponse la section suivante...
3.1.7 Non dcidabilit de la terminaison
Question : peut-on crire un programme qui vrie automatiquement si un programme donn P termine quand il
est excut sur un jeu de donnes D ?
Entre Un programme P et un jeu de donnes D.
Sortie vrai si le programme P termine sur le jeu de donnes D, et faux sinon.
Dmonstration de la non dcidabilit
Supposons quil existe un tel programme, nomm termine, de vrication de la terminaison. partir de ce
programme on conoit le programme Q suivant :
programme Q
rsultat = termine(Q, / 0)
tant que rsultat = vrai faire attendre une seconde n tant que
renvoyer rsultat
Supposons que le programme Q qui ne prend pas darguments termine. Donc termine(Q, / 0) renvoie vrai, la
deuxime instruction de Q boucle indniment et Q ne termine pas. Il y a donc contradiction et le programme Q ne
termine pas. Donc, termine(Q, / 0) renvoie faux, la deuxime instruction de Q ne boucle pas, et le programme Q termine
normalement. Il y a une nouvelle fois contradiction : par consquent, il nexiste pas de programme tel que termine,
cest--dire qui vrie quun programme termine ou non sur un jeu de donnes...
Le problme de la terminaison est indcidable !
Petit historique : cf. [1, p. 48].
3.1.8 Importance de lordre des appels rcursifs
Fonction qui afche les entiers par ordre dcroissant, de n jusqu 1 :
DCROISSANT(n)
Si n = 0 alors ne rien faire
sinon afcher n
DCROISSANT(n1)
Excution pour n = 2 :
20 CHAPITRE 3. LA RCURSIVIT ET LE PARADIGME DIVISER POUR RGNER
Appel de DCROISSANT(2)
Afchage de 2.
Appel de DCROISSANT(1)
Afchage de 1.
Appel de DCROISSANT(0)
Lalgorithme ne fait rien.
Rsultat afchage dabord de 2 puis de 1 : lafchage a lieu dans lordre dcroissant.
Intervertissons maintenant lordre de lafchage et de lappel rcursif :
CROISSANT(n)
Si n = 0 alors ne rien faire
sinon CROISSANT(n1)
afcher n
Excution pour n = 2 :
Appel de CROISSANT(2)
Appel de CROISSANT(1)
Appel de CROISSANT(0)
Lalgorithme ne fait rien.
Afchage de 1.
Afchage de 2.
Rsultat afchage dabord de 1 puis de 2 : lafchage a lieu dans lordre croissant.
3.1.9 Exemple dalgorithme rcursif : les tours de Hano
Le problme
Le jeu est constitu dune plaquette de bois o sont plantes trois tiges. Sur ces tiges sont enls des disques de
diamtres tous diffrents. Les seules rgles du jeu sont que lon ne peut dplacer quun seul disque la fois, et quil
est interdit de poser un disque sur un disque plus petit.
Au dbut tous les disques sont sur la tige de gauche, et la n sur celle de droite.
Rsolution
Voir la gure 3.1.
Hypothse : on suppose que lon sait rsoudre le problme
pour (n1) disques.
Principe : pour dplacer n disques de la tige A vers la tige C,
on dplace les (n1) plus petits disques de la tige A vers la
tige B, puis on dplace le plus gros disque de la tige A vers
la tige C, puis on dplace les (n1) plus petits disques de
la tige B vers la tige C.
Validit : il ny a pas de viol des rgles possible puisque le
plus gros disque est toujours en bas dune tige et que
lhypothse (de rcurrence) nous assure que nous savons
dplacer le bloc de (n 1) disques en respectant les
rgles.
FIG. 3.1 Mthode de rsolution du jeu des tours de Hano.
3.2. DRCURSIVATION 21
Algorithme
HANO(n, dpart, intermdiaire, destination)
Si n = 1 alors dplacer le disque suprieur de la tige dpart vers la tige destination
sinon HANO(n1, dpart, destination, intermdiaire)
dplacer le disque suprieur de la tige dpart vers la tige destination
HANO(n1, intermdiaire, dpart, destination)
Excution avec trois disques
1. Dplace un disque de la tige dpart vers la tige destination
2. Dplace un disque de la tige dpart vers la tige intermdiaire
3. Dplace un disque de la tige destination vers la tige intermdiaire
4. Dplace un disque de la tige dpart vers la tige destination
5. Dplace un disque de la tige intermdiaire vers la tige dpart
6. Dplace un disque de la tige intermdiaire vers la tige destination
7. Dplace un disque de la tige dpart vers la tige destination
Il ne faut pas chercher comprendre comment a marche, mais pourquoi a marche...
Complexit
On compte le nombre de dplacements de disques effectus par lalgorithme HANO invoqu sur n disques.
C(n) =
_
1 si n = 1
C(n1) +1+C(n1) sinon
=
_
1 si n = 1
1+2C(n1) sinon
do lon en dduit que C(n) = 2
n
1. On a donc ici un algorithme de complexit exponentielle.
3.2 Drcursivation
Drcursiver, cest transformer un algorithme rcursif en un algorithme quivalent ne contenant pas dappels r-
cursifs.
3.2.1 Rcursivit terminale
Dnition 5 (Rcursivit terminale). Un algorithme est dit rcursif terminal sil ne contient aucun traitement aprs
un appel rcursif.
Exemple :
ALGORITHME P(U)
si C alors D; P((U))
sinon T
o :
U est la liste des paramtres ;
C est une condition portant sur U ;
D est le traitement de base de lalgorithme (dpendant de U) ;
(U) reprsente la transformation des paramtres ;
T est le traitement de terminaison (dpendant de U).
Avec ces notations, lalgorithme P quivaut lalgorithme suivant :
22 CHAPITRE 3. LA RCURSIVIT ET LE PARADIGME DIVISER POUR RGNER
ALGORITHME P(U)
tant que C faire D;U (U)
T
Lalgorithme P est une version drcursive de lalgorithme P.
3.2.2 Rcursivit non terminale
Ici, pour pouvoir drcursiver, il va falloir sauvegarder le contexte de lappel rcursif, typiquement les paramtres
de lappel engendrant lappel rcursif. Originellement, lalgorithme est :
ALGORITHME Q(U)
si C(U) alors D(U); Q((U)); F(U)
sinon T(U)
Les piles sont des structures de stockage (via les primitives empiler et dpiler) qui fonctionnent sur le principe
le dernier entr est le premier sorti (cf. chapitre 5). Les compilateurs utilisent des piles pour stocker les paramtres
des appels de fonctions, et en particulier lors de la transcription des fonctions rcursives. Nous mimons ici lutilisation
des piles pour drcursiver lalgorithme.
Aprs drcursivation on obtiendra donc :
ALGORITHME Q(U)
empiler(nouvel_appel, U)
tant que pile non vide faire
dpiler(tat, V)
si tat = nouvel_appel alors U V
si C(U) alors D(U)
empiler(n, U)
empiler(nouvel_appel, (U))
sinon T(U)
si tat = n alors U V
F(U)
Illustration de la drcursivation de lalgorithme Q
Exemple dexcution de Q :
Appel Q(U
0
)
C(U
0
) vrai
D(U
0
)
Appel Q((U
0
))
C((U
0
)) vrai
D((U
0
))
Appel Q(((U
0
)))
C(((U
0
))) faux
T(((U
0
)))
F((U
0
))
F(U
0
)
Lexcution correspondante de Q est prsente gure 3.2. Les instructions de gestion de piles y gurent en italic,
et les instructions de lalgorithme originel (ce qui nous importe) y gurent en gras.
3.3. DIVISER POUR RGNER 23
Appel Q(U
0
)
empiler(nouvel_appel, U))
pile = [(nouvel_appel, U
0
)]
dpiler(tat, V))
tat nouvel_appel ; V U
0
; pile = []
U U
0
C(U
0
) vrai
D(U
0
)
empiler(n, U))
pile = [(n, U
0
)]
empiler(nouvel_appel, (U)))
pile = [(n, U
0
) ; (nouvel_appel, (U
0
))]
dpiler(tat, V))
tat nouvel_appel ; V (U
0
) ; pile = [(n, U
0
)]
U (U
0
)
C((U
0
)) vrai
D((U
0
))
empiler(n, U))
pile = [(n, U
0
) ; (n, (U
0
))]
empiler(nouvel_appel, (U)))
pile = [(n, U
0
) ; (n, (U
0
)) ; (nouvel_appel, ((U
0
)))]
dpiler(tat, V))
tat nouvel_appel ; V ((U
0
)) ; pile = [(n, U
0
) ; (n, (U
0
))]
U ((U
0
))
C(((U
0
))) faux
T(((U
0
)))
dpiler(tat, V))
tat n ; V (U
0
) ; pile = [(n, U
0
)]
F((U
0
))
dpiler(tat, V))
tat n ; V U
0
; pile = []
F(U
0
)
FIG. 3.2 Exemple dexcution de lalgorithme drcursiv.
3.2.3 Remarques
Les programmes itratifs sont souvent plus efcaces, mais les programmes rcursifs sont plus faciles crire. Les
compilateurs savent, la plupart du temps, reconnatre les appels rcursifs terminaux, et ceux-ci nengendrent pas de
surcot par rapport la version itrative du mme programme.
Il est toujours possible de drcursiver un algorithme rcursif.
3.3 Diviser pour rgner
3.3.1 Principe
Nombres dalgorithmes ont une structure rcursive : pour rsoudre un problme donn, ils sappellent eux-mmes
rcursivement une ou plusieurs fois sur des problmes trs similaires, mais de tailles moindres, rsolvent les sous-
problmes de manire rcursive puis combinent les rsultats pour trouver une solution au problme initial.
Le paradigme diviser pour rgner donne lieu trois tapes chaque niveau de rcursivit :
Diviser : le problme en un certain nombre de sous-problmes ;
24 CHAPITRE 3. LA RCURSIVIT ET LE PARADIGME DIVISER POUR RGNER
Rgner : sur les sous-problmes en les rsolvant rcursivement ou, si la taille dun sous-problme est assez rduite,
le rsoudre directement ;
Combiner : les solutions des sous-problmes en une solution complte du problme initial.
3.3.2 Premier exemple : multiplication nave de matrices
Nous nous intressons ici la multiplication de matrices carrs de taille n.
Algorithme naf
Lalgorithme classique est le suivant :
MULTIPLIER-MATRICES(A, B)
Soit n la taille des matrices carrs A et B
Soit C une matrice carr de taille n
Pour i 1 n faire
Pour j 1 n faire
c
i, j
0
Pour k 1 n faire
c
i, j
c
i, j
+a
i,k
.b
k, j
renvoyer C
Cet algorithme effectue (n
3
) multiplications et autant dadditions.
Algorithme diviser pour rgner naf
Dans la suite nous supposerons que n est une puissance exacte de 2. Dcomposons les matrices A, B et C en
sous-matrices de taille n/2n/2. Lquation C = AB peut alors se rcrire :
_
r s
t u
_
=
_
a b
c d
__
e g
f h
_
.
En dveloppant cette quation, nous obtenons :
r = ae +b f , s = ag+bh, t = ce +d f et u = cg+dh.
Chacune de ces quatre oprations correspond deux multiplications de matrices carrs de taille n/2 et une addition
de telles matrices. partir de ces quations on peut aisment driver un algorithme diviser pour rgner dont la
complexit est donne par la rcurrence :
T(n) = 8T(n/2) +(n
2
),
laddition des matrices carrs de taille n/2 tant en (n
2
).
3.3.3 Analyse des algorithmes diviser pour rgner
Lorsquun algorithme contient un appel rcursif lui-mme, son temps dexcution peut souvent tre dcrit par
une quation de rcurrence qui dcrit le temps dexcution global pour un problme de taille n en fonction du temps
dexcution pour des entres de taille moindre.
La rcurrence dnissant le temps dexcution dun algorithme diviser pour rgner se dcompose suivant les
trois tapes du paradigme de base :
1. Si la taille du problme est sufsamment rduite, n c pour une certaine constante c, la rsolution est directe et
consomme un temps constant (1).
2. Sinon, on divise le problme en a sous-problmes chacun de taille 1/b de la taille du problme initial. Le temps
dexcution total se dcompose alors en trois parties :
3.3. DIVISER POUR RGNER 25
(a) D(n) : le temps ncessaire la division du problme en sous-problmes.
(b) aT(n/b) : le temps de rsolution des a sous-problmes.
(c) C(n) : le temps ncessaire pour construire la solution nale partir des solutions aux sous-problmes.
La relation de rcurrence prend alors la forme :
T(n) =
_
(1) si n c,
aT(n/b) +D(n) +C(n) sinon,
o lon interprte n/b soit comme n/b|, soit comme n/b|.
3.3.4 Rsolution des rcurrences
Thorme 1 (Rsolution des rcurrences diviser pour rgner ).
Soient a 1 et b > 1 deux constantes, soit f (n) une fonction et soit T(n) une fonction dnie pour les entiers positifs
par la rcurrence :
T(n) = aT(n/b) + f (n),
o lon interprte n/b soit comme n/b|, soit comme n/b|.
T(n) peut alors tre borne asymptotiquement comme suit :
1. Si f (n) = O(n
(log
b
a)
) pour une certaine constante > 0, alors T(n) = (n
log
b
a
).
2. Si f (n) = (n
log
b
a
), alors T(n) = (n
log
b
a
logn).
3. Si f (n) =(n
(log
b
a)+
) pour une certaine constante > 0, et si af (n/b) c f (n) pour une constante c < 1 et n
sufsamment grand, alors T(n) = ( f (n)).
Remarques :
1. Le remplacement des termes T(n/b) par T(n/b|) ou T(n/b|) naffecte pas le comportement asymptotique de
la rcurrence [2, section 4.4.2]. On omettra donc en gnral les parties entires.
2. Le thorme 1 ne couvre pas toutes les possibilit pour f (n). Par exemple, il y a un trou entre les cas 1 et 2
quand f (n) est plus petite que n
log
b
a
, mais pas polynomialement. Dans un tel cas, on ne peut tout simplement
pas appliquer le thorme 1.
Retour sur le premier exemple
Utilisons le thorme 1 pour calculer la complexit de notre algorithme de multiplication de matrices diviser
pour rgner naf. Ici, a = 8, b = 2 et f (n) = (n
2
). Donc log
b
a = 3, nous nous trouvons dans le cas 1 du thorme
(avec = 1), lalgorithme a une complexit en (n
3
) et nous navons rien gagn...
3.3.5 Deuxime exemple : algorithme de Strassen pour la multiplication de matrices
Lalgorithme de Strassen est un algorithme diviser pour rgner qui neffectue que 7 multiplications de matrices,
contrairement 8 dans lalgorithme prcdent, mais qui effectue plus dadditions et de soustractions de matrices, ce
qui est sans consquence une addition de matrices tant gratuite par rapport au cot dune multiplication.
Complexit
La complexit de lalgorithme de Strassen est donne par la rcurrence :
T(n) = 7T(n/2) +(n
2
).
En utilisant le thorme 1, nous obtenons comme complexit : T(n) = (n
log
2
7
) = O(n
2,81
).
26 CHAPITRE 3. LA RCURSIVIT ET LE PARADIGME DIVISER POUR RGNER
Algorithme
Il se dcompose en quatre tapes :
1. Diviser les matrices A et B en matrices carrs de taille n/2.
2. Au moyen de (n
2
) additions et soustractions scalaires, calculer 14 matrices ( prciser) A
1
, ..., A
7
, B
1
, ..., B
7
carrs de taille n/2.
3. Calculer rcursivement les 7 produits de matrices P
i
= A
i
B
i
, i [1; 7].
4. Calculer les sous-matrices dsires r, s, t et u en additionnant et/ou soustrayant les combinaisons idoines des
matrices P
i
ad-hoc, laide de (n
2
) additions et soustractions scalaires.
Produits de sous-matrices
Nous supposons que chaque matrice produit P
i
peut scrire sous la forme :
P
i
= A
i
B
i
= (
i,1
a+
i,2
b+
i,3
c +
i,4
d).(
i,1
e +
i,2
f +
i,3
g+
i,4
h),
o les coefcients
i, j
et
i, j
sont tous pris dans lensemble 1; 0; 1. Nous supposons donc que chaque produit peut
tre obtenu en additionnant et soustrayant certaines des sous-matrices de A, en additionnant et soustrayant certaines
des sous-matrices de B, et en multipliant les deux matrices ainsi obtenues.
Rcrivons lquation dnissant r :
r = ae +bf = (a b c d)
_
_
_
_
+1 0 0 0
0 +1 0 0
0 0 0 0
0 0 0 0
_
_
_
_
_
_
_
_
e
f
g
h
_
_
_
_
=
e f g h
a
b
c
d
_
_
_
_
+ . . .
. + . .
. . . .
. . . .
_
_
_
_
o + reprsente +1 , . reprsente 0 et - reprsente -1 . Nous rcrivons de mme les quations
dnissant s, t et u :
s = ag+bh =
e f g h
a
b
c
d
_
_
_
_
. . + .
. . . +
. . . .
. . . .
_
_
_
_
,
t = ce +d f =
e f g h
a
b
c
d
_
_
_
_
. . . .
. . . .
+ . . .
. + . .
_
_
_
_
,
u = cg+dh =
e f g h
a
b
c
d
_
_
_
_
. . . .
. . . .
. . + .
. . . +
_
_
_
_
.
On remarque que lon peut calculer s par s = P
1
+P
2
o P
1
et P
2
sont calcules chacune au moyen dune unique
multiplication de matrice :
P
1
= A
1
B
1
= a.(gh) = agah =
_
_
_
_
. . +
. . . .
. . . .
. . . .
_
_
_
_
, P
2
= A
2
B
2
= (a+b).h = ah+bh =
_
_
_
_
. . . +
. . . +
. . . .
. . . .
_
_
_
_
.
3.3. DIVISER POUR RGNER 27
De mme la matrice t peut tre calcule par t = P
3
+P
4
avec :
P
3
= A
3
B
3
= (c +d).e = ce +de =
_
_
_
_
. . . .
. . . .
+ . . .
+ . . .
_
_
_
_
, P
4
= A
4
B
4
= d.( f e) = d f de =
_
_
_
_
. . . .
. . . .
. . . .
+ . .
_
_
_
_
.
Pour calculer r et u on introduit une matrice P
5
dnie comme suit :
P
5
= A
5
B
5
= (a+d).(e +h) =
_
_
_
_
+ . . +
. . . .
. . . .
+ . . +
_
_
_
_
,
et on cherche obtenir r partir de P
5
:
r =
_
_
_
_
+ . . .
. + . .
. . . .
. . . .
_
_
_
_
=
_
_
_
_
+ . . +
. . . .
. . . .
+ . . +
_
_
_
_
+
_
_
_
_
. . .
. + . .
. . . .
. .
_
_
_
_
=
_
_
_
_
+ . . +
. . . .
. . . .
+ . . +
_
_
_
_
+
_
_
_
_
. . . .
. . . .
. . . .
+ . .
_
_
_
_
+
_
_
_
_
. . .
. + . .
. . . .
. .
_
_
_
_
=
_
_
_
_
+ . . +
. . . .
. . . .
+ . . +
_
_
_
_
+
_
_
_
_
. . . .
. . . .
. . . .
+ . .
_
_
_
_
+
_
_
_
_
. . .
. . .
. . . .
. . . .
_
_
_
_
+
_
_
_
_
. . . .
. + . +
. . . .
. .
_
_
_
_
.
Do, en posant
P
6
= A
6
B
6
= (bd).( f +h)
_
_
_
_
. . . .
. + . +
. . . .
. .
_
_
_
_
,
on obtient r = P
5
+P
4
P
2
+P
6
.
28 CHAPITRE 3. LA RCURSIVIT ET LE PARADIGME DIVISER POUR RGNER
De mme, on cherche obtenir u partir de P
5
:
u =
_
_
_
_
. . . .
. . . .
. . + .
. . . +
_
_
_
_
=
_
_
_
_
+ . . +
. . . .
. . . .
+ . . +
_
_
_
_
+
_
_
_
_
. .
. . . .
. . + .
. . .
_
_
_
_
=
_
_
_
_
+ . . +
. . . .
. . . .
+ . . +
_
_
_
_
+
_
_
_
_
. . +
. . . .
. . . .
. . . .
_
_
_
_
+
_
_
_
_
. .
. . . .
. . + .
. . .
_
_
_
_
=
_
_
_
_
+ . . +
. . . .
. . . .
+ . . +
_
_
_
_
+
_
_
_
_
. . +
. . . .
. . . .
. . . .
_
_
_
_
+
_
_
_
_
. . . .
. . . .
. . .
. . .
_
_
_
_
+
_
_
_
_
. .
. . . .
+ . + .
. . . .
_
_
_
_
.
Do, en posant
P
7
= A
7
B
7
= (ac).(e +g) = ae +agce cg =
_
_
_
_
+ . + .
. . . .
. .
. . . .
_
_
_
_
,
on obtient u = P
5
+P
1
P
3
P
7
.
Discussion
Lalgorithme de Strassen nest intressant en pratique que pour de grandes matrices (n > 45) denses (peu dl-
ments non nuls).
La meilleure borne suprieure connue pour la multiplication de matrices carrs de taille n est environ en O(n
2,376
).
La meilleure borne infrieure connue est en (n
2
) (il faut gnrer n
2
valeurs). On ne connat donc toujours pas le
niveau de difcult rel dune multiplication de matrices !
Chapitre 4
Algorithmes de tri
4.1 Tri par fusion
4.1.1 Principe
Lalgorithme de tri par fusion est construit suivant le paradigme diviser pour rgner :
1. Il divise la squence de n nombres trier en deux sous-squences de taille n/2.
2. Il trie rcursivement les deux sous-squences.
3. Il fusionne les deux sous-squences tries pour produire la squence complte trie.
La rcursion termine quand la sous-squence trier est de longueur 1... car une telle squence est toujours trie.
4.1.2 Algorithme
La principale action de lalgorithme de tri par fusion est justement la fusion des deux listes tries.
La fusion
Le principe de cette fusion est simple : chaque tape, on compare les lments minimaux des deux sous-listes
tries, le plus petit des deux tant llment minimal de lensemble on le met de ct et on recommence. On conoit
ainsi un algorithme FUSIONNER qui prend en entre un tableau A et trois entiers, p, q et r, tels que p q < r et tels
que les tableaux A[p..q] et A[q+1..r] soient tris. Lalgorithme est prsent gure 4.1.
Complexit de la fusion
tudions les diffrentes tapes de lalgorithme :
les initialisations ont un cot constant (1) ;
la boucle tant que de fusion sexcute au plus r p fois, chacune de ses itrations tant de cot constant, do
un cot total en O(r p) ;
les deux boucles tant que compltant C ont une complexit respective au pire de qp+1 et de r q, ces deux
complexits tant en O(r p) ;
la recopie nale cote (r p+1).
Par consquent, lalgorithme de fusion a une complexit en (r p).
Le tri
crire lalgorithme de tri par fusion est maintenant une trivialit (cf. gure 4.2).
29
30 CHAPITRE 4. ALGORITHMES DE TRI
FUSIONNER(A, p, q, r)
i p
j q+1
Soit C un tableau de taille r p+1
k 1
tant que i q et j r faire
si A[i] < A[ j] alors C[k] A[i]
i i +1
sinon C[k] A[ j]
j j +1
k k +1
tant que i q faire C[k] A[i]
i i +1
k k +1
tant que j r faire C[k] A[ j]
j j +1
k k +1
pour k 1 r p+1 faire
A[p+k 1] C[k]
indice servant parcourir le tableau A[p..q]
indice servant parcourir le tableau A[q+1..r]
tableau temporaire dans lequel on construit le rsultat
indice servant parcourir le tableau temporaire
boucle de fusion
on incorpore dans C les lments de A[p..q]
qui ny seraient pas encore ; sil y en a,
les lments de A[q+1..r] sont dj tous dans C
on incorpore dans C les lments de A[q+1..r]
qui ny seraient pas encore ; sil y en a,
les lments de A[p..q] sont dj tous dans C
on recopie le rsultat dans le tableau originel
FIG. 4.1 Algorithme de fusion de deux sous-tableaux adjacents tris.
TRI-FUSION(A, p, r)
si p < r alors q (p+r)/2|
TRI-FUSION(A, p, q)
TRI-FUSION(A, q+1, r)
FUSIONNER(A, p, q, r)
FIG. 4.2 Algorithme de tri par fusion.
4.1.3 Complexit
Pour dterminer la formule de rcurrence qui nous donnera la complexit de lalgorithme TRI-FUSION, nous
tudions les trois phases de cet algorithme diviser pour rgner :
Diviser : cette tape se rduit au calcul du milieu de lintervalle [p; r], sa complexit est donc en (1).
Rgner : lalgorithme rsout rcursivement deux sous-problmes de tailles respectives
n
2
, do une complexit en
2T(
n
2
).
Combiner : la complexit de cette tape est celle de lalgorithme de fusion qui est de (n) pour la construction dun
tableau solution de taille n.
Par consquent, la complexit du tri par fusion est donne par la rcurrence :
T(n) =
_
(1) si n = 1,
2T(
n
2
) +(n) sinon.
Pour dterminer la complexit du tri par fusion, nous utilisons de nouveau le thorme 1. Ici a = 2 et b = 2, donc
log
b
a = 1 et nous nous trouvons dans le deuxime cas du thorme : f (n) = (n
log
b
a
) = (n). Par consquent :
T(n) = (nlogn).
Pour des valeurs de n sufsamment grandes, le tri par fusion avec son temps dexcution en (nlogn) est nettement
plus efcace que le tri par insertion dont le temps dexcution est en (n
2
).
4.2. TRI PAR TAS 31
4.2 Tri par tas
4.2.1 Dnition dun tas
Dnition 6 (Tas). Un tas est un arbre binaire parfait dont tous les niveaux sont complets sauf le dernier qui est
rempli de la gauche vers la droite. Dans un tas, un pre est toujours plus grand que ses deux ls.
Pour un exemple de tas, voir la gure 4.3.
Les tas sont gnralement reprsents et manipuls sous la forme dun tableau :
Un tableau A qui reprsente un tas est un objet deux attributs :
1. longueur(A) qui est le nombre dlments qui peuvent tre stocks dans le tableau A;
2. taille(A) qui est le nombre dlments stocks dans le tableau A.
La racine est stocke dans la premire case du tableau A[1].
Les lments de larbre sont rangs dans lordre, niveau par niveau, et de gauche droite. Les fonctions daccs
aux lments du tableau sont alors :
PRE(i)
renvoyer i/2|
FILS-GAUCHE(i)
renvoyer 2i
FILS-DROIT(i)
renvoyer 2i +1
Proprit des tas : A[PRE(i)] A[i].
16 14 10 8 7 9 3 2 4 1
1 2 3 4 5 6 7 8 9 10
FIG. 4.3 Un tas vu comme un arbre binaire ( gauche) et comme un tableau ( droite). Le nombre lintrieur dun
nud de larbre est la valeur contenue dans ce nud ; le nombre au-dessus est lindice correspondant dans le tableau.
4.2.2 Conservation de la structure de tas
Lalgorithme ENTASSER (cf. gure 4.4) prend en entre un tableau A et un indice i. On suppose que les sous-arbres
de racines GAUCHE(i) et DROIT(i) sont des tas. Par contre, il est possible que A[i] soit plus petit que ses ls (violant
ainsi la proprit de tas). ENTASSER doit faire descendre la valeur de A[i] de sorte que le sous-arbre de racine i soit
un tas. Laction de cet algorithme est illustr par la gure 4.5.
Correction
Le rsultat de lalgorithme ENTASSER est bien un tas car :
La structure de larbre nest pas modie.
32 CHAPITRE 4. ALGORITHMES DE TRI
ENTASSER(A, i)
g GAUCHE(i)
d DROIT(i)
max i
si g taille(A) et A[g] > A[max] alors max g
si d taille(A) et A[d] > A[max] alors max d
si max ,= i alors changer A[i] A[max]
ENTASSER(A, max)
FIG. 4.4 Algorithme ENTASSER
FIG. 4.5 Action de ENTASSER(A, 2) : la conguration initiale (gure gauche) viole la proprit du tas ; pour i = 2
cette proprit est restaure par interversion de la cl avec celle du ls gauche (gure de droite) ; le rsultat nest
toujours pas un tas, et lappel rcursif ENTASSER(A, 4) intervertit la cl du nud i = 4 avec celle de son ls droit ; on
obtient nalement le tas de la gure 4.3.
Un change de valeurs entre un pre et un ls na lieu que si la valeur du ls est suprieure celle du pre. Or
la valeur du pre tait suprieure celles stockes dans ses deux arbres ls excepte la valeur ajoute larbre.
La nouvelle cl de la racine est donc bien plus grande que lintgralit de celles stockes dans larbre dont elle
devient la racine.
Complexit
Le temps dexcution de ENTASSER sur un arbre de taille n est en (1) plus le temps de lexcution rcursive de
ENTASSER sur un des deux sous-arbres, or ces deux sous-arbres ont une taille en au plus
2n
3
(le pire cas survient quand
la dernire range de larbre est exactement remplie moiti). Le temps dexcution de ENTASSER est donc dcrit par
la rcurrence :
T(n) T
_
2n
3
_
+(1)
ce qui, daprs le cas 2 du thorme 1, nous donne : T(n) = (logn), car a = 1, b =
3
2
et log
b
a = 0.
4.2.3 Construction dun tas
La construction se fait simplement par utilisation successive de lalgorithme ENTASSER, comme le montre lalgo-
rithme la gure 4.6.
Complexit
Premire borne : chaque appel entasser cote O(log
2
n) et il y a O(n) appels de ce type. La complexit de
CONSTRUIRE-TAS est donc en O(nlog
2
n). On peut en fait obtenir une borne plus ne.
4.3. TRI RAPIDE (QUICKSORT) 33
CONSTRUIRE-TAS(A, Valeurs)
taille[A] longueur[A]
Pour i
longueur(A)
2
| 1 faire ENTASSER(A,i)
FIG. 4.6 Algorithme CONSTRUIRE-TAS.
En effet, un tas n lments est de hauteur log
2
n| et une hauteur h il contient au maximum
n
2
h+1
| nuds. De
plus, lalgorithme ENTASSER requiert un temps dexcution en O(h) quand il est appel sur un tas de hauteur h. Do :
T(n) =
log
2
n|

j=0
_
n
2
h+1
_
O(h) = O
_
n
log
2
n|

h=0
h
2
h
_
,
or

h=0
h
2
h
= 2.
Do :
T(n) = O(n).
On peut donc construire un tas partir dun tableau en temps linaire.
Illustration de lalgorithme CONSTRUIRE-TAS
Voir la gure 4.7.
4.2.4 Algorithme du tri par tas
TRIER-TAS(A)
CONSTRUIRE-TAS(A)
Pour i longueur(A) 2 faire
changer A[1] A[i]
taille(A) taille(A) 1
ENTASSER(A,1)
Illustration de lalgorithme TRI-TAS
Voir la gure 4.8.
Complexit
La procdure TRIER-TAS prend un temps O(nlog
2
n) car lappel CONSTRUIRE-TAS prend un temps O(n) et que
chacun des n1 appels ENTASSER prend un temps O(log
2
n).
4.3 Tri rapide (Quicksort)
4.3.1 Principe
Le tri rapide est fond sur le paradigme diviser pour rgner , tout comme le tri fusion, il se dcompose donc en
trois tapes :
34 CHAPITRE 4. ALGORITHMES DE TRI
FIG. 4.7 Action de CONSTRUIRE-TAS sur le tableau [4; 1; 3; 2; 16; 9; 10; 14; 8; 7].
4.3. TRI RAPIDE (QUICKSORT) 35
i i
i i
i
4
16
1
14 10
3
i
9
8
7
2
i
i
i
FIG. 4.8 Action de TRIER-TAS sur le tableau [4; 1; 3; 2; 16; 9; 10; 14; 8; 7].
36 CHAPITRE 4. ALGORITHMES DE TRI
Diviser : Le tableau A[p..r] est partitionn (et rarrang) en deux sous-tableaux non vides, A[p..q] et A[q+1..r], tels
que chaque lment de A[p..q] soit infrieur ou gal chaque lment de A[q +1..r]. Lindice q est calcul
pendant la procdure de partitionnement.
Rgner : Les deux sous-tableaux A[p..q] et A[q+1..r] sont tris par des appels rcursifs.
Combiner : Comme les sous-tableaux sont tris sur place, aucun travail nest ncessaire pour les recombiner, le
tableau A[p..r] est dj tri !
4.3.2 Algorithme
TRI-RAPIDE(A, p, r)
si p < r alors q PARTITIONNEMENT(A, p, r)
TRI-RAPIDE(A, p, q)
TRI-RAPIDE(A, q+1, r)
Lappel TRI-RAPIDE(A, 1, longueur(A)) trie le tableau A. Le point principal de lalgorithme est bien videmment le
partitionnement qui rarrange le tableau A sur place :
PARTITIONNEMENT(A, p, r)
x A[p]
i p1
j r +1
tant que VRAI faire
rpter j j 1 jusqu A[ j] x
rpter i i +1 jusqu A[i] x
si i < j alors changer A[i] A[ j]
sinon renvoyer j
Exemple de partitionnement :
1. Situation intiale :
1 2 3 4 5 6 7
4 3 6 2 1 5 7
Nous avons donc x = 4, i = 0 et j = 8.
2. On excute la boucle rpter j j 1 jusqu A[ j] x et on obtient j = 5.
3. On excute la boucle rpter i i +1 jusqu A[i] x , et on obtient i = 1.
4. Aprs lchange on obtient le tableau :
1 2 3 4 5 6 7
1 3 6 2 4 5 7
5. On excute la boucle rpter j j 1 jusqu A[ j] x et on obtient j = 4.
6. On excute la boucle rpter i i +1 jusqu A[i] x , et on obtient i = 3.
7. Aprs lchange on obtient le tableau :
1 2 4 3 5 6 7
1 3 2 6 4 5 7
8. On excute la boucle rpter j j 1 jusqu A[ j] x et on obtient j = 3.
9. On excute la boucle rpter i i +1 jusqu A[i] x , et on obtient i = 3.
10. Comme i = j, lalgorithme se termine et renvoie la valeur 3 .
4.3. TRI RAPIDE (QUICKSORT) 37
4.3.3 Complexit
Pire cas
Le pire cas intervient quand le partitionnement produit une rgion n 1 lments et une un lment, comme
nous le montrerons ci-aprs. Comme le partitionnement cote (n) et que T(1) = (1), la rcurrence pour le temps
dexcution est :
T(n) = T(n1) +(n).
Do par sommation :
T(n) =
n

k=1
(k) =
_
n

k=1
k
_
=
_
n
2
_
.
Pour montrer que cette conguration est bien le pire cas, montrons que dans tous les cas T(n) =O(n
2
), cest--dire
quil existe une constante c telle que T(n) c n
2
. Si T(n) est la complexit au pire :
T(n) = max
1qn1
(T(q) +T(nq)) +(n),
o le paramtre q est dans lintervalle [1..n 1] puisque la procdure PARTITIONNEMENT gnre deux rgions de
tailles chacune au moins gale un. Do :
T(n) max
1qn1
_
cq
2
+c(nq)
2
_
+(n).
Or lexpression q
2
+(n q)
2
atteint son maximum lune des extrmits de lintervalle (drive ngative puis posi-
tive). Do
max
1qn1
_
q
2
+(nq)
2
_
= 1
2
+(n1)
2
= n
2
2(n1).
et
T(n) cn
2
2c(n1) +(n) cn
2
,
puisque lon peut choisir la constante c assez grande pour que le terme 2c(n1) domine le terme (n). Du coup, le
temps dexcution du tri rapide (dans le pire cas) est (n
2
).
Meilleur cas
On subodore que le meilleur cas apparat quand la procdure de partitionnement produit deux rgions de taille
n
2
.
La rcurrence est alors :
T(n) = 2T(
n
2
) +(n),
ce qui, daprs le cas 2 du thorme 1 nous donne
T(n) = (nlogn).
Complexit en moyenne
On suppose que le tableau A ne contient pas deux fois le mme lment.
Version stochastique du tri rapide. Un algorithme est dit stochastique si son comportement est dtermin non
seulement par son entre mais aussi par les valeurs produites par un gnrateur de nombres alatoires. On modie la
procdure PARTITIONNEMENT pour quelle est un comportement stochastique en utilisant une fonction HASARD(a,
b) qui renvoie de manire quiprobable un entier entre les nombres a et b.
PARTITIONNEMENT-STOCHASTIQUE(A, p, r)
i HASARD(p, r)
changer A[p] A[i]
renvoyer PARTITIONNEMENT(A, p, r)
Le but ici est de faciliter lanalyse de lalgorithme et de minimiser linuence des congurations pathologiques.
38 CHAPITRE 4. ALGORITHMES DE TRI
Analyse du partitionnement. La valeur q renvoye par PARTITIONNEMENT ne dpend que du rang de x = A[p]
parmi les lments de A[p..r] (le rang dun nombre dans un ensemble tant le nombre dlments qui lui sont inf-
rieurs ou gaux). Du fait de lencapsulation de PARTITIONNEMENT dans PARTITIONNEMENT-STOCHASTIQUE et de
linterversion de A[p] et dun lment alatoire de A[p..r], rang(x) = i pour i = 1, 2, ..., n avec une probabilit
1
n
en
posant n = r p+1 (cest le nombre dlments de lintervalle [p..r]).
Ce qui nous intresse, cest la taille des partitions. Nous avons deux cas considrer :
1. rang(x) = 1. Lalgorithme PARTITIONNNEMENT sarrte alors avec i = j = 1 et la rgion infrieure de la
partition comprend lunique lment A[p] et est de taille 1.
2. rang(x) 2. Il existe alors au moins un lment (strictement) plus petit que x = A[p]. Par consquent, lors
du passage dans la boucle tant que, lindice i sarrte la valeur i = p mais lindice j sarrte une valeur
strictement infrieure p. Un change est alors effectu et A[p] est plac dans la rgion suprieure. Lorsque
PARTITIONNEMENT se termine, chacun des rang(x) 1 lments de la rgion infrieure de la partition est
strictement infrieur x. Ainsi pour chaque i = 1, 2, ..., n 1, la probabilit pour que la rgion infrieure ait i
lment est de
1
n
Rcurrence pour le cas moyen. Vu ce qui prcde, le temps moyen requis pour le tri dun tableau de longueur n
vaut donc :
T(n) =
1
n
_
T(1) +T(n1) +
n1

q=1
(T(q) +T(nq))
_
+(n).
Comme T(1) = (1) et T(n1) = O(n
2
) (vue ltude du pire cas), on a :
1
n
(T(1) +T(n1)) =
1
n
_
(1) +O(n
2
)
_
= O(n),
et ce terme peut tre absorb par le terme (n) de la formule. Ainsi :
T(n) =
1
n
n1

q=1
(T(q) +T(nq)) +(n) =
2
n
n1

q=1
T(q) +(n).
Rsolution de la rcurrence. On suppose par induction quil existe des constantes strictement positives a et b telles
que T(n) anlogn+b. Si a et b sont tels que lhypothse est vraie pour n = 1 alors, si lon suppose lhypothse vraie
jusquau rang n1, on a :
T(n) =
2
n
n1

q=1
T(q) +(n)
2
n
n1

k=1
(aklogk +b) +(n) =
2a
n
n1

k=1
klogk +
2b
n
(n1) +(n).
Si lon sait que (cf. [2, P. 164]) :
n1

k=1
klogk
1
2
n
2
logn
1
8
n
2
,
on obtient :
T(n)
2a
n
_
1
2
n
2
logn
1
8
n
2
_
+
2b
n
(n1) +(n) anlogn
a
4
n+2b+(n) = anlogn+b+
_
(n) +b
a
4
n
_
do
T(n) anlogn+b,
puisque lon peut choisir a sufsamment grand pour que
a
4
n domine (n) +b. On en conclut que le temps dexcution
moyen du tri rapide est O(nlogn).
Chapitre 5
Structures de donnes lmentaires
5.1 Introduction
En informatique, il existe plusieurs manires de reprsenter la notion mathmatique densemble. Il nexiste pas une
reprsentation qui soit meilleure que les autres dans labsolu : pour un problme donn, la meilleure reprsentation
sera celle qui permettra de concevoir le meilleur algorithme, cest--dire celui le plus esthtique et de moindre
complexit. On parlera parfois densembles dynamiques car nos ensembles seront rarement gs.
Chaque lment de ces ensembles pourra comporter plusieurs champs qui peuvent tre examins ds lors que
lon possde un pointeur ou une rfrence si on prfre utiliser une terminologie plus proche de Java que de C
sur cet lment. Certains ensembles dynamiques supposent que lun des champs de lobjet contient une cl servant
didentiant.
Ces ensembles supportent potentiellement tout une srie doprations :
RECHERCHE(S, k) : tant donn un ensemble S et une cl k, le rsultat de cette requte est un pointeur sur un
lment de S de cl k, sil en existe un, et la valeur NIL sinon NIL tant un pointeur ou une rfrence sur
rien .
INSERTION(S, x) : ajoute lensemble S llment point par x.
SUPPRESSION(S, x) : supprime de lensemble S son lment point par x (si lon souhaite supprimer un lment
dont on ne connat que la cl k, il suft de rcuprer un pointeur sur cet lment via un appel RECHERCHE(S,
k)).
Si lensemble des cls, ou lensemble lui-mme, est totalement ordonn, dautres oprations sont possibles :
MINIMUM(S) : renvoie llment de S de cl minimale.
MAXIMUM(S) : renvoie llment de S de cl maximale.
SUCCESSEUR(S, x) : renvoie, si celui-ci existe, llment de S immdiatement plus grand que llment de S
point par x, et NIL dans le cas contraire.
PRDCESSEUR(S, x) : renvoie, si celui-ci existe, llment de S immdiatement plus petit que llment de S
point par x, et NIL dans le cas contraire.
5.2 Piles et les
5.2.1 Piles
Dnition 7 (Pile). Une pile est une structure de donnes mettant en uvre le principe dernier entr, premier sorti
(LIFO : Last-In, First-Out en anglais).
Llment t de lensemble par lopration SUPPRESSION est spci lavance (et donc cette opration ne
prend alors que lensemble comme argument) : llment supprim est celui le plus rcemment insr. Lopration
INSERTION dans une pile est communment appele EMPILER, et lopration SUPPRESSION, DPILER. La gure 5.1
montre les consquences des oprations EMPILER et DPILER sur une pile.
39
40 CHAPITRE 5. STRUCTURES DE DONNES LMENTAIRES
FIG. 5.1 Exemple de pile : a) initialement la pile contient les valeurs 3, 5 et 2 ; b) tat de la pile aprs lopration
EMPILER(6) ; c) tat de la pile aprs lopration EMPILER(1) ; d) tat de la pile aprs lopration DPILER, qui a
renvoy la valeur 1.
Il est facile dimplmenter une pile au moyen dun tableau, comme le montre la gure 5.2. La seule difcult dans
cette implmentation est la gestion des dbordements de pile qui interviennent quand on tente deffecteur lopration
DPILER sur une pile vide et lopration EMPILER sur un tableau codant la pile qui est dj plein. Ce dernier problme
napparat pas lorsque lon implmente les piles au moyen dune structure de donnes dont la taille nest pas xe a
priori (comme une liste chane). Les algorithmes ralisant les fonctions EMPILER et DPILER, ainsi que la ncessaire
fonction auxiliaire PILE-VIDE, sont prsents gure 5.3.
FIG. 5.2 Implmentation dune pile par un tableau : a) tat initial de la pile ; b) nouvel tat aprs les actions EMPI-
LER(7) et EMPILER(3) ; c) nouvel tat aprs lopration DPILER qui a renvoy la valeur 3.
5.2.2 Files
Dnition 8 (File). Une le est une structure de donnes mettant en uvre le principe premier entr, premier sorti
(FIFO : First-In, First-Out en anglais).
Llment t de lensemble par lopration SUPPRESSION est spci lavance (et donc cette opration ne prend
alors que lensemble comme argument) : llment supprim est celui qui est rest le plus longtemps dans la le. Une
le se comporte exactement comme une le dattente de la vie courante. La gure 5.4 montre les consquences des
oprations INSERTION et SUPPRESSION sur une le.
On peut implmenter les les au moyen de tableaux. La gure 5.5 illustre limplmentation de les n1 lments
au moyen dun tableau n lments et de deux attributs :
tte(F) qui indexe (ou pointe) vers la tte de la le ;
queue(F) qui indexe le prochain emplacement o sera insr un lment nouveau.
Les lments de la le se trouvent donc aux emplacements tte(F), tte(F)+1, ..., queue(F)-1 (modulo n). Quand
tte(F) = queue(F), la liste est vide. Les algorithmes ralisant les fonctions INSERTION et SUPPRESSION, ainsi que
5.2. PILES ET FILES 41
PILE-VIDE(P)
si sommet(P)=0 alors renvoyer VRAI
sinon renvoyer FAUX
EMPILER(P, x)
si sommet(P) = longueur(P) alors erreur dbordement positif
sinon sommet(P) sommet(P)+1
P[sommet(P)] x
DPILER(P)
si PILE-VIDE(P) alors erreur dbordement ngatif
sinon sommet(P) sommet(P)1
renvoyer P[sommet(P) +1]
FIG. 5.3 Algorithmes de manipulation des piles implmentes par des tableaux.
FIG. 5.4 Exemple de le : a) initialement la le contient
les valeurs 7, 4, 8, 9, 6 et 1 (de la plus anciennement
la plus rcemment insre) ; b) tat de la le aprs lop-
ration INSERTION(3) ; c) tat de la le aprs lopration
SUPPRESSION qui a renvoy la valeur 7.
FIG. 5.5 Implmentation dune le par un tableau : a)
tat initial de la le ; b) nouvel tat aprs laction INSER-
TION(7) ; d) nouvel tat aprs laction INSERTION(5) ; d)
nouvel tat aprs lopration SUPPRESSION qui a ren-
voy la valeur 1.
42 CHAPITRE 5. STRUCTURES DE DONNES LMENTAIRES
la ncessaire fonction auxiliaire FILE-VIDE, sont prsents gure 5.6. La seule difcult dans cette implmentation
est la gestion des dbordements de le qui interviennent quand on tente deffectuer lopration SUPPRESSION sur une
pile vide et lopration INSERTION sur un tableau codant la le qui est dj plein. Ce dernier problme napparat pas
lorsque lon implmente les les au moyen dune structure de donne dont la taille nest pas xe a priori (comme
une liste doublement chane).
FILE-VIDE(F)
si tte(F)=queue(F) alors renvoyer VRAI
sinon renvoyer FAUX
INSERTION(F, x)
si queue(F) + 1 (modulo n) = tte(F) alors erreur dbordement positif
sinon F[queue(F)] x
queue(F) queue(F)+1
SUPPRESSION(F)
si FILE-VIDE(F) alors erreur dbordement ngatif
sinon tte(F) tte(F)+1
renvoyer F[tte(F)1]
FIG. 5.6 Algorithmes de manipulation des les implmentes par des tableaux.
5.3 Listes chanes
5.3.1 Dnitions
Dnition 9 (Liste chane). Une liste chane est une structure de donnes dans laquelle les objets sont arrangs
linairement, lordre linaire tant dtermin par des pointeurs sur les lments.
Chaque lment de la liste, outre le champ cl, contient un champ successeur qui est pointeur sur llment suivant
dans la liste chane. Si le champ successeur dun lment vaut NIL, cet lment na pas de successeur et est donc
le dernier lment ou la queue de la liste. Le premier lment de la liste est appel la tte de la liste. Une liste L est
manipule via un pointeur vers son premier lment, que lon notera TTE(L). Si TTE(L) vaut NIL, la liste est vide.
La gure 5.7 prsente un exemple de liste chane et montre les consquences des oprations INSERTION et SUP-
PRESSION sur une telle structure de donnes.
FIG. 5.7 Exemple de liste chane : a) initialement la liste chane contient les valeurs 9, 6, 4 et 1 ; b) tat de la liste
chane aprs lopration INSERTION(5) ; c) tat de la liste chane aprs lopration SUPPRESSION(4).
Une liste chane peut prendre plusieurs formes :
Liste doublement chane : en plus du champ successeur, chaque lment contient un champ prdcesseur
qui est un pointeur sur llment prcdant dans la liste. Si le champ prdcesseur dun lment vaut NIL, cet
5.3. LISTES CHANES 43
lment na pas de prdcesseur et est donc le premir lment ou la tte de la liste. Une liste qui nest pas
doublement chane est dite simplement chane.
La gure 5.8 prsente un exemple de liste doublement chane et montre les consquences des oprations IN-
SERTION et SUPPRESSION sur une telle structure de donnes.
FIG. 5.8 Exemple de liste doublement chane : a) initialement la liste contient les valeurs 9, 6, 4 et 1 ; b) tat de la
liste aprs lopration INSERTION(5) ; c) tat de la liste aprs lopration SUPPRESSION(4).
Trie ou non trie : suivant que lordre linaire des lments dans la liste correspond ou non lordre linaire
des cls de ces lments.
Circulaire : si le champ prccesseur de la tte de la liste pointe sur la queue, et si le champ successeur de la
queue pointe sur la tte. La liste est alors vue comme un anneau.
5.3.2 Algorithmes de manipulation des listes chanes
Recherche
Lalgorithme RECHERCHE-LISTE(L, k) trouve le premier lment de cl k dans la liste L par une simple recherche
linaire, et retourne un pointeur sur cet lment. Si la liste ne contient aucun objet de cl k, lalgorithme renvoie NIL.
RECHERCHE-LISTE(L, k)
x TTE(L)
tant que x ,= NIL et cl(x) ,= k faire
x successeur(x)
renvoyer x
Cet algorithme manipule aussi bien des listes simplement que doublement que simplement chanes.
Insertion
tant donn un lment x et une liste L, lalgorithme INSERTION-LISTE insre x en tte de L.
INSERTION-LISTE(L, x)
successeur(x) TTE(L)
si TTE(L) ,= NIL alors prdecesseur(TTE(L)) x
TTE(L) x
prdecesseur(x) NIL
Cet algorithme est crit pour les listes doublement chanes. Il suft dignorer les deux instructions concernant le
champ prdcesseur pour obtenir lalgorithme quivalent pour les listes simplement chanes.
44 CHAPITRE 5. STRUCTURES DE DONNES LMENTAIRES
Suppression
Lalgorithme SUPPRESSION-LISTE limine un lment x dune liste chane L. Cet algorithme a besoin dun poin-
teur sur llment x supprimer. Si on ne possde que la cl de cet lment, il faut pralablement utiliser lalgorithme
RECHERCHE-LISTE pour obtenir le pointeur ncessaire.
SUPPRESSION-LISTE(L, x)
si prdcesseur(x) ,= NIL
alors successeur(prdcesseur(x)) successeur(x)
sinon TTE(L) successeur(x)
si successeur(x) ,= NIL
alors prdcesseur(successeur(x)) prdcesseur(x)
Cet algorithme est crit pour les listes doublement chanes. Lalgorithme quivalent pour les listes simplement
chanes est plus compliqu puisquavec les listes simplement chanes nous navons pas de moyen simple de rcuprer
un pointeur sur llment qui prcde celui supprimer...
SUPPRESSION-LISTE(L, x)
si x = TTE(L)
alors TTE(L) successeur(x)
sinon y TTE(L)
tant que successeur(y) ,= x faire y successeur(y)
successeur(y) successeur(x)
5.3.3 Comparaison entre tableaux et listes chanes
Aucune structure de donnes nest parfaite, chacune a ses avantages et ses inconvnients. La gure 5.9 prsente
un comparatif des listes simplement chanes, doublement chanes et des tableaux, tris ou non, sur des oprations
lmentaires. Les complexits indiques sont celles du pire cas. Suivant les oprations que nous aurons effectuer, et
suivant leurs frquences relatives, nous choisirons lune ou lautre de ces structures de donnes.
5.3. LISTES CHANES 45
liste chane liste chane liste chane liste chane tableau tableau
simple simple double double
non trie trie non trie trie non tri tri
RECHERCHE(L, k) (n)
a
(n)
a
(n)
a
(n)
a
(1)
b
(1)
b
(n)
c
(n)
d
INSERTION(L, x) (1) (n)
e
(1) (n)
e
ou (n)
c
ou
erreur
f
erreur
f
SUPPRESSION(L, x) (n) (n) (1) (1) (n)
g
(n)
g
SUCCESSEUR(L, x)
h
(n)
i
(1) (n)
i
(1) (n)
i
(1)
PRDCESSEUR(L, x)
h
(n)
i
(n)
j
(n)
i
(1) (n)
i
(1)
MINIMUM(L) (n)
i
(1) (n)
i
(1) (n)
i
(1)
MAXIMUM(L) (n)
i
(n)
k
(n)
i
(n)
k
(n)
i
(1)
a
Dans le pire cas il faut parcourir tous les lments pour se rendre compte que la clef ntait pas dans lensemble.
b
La cl tant lindice de llment dans le tableau.
c
Dans le pire cas, il faut allouer un nouveau tableau et recopier tous les lments de lancien tableau dans le nouveau.
d
Dans le pire cas, linsertion a lieu dans la premire cas du tableau, et il faut dcaler tous les lments dj prsents.
e
Au pire, linsertion a lieu en n de liste.
f
Au cas o lon veut effectuer une insertion dans un tableau dj plein et quil nest pas possible deffectuer une allocation dynamique de tableau,
comme en FORTRAN 77 ou en PASCAL.
g
Dans le pire cas on supprime le premier lment du tableau et il faut dcaler tous les autres lments.
h
Au sens de lordre sur la valeur des cls.
i
Complexit de la recherche du maximum (ou du minimum) dans un ensemble n lments...
j
Complexit de la recherche du maximum dans un ensemble n lments... car il faut entreprendre la recherche du prdcesseur depuis le dbut
de la liste.
k
Il faut parcourir la liste en entier pour trouver son dernier lment.
FIG. 5.9 Efcacits respectives des listes chanes et des tableaux.
46 CHAPITRE 5. STRUCTURES DE DONNES LMENTAIRES
Chapitre 6
Programmation dynamique
La programmation dynamique, comme la mthode diviser pour rgner (cf. section 3.3), rsout les problmes
en combinant les solutions de sous-problmes. La programmation dynamique sapplique quand les sous-problmes ne
sont pas indpendants mais ont des sous-sous-problmes en commun. Dans ce cas, un algorithme diviser pour rgner
fait plus de travail que ncessaire, en rsolvant plusieurs fois les sous-sous-problmes communs. Un algorithme de
programmation dynamique rsout chaque sous-sous-problme une unique fois et mmorise sa solution dans un tableau,
spargnant ainsi le recalcul de la solution chaque fois que le sous-sous-problme est rencontr.
La programmation dynamique est en gnral applique aux problmes doptimisation : ces problmes peuvent
admettre plusieurs solutions, parmi lesquelles on veut choisir une solution optimale (maximale ou minimale pour une
certaine fonction de cot).
Le dveloppement dun algorithme de programmation dynamique peut tre plani en quatre tapes :
1. Caractriser la structure dune solution optimale.
2. Dnir rcursivement la valeur dune solution optimale.
3. Calculer la valeur dune solution optimale partant des cas simples (cas darrt des rcursions) et en remontant
progressivement jusqu lnonc du problme initial.
4. Construire une solution optimale pour les informations calcules (si lon souhaite avoir une solution et pas
seulement la valeur dune solution optimale).
6.1 Multiplication dune suite de matrices
On suppose que lon a une suite de n matrices, A
1
, ..., A
n
, et que lon souhaite calculer le produit :
A
1
A
2
...A
n
.
On peut valuer cette expression en utilisant comme sous-programme lalgorithme classique de multiplications de
matrices (cf. section 3.3.2), aprs avoir compltement parenths cette expression an de lever toute ambigut sur
lordre des multiplications de matrices un produit de matrices compltement parenths est soit une matrice unique
soit le produit de deux produits de matrice compltement parenthss). La multiplication de matrices tant associative,
le rsultat de la multiplication est indpendant du parenthsage. Il y a ainsi cinq manires diffrentes de calculer le
produit de quatre matrices :
A
1
A
2
A
3
A
4
= (A
1
(A
2
(A
3
A
4
)))
= (A
1
((A
2
A
3
)A
4
))
= ((A
1
A
2
)(A
3
A
4
))
= ((A
1
(A
2
A
3
))A
4
)
= (((A
1
A
2
)A
3
)A
4
)
Le parenthsage du produit peut avoir un impact crucial sur le cot de lvaluation du produit. Le produit dune matrice
A de taille pq par une matrice B de taille qr produit une matrice C de taille pr en pqr multiplications scalaires.
47
48 CHAPITRE 6. PROGRAMMATION DYNAMIQUE
Considrons trois matrices A
1
, A
2
et A
3
de dimensions respectives 10100, 1005 et 550. Si on effectue la mul-
tiplication de ces trois matrices suivant le parenthsage ((A
1
A
2
)A
3
, on effectue 101005 = 5 000 multiplications
dans un premier temps, puis 10 5 50 = 2 500 dans un deuxime temps, soit 7 500 au total. Si, au contraire, on
effectue la multiplication suivant le parenthsage (A
1
(A
2
A
3
)) on effectue 100550 = 25 000 multiplications dans
un premier temps, puis 1010050 = 50 000 dans un deuxime temps, soit 75 000 au total et 10 fois plus quavec
le premier parenthsage !
Problmatique
Problmatique de la multiplication dune suite de matrices : tant donne une suite A
1
, ..., A
n
de n matrices, o
pour i = 1, 2, ..., n la matrice A
i
est de dimensions p
i1
p
i
, parenthser compltement le produit A
1
A
2
...A
n
de faon
minimiser le nombre de multiplications scalaires.
Nombre de parenthsages
Le passage en revue de tous les parenthsages possibles ne donnera pas un algorithme efcace, cest pourquoi il
faut avoir recours une technique plus sophistique.
Soit P(n) le nombre de parenthsages possibles dune squence de n matrices. On peut couper une squence de n
matrices entre la k
e
et la (k +1)
e
, pour k prenant nimporte quelle valeur dans lintervalle [1, n1], puis parenthser
les deux sous-squences rsultantes indpendamment. Do la rcurrence :
P(n) =
_
1 si n = 1,

n1
k=1
P(k)P(nk) si n 2.
On peut montrer que
P(n) =
1
n
C
n1
2n2
=
_
4
n
n
3/2
_
.
Le nombre de solutions est donc au moins exponentiel en n et la mthode directe consistant effectuer une recherche
exhaustive est donc une stratgie mdiocre...
Structure dun parenthsage optimal
La premire tape du paradigme de la programmation dynamique consiste caractriser la structure dune solution
optimale.
Nous notons A
i.. j
la matrice rsultant de lvaluation du produit A
i
A
i+1
...A
j1
A
j
. Un parenthsage optimal de
A
1
A
2
...A
n
spare le produit entre A
k
et A
k+1
pour une certaine valeur k. Dans notre solution optimale on commence
donc par calculer les matrices A
1..k
et A
k+1..n
puis on les multiplie pour obtenir la matrice A
1..n
recherche. Le cot
du calcul est donc la somme des cots des calculs des matrices A
1..k
et A
k+1..n
et de leur produit. Par consquent le
parenthsage de la sous-suite A
1
...A
k
(et celui de la sous-suite A
k+1
..A
n
) doit tre optimal : sinon, on le remplace par
un parenthsage plus conomique, et on obtient un parenthsage global plus efcace que... le parenthsage optimal !
Par consquent, une solution optimale une instance du problme de multiplication dune suite de matrices utilise
uniquement des solutions optimales aux instances des sous-problmes. La sous-structure optimale lintrieur dune
solution optimale est lune des garanties de lapplicabilit de la programmation dynamique.
Rsolution rcursive
La deuxime tape du paradigme de la programmation dynamique consiste dnir rcursivement la valeur dune
solution optimale en fonction de solutions optimales aux sous-problmes.
Pour le problme de la multiplication dune suite de matrices, on prend comme sous-problmes les problmes
consistant dterminer le cot minimum dun parenthsage de A
i
A
i+1
...A
j
, pour 1 i < j n. Soit m[i, j] le nombre
minimum de multiplications scalaires ncessaires au calcul de A
i
A
i+1
...A
j
= A
i.. j
.
Pour tout i, m[i, i] = 0 car A
i..i
= A
i
et aucune multiplication nest ncessaire. Considrons un couple (i, j) avec
i < j. Supposons quun parenthsage optimal spare le produit A
i
A
i+1
...A
j
entre A
k
et A
k+1
. Alors, m[i, j], le cot du
6.1. MULTIPLICATION DUNE SUITE DE MATRICES 49
calcul de A
i.. j
est gal au cot du calcul de A
i..k
, plus celui de A
k+1.. j
, plus celui du produit de ces deux matrices. Nous
avons donc :
m[i, j] = m[i, k] +m[k +1, j] + p
i1
p
k
p
j
.
Cette quation ncessite la connaissance de la valeur de k, connaissance que nous navons pas. Il nous faut donc passer
en revue tous les cas possibles et il y en a j i :
m[i, j] =
_
0 si i = j,
min
ik<j
_
m[i, k] +m[k +1, j] + p
i1
p
k
p
j
_
si i < j.
(6.1)
m[i, j] nous donne le cot dune solution optimale. Pour pouvoir construire une telle solution on note s[i, j] une valeur
k telle que m[i, j] = m[i, k] +m[k +1, j] + p
i1
p
k
p
j
.
Algorithme rcursif
Une premire solution notre problme pourrait tre lalgorithme CHANEDEMATRICES-RCURSIF ci-dessous
qui est une utilisation directe de la rcursion 6.1
CHANEDEMATRICES-RCURSIF(p, i, j)
si i = j alors retourner 0
m[i, j] +
pour k 1 j 1 faire
q CHANEDEMATRICES-RCURSIF(p, i, k)
+ CHANEDEMATRICES-RCURSIF(p, k +1, j)
+ p
i1
p
k
p
j
si q < m[i, j] alors m[i, j] q
renvoyer m[i, j]
La complexit de cet algorithme est donn par la rcurrence :
T(n) =
_
1 si n = 1,
1+
n1
k=1
(T(k) +T(nk) +1) pour n > 1.
Dans le cas gnral, cette complexit peut se rcrire :
T(n) = 2
n1

i=1
T(i) +n.
Par consquent T(n) 2T(n1) et T(n) =(2
n
). La quantit totale de travail effectu par lappel CHANEDEMATRICES-
RCURSIF(P, 1, n) est donc au moins exponentiel et est donc prohibitif... Heureusement, on peut mieux faire.
Calcul des cots optimaux
En fait, le nombre de sous-problmes est assez rduit : un problme pour chaque choix de i et de j tels que
1 i j n, soit au total C
2
n
+n = (n
2
) choix. Lalgorithme rcursif rencontre chaque sous-problme un grand
nombre de fois (ici, un nombre exponentiel de fois) dans diffrentes branches de larbre des appels rcursifs. Cette
proprit, dite des sous-problmes superposs (des sous-problmes ont des sous-sous-problmes en commun), est le
deuxime indice de lapplicabilit de la programmation dynamique.
Plutt que dimplmenter de manire rcursive lquation 6.1, on aborde la troisime tape du paradigme de la
programmation dynamique : on calcule le cot optimal en utilisant une approche ascendante. Lentre de lalgorithme
ORDONNER-CHANEDEMATRICES ci-dessous est la squence p
0
, p
1
, ..., p
n
des dimensions des matrices. Cet algo-
rithme calcul le cot optimal m[i, j] et enregistre un indice s[i, j] permettant de lobtenir.
ORDONNER-CHANEDEMATRICES(p)
n longueur(p) 1
pour i 1 n faire m[i, i] 0
50 CHAPITRE 6. PROGRAMMATION DYNAMIQUE
pour l 2 n faire
pour i 1 nl +1 faire
j i +l 1
m[i, j] +
pour k 1 j 1 faire
q m[i, k] +m[k +1, j] + p
i1
p
k
p
j
si q < m[i, j] alors m[i, j] q
s[i, j] k
renvoyer m et s
Lalgorithme remplit le tableau m en considrant des suites de matrices de longueur croissante. Lquation 6.1
nous montre en effet que le calcul du cot dun produit de m matrices ne dpend que des cots de calcul de suites de
matrices de longueur strictement infrieure. La boucle sur l est une boucle sur la longueur des suites considres.
La gure 6.1 prsente un exemple dexcution de lalgorithme ORDONNER-CHANEDEMATRICES. Comme m[i, j]
nest dni que pour i j, seule la partie du tableau m strictement suprieure la diagonale principale est utilise.
Les deux tableaux sont prsents de manire faire apparatre la diagonale principale de m horizontalement, chaque
range horizontale contenant les lments correspondants des chanes de matrices de mme taille. ORDONNER-
CHANEDEMATRICES calcule les ranges de m du bas vers le haut, et chaque range de la gauche vers la droite. Dans
notre exemple, un parenthsage optimal cote 15 125 multiplications scalaires.
7875
0
15750
2625
750
1000 5000
4375
2500
3500
5375
7125
9375
11875 10500
15125
0
0
0
0
0
5
1
2
3 4
5
3
3
1
3
3
3
3
3
3
4
6
5
4
3
2
1
1
3
6
A
2
A
3
A
4
A
6
A
1
A
5
m
s
6
5
4
3
2
1
4
5
2
i
j
5
6
j
i 3
2
1
FIG. 6.1 Tableaux m et s calculs par ORDONNER-CHANEDEMATRICES pour n = 6 et les dimensions :
30, 35, 15, 5, 10, 20, 25.
Complexit
Un simple coup dil lalgorithme montre que sa complexit est en O(n
3
). Plus prcisment :
T(n) =
n
l=2

nl+1
i=1

i+l2
k=i
1
=
n
l=2

nl+1
i=1
(l 1)
=
n
l=2
(nl +1)(l 1)
=
n
l=2
(l
2
+l(n+2) (n+1))
=
n
3
+5n+12
6
sachant que
n
i=1
i
3
=
n(n+1)(2n+1)
6
. La complexit de lalgorithme ORDONNER-CHANEDEMATRICES est donc en
(n
3
) ce qui est inniment meilleur que la solution nave numrant tous les parenthsages ou que la solution rcur-
sive, toutes deux de complexit exponentielle.
6.2. LMENTS DE PROGRAMMATION DYNAMIQUE 51
Construction dune solution optimale
Lalgorithme ORDONNER-CHANEDEMATRICES calcule le cot dun parenthsage optimal, mais neffectue pas
la multiplication de la suite de matrices. Par contre, linformation ncessaire la ralisation dun calcul suivant un
parenthsage optimal est stocke au fur et mesure dans le tableau s : s[i, j] contient une valeur k pour laquelle
une sparation du produit A
i
A
i+1
...A
j
entre A
k
et A
k+1
fourni un parenthsage optimal. Lalgorithme MULTIPLIER-
CHANEDEMATRICES ci-dessous ralise la multiplication et rsout donc notre problme.
MULTIPLIER-CHANEDEMATRICES(A, s, i, j)
si j > i
alors X MULTIPLIER-CHANEDEMATRICES(A, s, i, s[i, j])
X MULTIPLIER-CHANEDEMATRICES(A, s, s[i, j] +1, j)
renvoyer MULTIPLIER-MATRICES(X, Y)
sinon renvoyer A
i
Dans lexemple de la gure 6.1, MULTIPLIER-CHANEDEMATRICES(A, s, 1, 6) calcule le produit de la suite de
matrices en suivant le parenthsage :
((A
1
(A
2
A
3
))((A
4
A
5
)A
6
)),
car s[1, 6] = 3, s[1, 3] = 1 et s[4, 6] = 5.
6.2 lments de programmation dynamique
On examine ici les deux caractristiques principales que doit possder un problme doptimisation pour que la pro-
grammation dynamique soit applicable : une sous-structure optimale et des sous-problmes superposs. On examinera
aussi une variante de ce paradigme : le recensement.
6.2.1 Sous-structure optimale
Un problme fait apparatre une sous-structure optimale si une solution optimale au problme fait apparatre des
solutions optimales aux sous-problmes. La prsence dune sous-structure optimale est un bon indice de lutilit de
la programmation dynamique (mais cela peut aussi signier quune stratgie gloutonne est applicable, cf. chapitre 7).
La sous-structure optimale dun problme suggre souvent une classe de sous-problmes pertinents auxquels on peut
appliquer la programmation dynamique.
6.2.2 Sous-problmes superposs
La seconde caractristique que doit possder un problme doptimisation pour que la programmation dynamique
soit applicable est ltroitesse de lespace des sous-problmes, au sens o un algorithme rcursif doit rsoudre
constamment les mmes sous-problmes, plutt que den engendrer toujours de nouveaux. En gnral, le nombre de
sous-problmes distincts est polynomial par rapport la taille de lentre. Quand un algorithme rcursif repasse sur
le mme problme constamment, on dit que le problme doptimisation contient des sous-problmes superposs. A
contrario, un problme pour lequel lapproche diviser pour rgner est plus adapte gnre le plus souvent des
problmes nouveaux chaque tape de la rcursivit. Les algorithmes de programmation dynamique tirent parti de la
superposition des sous-problmes en rsolvant chaque sous-problme une unique fois, puis en conservant la solution
dans un tableau o on pourra la retrouver au besoin avec un temps de recherche constant.
6.2.3 Recensement
Il existe une variante de la programmation dynamique qui offre souvent la mme efcacit que lapproche usuelle,
tout en conservant une stratgie descendante. Son principe est de recenser les actions naturelles, mais inefcaces,
de lalgorithme rcursif. Comme pour la programmation dynamique ordinaire, on conserve dans un tableau les so-
lutions aux sous-problmes, mais la structure de remplissage du tableau est plus proche de lalgorithme rcursif. Un
algorithme rcursif de recensement maintient jour un lment de tableau pour la solution de chaque sous-problme.
52 CHAPITRE 6. PROGRAMMATION DYNAMIQUE
Chaque lment contient au dpart une valeur spciale pour indiquer quil na pas encore t rempli. Lorsque le sous-
problme est rencontr pour la premire fois durant lexcution de lalgorithme rcursif, sa solution est calcule puis
stocke dans le tableau. chaque nouvelle confrontation avec ce sous-problme, la valeur stocke est simplement
rcupre.
RECENSEMENT-CHANEDEMATRICES(p)
n longueur(p) 1
pour i 1 n faire
pour j i n faire
m[i, j] +
renvoyer RCUPRATION-CHANE(p, 1, n)
RCUPRATION-CHANE(p, i, j)
si m[i, j] < + alors renvoyer m[i, j]
si i = j
alors m[i, j] 0
sinon pour k i j 1 faire
q RCUPRATION-CHANE(p, i, k) +RCUPRATION-CHANE(p, k +1, j) + p
i1
p
k
p
j
si q < m[i, j] alors m[i, j] q
s[i, j] k
Chacun des (n
2
) lments du tableau m est rempli une unique fois par RCUPRATION-CHANE et chacun de ces
(n
2
) appels RCUPRATION-CHANE requiert un temps en O(n) en excluant le temps pass calculer dautres
lments ventuels. La complexit de RCUPRATION-CHANE est donc en O(n
3
).
En pratique, si tous les sous-problmes doivent tre rsolus au moins une fois, un algorithme ascendant de pro-
grammation dynamique bat en gnral un algorithme descendant avec recensement dun facteur constant car il limine
le temps pris par les appels rcursifs et prend moins de temps pour grer le tableau. En revanche, si certains sous-
problmes de lespace des sous-problmes nont pas besoin dtre rsolus du tout, la solution du recensement prsente
lavantage de ne rsoudre que ceux qui sont vraiment ncessaires.
Chapitre 7
Algorithmes gloutons
Les algorithmes qui rsolvent les problmes doptimisation parcourent en gnral une srie dtapes, au cours
desquelles ils sont confronts un ensemble doptions. Pour de nombreux problmes doptimisation la programmation
dynamique est une approche trop lourde pour dterminer les meilleures solutions ; dautres algorithmes plus simples et
efcaces y arriveront. Un algorithme glouton fait toujours le choix qui semble le meilleur sur le moment. Autrement
dit, il fait un choix optimal localement, dans lespoir que ce choix mnera la solution optimale globalement.
Les algorithmes gloutons naboutissent pas toujours des solutions optimales, mais la mthode gloutonne est trs
puissante et fonctionne correctement pour des problmes varis.
7.1 Location dune voiture
On considre le problme de la location dune unique voiture. Des clients formulent un ensemble de demandes de
location avec, pour chaque demande, le jour du dbut de la location et le jour de restitution du vhicule. Notre but ici
est daffecter le vhicule de manire satisfaire le maximum de clients possible (et non pas de maximiser la somme
des dures des locations).
Nous disposons donc dun ensemble E des demandes de location avec, pour chaque lment e de E, la date d(e)
du dbut de la location et la date f (e) de la n de cette location. Nous voulons obtenir un ensemble F maximal de
demandes satisfaites. Cet ensemble F doit vrier une unique contrainte : deux demandes ne doivent pas se chevaucher
dans le temps, autrement dit une location doit se terminer avant que la suivante ne commence. Cette contrainte scrit
mathmatiquement :
e
1
F, e
2
F, d(e
1
) d(e
2
) f (e
1
) d(e
2
).
Algorithme
LOCATIONDUNEVOITURE(E)
Tri des lments de E par date de n croissante.
On obtient donc une suite e
1
, e
2
, ..., e
n
telle que f (e
1
) f (e
2
) ... f (e
n
).
F[1] e
1
j 1
pour i 1 n faire
si d(e
i
) f (F[ j]) alors j j +1
F[ j] e
j
renvoyer F
Cet algorithme est glouton car chaque tape il prend la location la moins coteuse : celle qui nit le plus tt
parmi celles qui sont satisables.
53
54 CHAPITRE 7. ALGORITHMES GLOUTONS
Preuve de loptimalit de lalgorithme
Soit F =x
1
, x
2
, ..., x
p
la solution obtenue par lalgorithme glouton, et soit G=y
1
, y
2
, ..., y
q
, q p, une solution
optimale. Nous voulons montrer que F est optimal, et donc que q = p.
Nous supposons que les ensembles F et G sont classs par dates de ns de location croissantes. Si G ne contient
pas F, il existe un entier k tel que : i < k, x
i
= y
i
et x
k
,= y
k
. Par construction de F, x
k
est une demande de location
qui la date de n minimale et dont la date de dbut soit postrieure la date de n de x
k1
= y
k1
. Par consquent,
f (y
k
) f (x
k
). On peut alors remplacer G par G
/
= y
1
, y
2
, ..., y
k1
, x
k
, y
k+1
, ..., y
q
tout en satisfaisant la contrainte
de non chevauchement des demandes. G
/
est une autre solution optimale mais ayant strictement plus dlments en
commun avec F que G. En rptant autant que faire se peut ce procd, on obtient un ensemble H de mme cardinalit
que G et qui contient F. Cet ensemble H ne peut contenir dautres lments que ceux de F car ceux-ci, dbutants aprs
la n de x
p
, auraient t ajouts F par lalgorithme glouton. Donc H = F, et F et G ont le mme nombre dlments.
Limites de lalgorithme
Il est primordial, ici, que les demandes soit classes par dates de n croissantes. Le tableau 7.1 prsente trois
demandes de location classes par dates de dbut croissantes pour lesquelles lalgorithme glouton prsent ci-dessus
nest pas optimal. Pour dvidentes raisons de symtries, classer les demandes par dates de dbut dcroissantes donne
par contre un rsultat optimal.
e
1
e
2
e
3
d 2 3 5
F 8 4 8
TAB. 7.1 Demandes classes par dates de dbut crois-
santes.
e
1
e
2
e
3
d 3 5 3
F 6 7 5
TAB. 7.2 Demandes classes par dures dcroissantes.
Lalgorithme glouton ne donne pas loptimum si notre but est de maximiser la dure totale de location du vhicule.
Mme si on classe les demandes de location par dures dcroissantes, un algorithme glouton ne donnera pas une
solution optimale, le tableau 7.2 prsentant un contre-exemple. En fait, le problme de la maximisation de cette dure
totale est NP-complet (cf. chapitre 11) et on ne connat pas dalgorithme de complexit polynomiale pour le rsoudre.
Si nous disposons de deux voitures et non plus dune seule, lalgorithme prcdent ne donne plus loptimum.
7.2 lments de la stratgie gloutonne
Un algorithme glouton dtermine une solution aprs avoir effectu une srie de choix. Pour chaque point de d-
cision, le choix qui semble le meilleur cet instant est retenu. Cette stratgie ne produit pas toujours une solution
optimale. Il existe cependant deux caractristiques qui indiquent quun problme se prte une stratgie gloutonne :
la proprit du choix glouton et une sous-structure optimale.
7.2.1 Proprit du choix glouton
Proprit du choix glouton : on peut arriver une solution globalement optimale en effectuant un choix locale-
ment optimal (ou choix glouton). En programmation dynamique on fait un choix chaque tape, mais ce choix dpend
de la solution de sous-problmes, au contraire, dans un algorithme glouton, on fait le choix qui semble le meilleur sur le
moment puis on rsout les sous-problmes qui surviennent une fois le choix fait. Une stratgie gloutonne progresse en
gnral de manire descendante en faisant se succder les choix gloutons pour ramener itrativement chaque instance
du problme une instance plus petite .
7.2.2 Sous-structure optimale
Montrer quun choix glouton aboutit un problme similaire mais plus petit ramne la dmonstration de
loptimalit prouver quune solution optimale doit faire apparatre une sous-structure optimale.
7.3. FONDEMENTS THORIQUES DES MTHODES GLOUTONNES 55
Un problme fait apparatre une sous-structure optimale si une solution optimale contient la solution optimale
de sous-problmes. Cette proprit est un indice important de lapplicabilit de la programmation dynamique comme
des algorithmes gloutons. Le sujet du TD 6 montre un exemple de problme qui peut tre rsolu par programmation
dynamique mais pas par un algorithme glouton.
7.3 Fondements thoriques des mthodes gloutonnes
La thorie des matrodes ne couvre pas tous les cas dapplications de la mthode gloutonne, mais elle couvre de
nombreux cas intressants en pratique.
7.3.1 Matrodes
Dnition 10 (Matrode). Un matrode est un couple M = (E, I) vriant les conditions suivantes :
1. E est un ensemble ni non vide.
2. I est une famille non vide de sous-ensembles de E, appels sous-ensembles indpendants de E, telle que si H I
et si F H alors F I (on dit que I est hrditaire). Autrement dit, si I contient un sous-ensemble H de E, I
contient tous les sous-ensembles de H. On remarque que lensemble vide est obligatoirement membre de I.
3. Si F et H sont deux lments de I, avec [F[ < [H[, alors il existe (au moins) un lment x H F tel que
F x I (proprit dchange).
Un premier rsultat sur les matrodes :
Thorme 2. Tous les sous-ensembles indpendants maximaux dun matrode ont la mme taille.
Ce rsultat est une consquence directe de la proprit dchange : si un de ces ensembles, H, est strictement plus
petit que les autres, la proprit dchange nous garantit que I contient un sur-ensemble strict H
/
de H, ce qui contredit
la maximalit de H.
Dnition 11 (Matrode pondr). Un matrode M = (E, I) est dit pondr si lon dispose dune fonction de pond-
ration w qui affecte un poids strictement positif w(x) chaque lment x de E. La fonction de pondration w stend
aux sous-ensembles de E. Soit F un sous-ensemble quelconque de E :
w(F) =

xF
w(x).
7.3.2 Algorithmes gloutons sur un matrode pondr
De nombreux problmes pour lesquels une approche gloutonne donne les solutions optimales peuvent tre ramens
une recherche dun sous-ensemble indpendant de pondration maximale dans un matrode pondr. Autrement dit,
on dispose dun matrode pondr M = (E, I) et on souhaite trouver un ensemble indpendant F I pour lequel
w(F) est maximis. Un tel sous-ensemble indpendant et qui possde la plus grande pondration possible est appel
sous-ensemble optimal du matrode. Comme la pondration est strictement positive par dnition, un sous-ensemble
optimal est toujours un sous-ensemble indpendant maximal.
Lalgorithme ci-dessous prend en entre un matrode pondr M = (E, I) et sa fonction de pondration wet retourne
un sous-ensemble optimal F.
GLOUTON(M = (E, I), w)
F / 0
Trier E par ordre de poids dcroissant
pour x E par ordre de poids dcroissant faire
si F x I alors F F x
renvoyer F
56 CHAPITRE 7. ALGORITHMES GLOUTONS
Cet algorithme est glouton parce quil considre les lments de E par ordre de poids dcroissant et quil ajoute
immdiatement un lment x F si F x est indpendant. Si E contient n lments et si la vrication de lind-
pendance de F x prend un temps O( f (n), lalgorithme tout entier sexcute en O(nlogn+nf (n)) rappel : le tri
dun ensemble de n lments cote O(nlogn).
Le sous-ensemble F de E est indpendant par construction. Nous allons maintenant tablir loptimalit de F.
Thorme 3 (Les matrodes satisfont la proprit du choix glouton). Soit M = (E, I) un matrode pondr de
fonction de pondration w. Supposons que E soit tri par ordre de poids dcroissant. Soit x le premier lment de E
tel que x soit indpendant, sil existe. Si x existe, il existe un sous-ensemble optimal F de E contenant x.
Si x nexiste pas, le seul lment de I est lensemble vide. Soit H un sous-ensemble optimal. On utilise H pour
construire, au moyen de la proprit dchange, un ensemble F maximal (de mme cardinalit que H) et contenant x.
Par construction, F et H ne diffrent que dun lment et il existe donc un lment y tel que : F = (Hy) x. Par
maximalit du poids de x, w(y) w(x), w(H) w(F) et F est optimal.
Thorme 4. Soit M = (E, I) un matrode quelconque. Si x est un lment de E tel que x nest pas lment de I,
alors x nappartient aucun sous-ensemble indpendant F de E.
Autrement dit, un lment qui nest pas utilisable immdiatement ne pourra jamais tre utilis : lalgorithme
GLOUTON ne fait donc pas derreur en ne considrant pas les lments de E qui ne sont pas extension de / 0.
Thorme 5 (Les matrodes satisfont la proprit de sous-structure optimale). Soit x le premier lment de E
choisi par GLOUTON pour le matrode pondr M = (E, I). Le reste du problme trouver un sous-ensemble ind-
pendant contenant x et de poids maximal se rduit trouver un sous-ensemble indpendant et de poids maximal du
matrode pondr M
/
= (E
/
, I
/
), o :
E
/
=y E : x, y I,
I
/
=H E x : Hx I,
et o la fonction de pondration de M
/
est celle de M restreinte E
/
.
Une solution de poids maximum sur M contenant x engendre une solution de poids maximum sur M
/
, et vice versa.
Thorme 6 (Validit de lalgorithme glouton sur les matrodes). Si M = (E, I) est un matrode pondr de fonction
de pondration w, alors lappel GLOUTON(M = (E, I), w) renvoie un sous-ensemble optimal.
Chapitre 8
Graphes et arbres
8.1 Graphes
Un graphe orient G est reprsent par un couple (S, A) o S est un ensemble ni et A une relation binaire
sur S. Lensemble S est lensemble des sommets de G et A est lensemble des arcs de G. La gure 8.1 est une
reprsentation graphique du graphe orient G = (S, A) avec lensemble de sommets S = 1, 2, 3, 4, 5, 6 et lensemble
darcs A = (1, 2), (2, 2), (2, 4), (2, 5), (4, 1), (4, 5), (5, 4), (6, 3) ; les sommets tant reprsents par des cercles et les
arcs par des ches. On notera que les boucles une boucle tant un arc qui relie un sommet lui-mme sont ici
possibles.
4
1 2 3
6 5
FIG. 8.1 Exemple de graphe orient.
4
1 2 3
6 5
FIG. 8.2 Exemple de graphe non orient.
Dans un graphe non orient G = (S, A), lensemble des artes A nest pas constitu de couples mais de paires
de sommets une paire tant non ordonne contrairement un couple. Par convention, on reprsente larte entre
les sommets u et v non par la notation u, v mais, indiffremment, par les notations (u, v) ou (v, u). Dans un graphe
non orient les boucles sont interdites et chaque arte est donc constitue de deux sommets distincts. La gure 8.2
est une reprsentation graphique du graphe non orient G = (S, A) avec lensemble de sommets S =1, 2, 3, 4, 5, 6 et
lensemble darcs A =(1, 2), (2, 5), (5, 1), (6, 3).
Si (u, v) est un arc dun graphe orient G = (S, A), on dit que (u, v) part du sommet u et arrive au sommet v. Si
(u, v) est une arte dun graphe non orient G = (S, A), on dit que larte (u, v) est incidente aux sommets u et v.
Dans un graphe non orient, le degr dun sommet est le nombre dartes qui lui sont incidentes. Si un sommet
est de degr 0, comme le sommet 4 de la gure 8.2, il est dit isol. Dans un graphe orient, le degr sortant dun
sommet est le nombre darcs qui en partent, le degr (r)entrant est le nombre darcs qui y arrivent et le degr est la
somme du degr entrant et du degr sortant.
Dans un graphe orient G = (S, A), un chemin de longueur k dun sommet u un sommet v est une squence
(u
0
, u
1
, ..., u
k
) de sommets telle que u = u
0
, v = u
k
et (u
i1
, u
i
) A pour tout i dans 1, ..., k. Un chemin est lmen-
taire si ces sommets sont tous distincts. Dans la gure 8.1, le chemin (1, 2, 5, 4) est lmentaire et de longueur 3, mais
le chemin (2, 5, 4, 5) nest pas lmentaire. Un sous-chemin p
/
dun chemin p = (u
0
, u
1
, ..., u
k
) est une sous-squence
57
58 CHAPITRE 8. GRAPHES ET ARBRES
contigu de ses sommets. Autrement dit, il existe i et j, 0 i j k, tels que p
/
= (u
i
, u
i+1
, ..., u
j
). On dnit dans
les graphes non orients la notion correspondante de chane.
Dans un graphe orient G= (S, A), un chemin (u
0
, u
1
, ..., u
k
) forme un circuit si u
0
=u
k
et si le chemin contient au
moins un arc. Ce circuit est lmentaire si les sommets u
1
, ..., u
k
sont distincts. Une boucle est un circuit de longueur
1. Dans un graphe non orient G = (S, A), une chane (u
0
, u
1
, ..., u
k
) forme un cycle si k 3 et si u
0
= u
k
. Ce cycle est
lmentaire si les sommets u
1
, ..., u
k
sont distincts. Un graphe sans cycle est dit acyclique.
Un graphe non orient est connexe si chaque paire de sommets est relie par une chane. Les composantes
connexes dun graphe sont les classes dquivalence de sommets induites par la relation est accessible partir de .
Le graphe de la gure 8.2 contient trois composantes connexes : 1, 2, 5, 3, 6 et 4.
Un graphe orient est fortement connexe si chaque sommet est accessible partir de nimporte quel autre. Les
composantes fortement connexes dun graphe sont les classes dquivalence de sommets induites par la relation
sont accessibles lun partir de lautre . Le graphe de la gure 8.1 contient trois composantes connexes : 1, 2, 4, 5,
3 et 6.
On dit quun graphe G
/
= (S
/
, A
/
) est un sous-graphe de G = (S, A) si S
/
S et si A
/
A.
8.2 Arbres
Un graphe non orient acyclique est une fort et un graphe non orient connexe acyclique est un arbre. La gure
8.3 prsente un graphe qui nest ni un arbre ni une fort car contenant un cycle ; la gure 8.4 prsente un graphe qui
est une fort mais pas un arbre, puisque ntant pas connexe ; la gure 8.5 prsente un arbre.
FIG. 8.3 Exemple de graphe
contenant un cycle.
FIG. 8.4 Exemple de fort. FIG. 8.5 Exemple darbre.
Thorme 7 (Proprits des arbres). Soit G = (S, A) un graphe non orient. Les afrmations suivantes sont quiva-
lentes.
1. G est un arbre.
2. Deux sommets quelconques de G sont relis par un unique chemin lmentaire.
3. G est connexe, mais si une arte quelconque est te de A, le graphe rsultant nest plus connexe.
4. G est connexe et [A[ =[S[ 1.
5. G est acyclique et [A[ =[S[ 1.
6. G est acyclique, mais si une arte quelconque est ajoute A, le graphe rsultant contient un cycle.
Pour la dmonstration de ce thorme, voir [2, pp. 8991].
Un arbre enracin est un arbre dans lequel lun des sommets se distingue des autres. On appelle ce sommet
la racine. Ce sommet particulier impose en ralit un sens de parcours de larbre et larbre se retrouve orient par
lutilisation qui en est faite... Dans la suite de ce cours, et sauf avis contraire, tous les arbres que nous manipulerons
seront des arbres enracins et nous omettrons de le prciser. En outre, on appellera souvent nuds les sommets des
arbres (enracins). La gure 8.6 prsente deux arbres qui ne diffrent que sils sont considrs comme des arbres
enracins.
Soit x un nud dun arbre T de racine r. Un nud quelconque y sur lunique chemin allant de r x est appel
anctre de x. Si T contient larte (y, x) alors y est le pre de x et x est le ls de y. La racine est le seul nud qui nait
8.2. ARBRES 59
1
3
7
4 12
12
1 7
4 3
FIG. 8.6 Exemple darbres qui ne diffrent que sils sont enracins.
pas de pre. Un nud sans ls est un nud externe ou une feuille. Un nud qui nest pas une feuille est un nud
interne. Si y est un anctre de x, alors x est un descendant de y.
Le sous-arbre de racine x est larbre compos des descendants de x, enracin en x. Par exemple, dans le premier
arbre de la gure 8.7, le sous-arbre de racine 8 contient les nuds 8, 6, 5 et 9.
8
3
7
10 4
11 2 12
5 6
9
1
8
5 6
9
12
1
profondeur 1
profondeur 2
profondeur 3
profondeur 4
profondeur 0
3
7
10 4
11 2
FIG. 8.7 Exemple darbres (enracins) qui ne diffrent que sils sont ordonns.
Le nombre de ls du nud x est appel le degr de x. Donc, suivant quun arbre (enracin) est vu comme un arbre
(enracin) ou un graphe, le degr de ses sommets na pas la mme valeur ! La longueur du chemin entre la racine r et
le nud x est la profondeur de x. La plus grande profondeur que puisse avoir un nud quelconque de larbre T est la
hauteur de T. Les deux arbres prsents gure 8.7 sont de hauteur 4.
Un arbre ordonn est un arbre enracin dans lequel les ls de chaque nud sont ordonns entre eux. Les deux
arbres de la gure 8.7 sont diffrents si on les regarde comme des arbres ordonns... mais ils sont identiques si on les
regarde comme de simples arbres (enracins).
Les arbres binaires se dcrivent plus aisment de manire rcursive. Un arbre binaire T est une structure dnie
sur un ensemble ni de nuds et qui :
ne contient aucun nud, ou
est form de trois ensembles disjoints de nuds : une racine, un arbre binaire appel son sous-arbre gauche et
un arbre binaire appel son sous-arbre droit.
Un arbre binaire est plus quun arbre ordonn dont chaque nud serait de degr au plus deux : dans un arbre
binaire, si un nud na quun seul ls, la position de ce ls quil soit ls gauche ou ls droit est importante. La
gure 8.8 prsente deux arbres ordonns qui ne sont diffrents que quand ils sont vus comme des arbres binaires.
Dans un arbre binaire complet chaque nud est soit une feuille, soit de degr deux aucun nud nest donc de
degr un.
Un arbre k-aire est une gnralisation de la notion darbre binaire o chaque nud est de degr au plus k et non
plus simplement de degr au plus 2.
60 CHAPITRE 8. GRAPHES ET ARBRES
12
1
8
3
7
4
2 12
1
4
2 8
3
7
FIG. 8.8 Exemple darbres ordonns qui ne diffrent que quand ils sont vus comme des arbres binaires.
8.3 Parcours
8.3.1 Parcours des arbres
Nous ne considrons ici que des arbres ordonns.
Parcours en profondeur
Dans un parcours en profondeur dabord, on descend le plus profondment possible dans larbre puis, une fois
quune feuille a t atteinte, on remonte pour explorer les autres branches en commenant par la branche la plus
basse parmi celles non encore parcourues ; les ls dun nud sont bien videmment parcourus suivant lordre sur
larbre.
PP(A)
si A nest pas rduit une feuille faire
pour tous les ls u de racine(A) faire dans lordre PP(u)
FIG. 8.9 Algorithme de parcours en profondeur dun arbre.
Les parcours permettent deffectuer tout un ensemble de traitement sur les arbres. La gure 8.10 prsente trois
algorithmes qui afchent les valeurs contenues dans les nuds dun arbre binaire, suivant des parcours en profondeur
prxe, inxe et postxe, respectivement.
PRFIXE(A)
si A ,= NIL faire
afche racine(A)
PRFIXE(FILS-GAUCHE(A))
PRFIXE(FILS-DROIT(A))
INFIXE(A)
si A ,= NIL faire
INFIXE(FILS-GAUCHE(A))
afche racine(A)
INFIXE(FILS-DROIT(A))
POSTFIXE(A)
si A ,= NIL faire
POSTFIXE(FILS-GAUCHE(A))
POSTFIXE(FILS-DROIT(A))
afche racine(A)
FIG. 8.10 Parcours prxe, inxe et postxe dun arbre.
Parcours en largeur
Dans un parcours en largeur dabord, tous les nuds une profondeur i doivent avoir t visits avant que le
premier nud la profondeur i +1 ne soit visit. Un tel parcours ncessite que lon se souvienne de lensemble des
branches quil reste visiter. Pour ce faire, on utilise une le (ici note F).
8.3. PARCOURS 61
PL(A)
F racine(A)
tant que F ,= / 0 faire
u SUPPRESSION(F)
pour tous les ls v de u faire dans lordre INSERTION(F, v)
FIG. 8.11 Algorithme de parcours en largeur dun arbre.
8.3.2 Parcours des graphes
Le parcours des graphes se rvle tre un peu plus compliqu que celui des arbres. En effet, les graphes peuvent
contenir des cycles et nous voulons viter de parcourir indniment ces cycles ! Pour viter cet cueil on colorie les
sommets des graphes : initialement les sommets sont tous blancs ; lorsquil est rencontr pour la premire fois un
sommet est peint en gris ; lorsque tous ses successeurs dans lordre de parcours ont t visits, un sommet est repeint
en noir.
Parcours en profondeur
PP(G)
pour chaque sommet u de G faire couleur[u] BLANC
pour chaque sommet u de G faire si couleur[u] = BLANC alors VISITER-PP(G, u, couleur)
VISITER-PP(G, s, couleur)
couleur[s] GRIS
pour chaque voisin v de s faire
si couleur[v] = BLANC alors VISITER-PP(G, v, couleur)
couleur[s] NOIR
FIG. 8.12 Algorithme de parcours en profondeur dun graphe.
Parcours en largeur
PL(G, s)
couleur[s] GRIS
pour chaque sommet u de G, u ,= s faire couleur[u] BLANC
F s
tant que F ,= / 0 faire
u SUPPRESSION(F)
pour chaque voisin v de u faire
si couleur[v] = BLANC
alors couleur[v] GRIS
INSERTION(F, v)
couleur[u] NOIR
FIG. 8.13 Algorithme de parcours en largeur dun graphe.
62 CHAPITRE 8. GRAPHES ET ARBRES
Chapitre 9
Arbres de recherche et arbres de recherche
quilibrs
9.1 Arbres binaires de recherche
9.1.1 Dnition
Dnition 12 (Arbre binaire de recherche). Un arbre binaire de recherche est un arbre binaire vriant la proprit
suivante : soient x et y deux nuds de larbre, si y est un nud du sous-arbre gauche de x, alors clef (y) clef (x), si
y est un nud du sous-arbre droit de x, alors clef (y) clef (x).
La gure 9.1 prsente deux exemples darbres binaires de recherche. Bien que diffrents, ces deux arbres contiennent
exactement les mmes valeurs.
6
3
2 4
7
13
9
15
18
17 20
6
3
2 4
7
13
9
15
17
18
20
FIG. 9.1 Deux arbres binaires de recherche contenant les mmes valeurs.
9.1.2 Recherches
Recherche dun lment
ARBRE-RECHERCHER(x, k)
si x = NIL ou k = cl(x) alors renvoyer x
si k <cl(x)
alors renvoyer ARBRE-RECHERCHER(gauche(x), k)
sinon renvoyer ARBRE-RECHERCHER(droit(x), k)
Minimum et maximum
ARBRE-MINIMUM(x)
tant que gauche(x) ,= NIL faire x gauche(x)
renvoyer x
ARBRE-MAXIMUM(x)
tant que droit(x) ,= NIL faire x droit(x)
renvoyer x
63
64 CHAPITRE 9. ARBRES DE RECHERCHE ET ARBRES DE RECHERCHE QUILIBRS
Successeur et prdcesseur
Si toutes les cls dans larbre sont distinctes, le successeur dun nud x est le nud contenant la plus petite cl
suprieure x.
k
A B
y
x
FIG. 9.2 Localisation du successeur.
Considrons le fragment darbre prsent gure 9.2. De par la proprit des arbres binaires de recherche :
1. Le sous-arbre A ne contient que des cls infrieures k et ne peut contenir le successeur de k.
2. Le sous-arbre B ne contient que des cls suprieures k et peut contenir le successeur de k sil nest pas vide.
3. y dsigne le plus proche anctre de k qui soit le ls gauche de son pre (y = k si k est ls gauche de son pre).
Tous les anctres de k jusqu y sont infrieurs ou gaux k et leurs sous-arbres gauches ne contiennent que des
valeurs infrieures k.
x est le pre de y. Sa valeur est suprieure toutes celles contenues dans son sous-arbre gauche (de racine y) et
donc k et celles de B. Toutes les valeurs de son sous-arbre droit sont suprieures x.
En rsum : si B est non vide, son minimum est le successeur de k, sinon le successeur de k est le premier anctre de k
dont le ls gauche est aussi anctre de k.
ARBRE-SUCCESSEUR(x)
si droit(x) ,= NIL alors renvoyer ARBRE-MINIMUM(droit(x))
y pre(x)
tant que y ,= NIL et x = droit(y) faire
x y
y pre(x)
renvoyer y
9.1.3 Insertion dun lment
Llment ajouter est insr l o on laurait trouv sil avait t prsent dans larbre. Lalgorithme dinsertion,
prsent gure 9.3, recherche donc llment dans larbre et, quand il aboutit la conclusion que llment nappartient
pas larbre (lalgorithme aboutit sur NIL), il insre llment comme ls du dernier nud visit.
9.1.4 Suppression dun lment
La gure 9.4 prsente les diffrents cas de gure que doit traiter lalgorithme de suppression dun lment dans un
arbre binaire de recherche. Lalgorithme, prsent gure 9.5, tient en plus compte des conditions aux limites (change-
ment de racine).
9.1. ARBRES BINAIRES DE RECHERCHE 65
ARBRE-INSERTION(T, z)
x racine(T)
pre_de_x NIL
tant que x ,= NIL faire
pre_de_x x
si clef (z) < clef (x)
alors x gauche(x)
sinon x droit(x)
pre(z)pre_de_x
si pre_de_x = NIL
alors racine(T) z
sinon si clef (z) < clef (x)
alors gauche(pre_de_x) z
sinon droit(pre_de_x) z
FIG. 9.3 Algorithme dinsertion dans un arbre binaire de recherche.
5
15
12 3
10 13
6
7
18
20
23
16 5
15
12 3
10
6
7
18
20
23
16
(a)
5
15
12 3
10 13
6
7
18
20
23
16
18
20
23
5
15
12 3
10 13
6
7
(b)
12
10 13 1 4
3
5
15
6
7
18
20
23
16
1 4
3
5
15
12
10 13
7
18
20
23
16
1 4
3
6
15
12
10 13
7
18
20
23
16
(c)
FIG. 9.4 Les diffrents cas de gure possibles lors de la suppression dun nud dun arbre binaire de recherche (les
nuds supprimer sont en gris fonc) : a) le nud supprimer na pas de ls et on llimine simplement de larbre ;
b) le nud supprimer a un unique ls, on dtache le nud et on relie directement son pre et son ls ; c) le nud
supprimer a deux ls, on le remplace par son successeur (qui, dans ce cas, est toujours le minimum de son ls droit,
nud qui est ici lgrement gris).
66 CHAPITRE 9. ARBRES DE RECHERCHE ET ARBRES DE RECHERCHE QUILIBRS
ARBRE-SUPPRESSION(T, x)
si gauche(x) = NIL et droit(x) = NIL
alors
si pre(x) = NIL
alors racine(T) NIL
sinon si x = gauche(pre(x))
alors gauche(pre(x)) NIL
sinon droit(pre(x)) NIL
sinon si gauche(x) = NIL ou droit(x) = NIL
alors
si gauche(x) ,= NIL
alors lsde_x gauche(x)
sinon lsde_x droit(x)
pre(lsde_x)pre(x)
si pre(x) = NIL
alors racine(T)lsde_x
sinon si gauche(pre(x)) = x
alors gauche(pre(x)) lsde_x
sinon droit(pre(x)) lsde_x
sinon
min ARBRE-MINIMUM(droit(x))
cl(y) cl(min)
ARBRE-SUPPRESSION(T, min)
renvoyer racine(T)
FIG. 9.5 Suppression dun lment dans un arbre binaire de recherche.
9.1.5 Complexit
Si h est la hauteur de larbre, on peut aisment montrer que tous les algorithmes prcdents ont une complexit en
O(h). Malheureusement, un arbre binaire quelconque n nuds a une hauteur comprise, en ordre de grandeur, entre
log
2
n et n. Pour viter les cas les plus pathologiques, on sintresse des arbres de recherches quilibrs.
9.2 Arbres rouge et noir
Les arbres rouge et noir sont un des schmas darbres de recherche dits quilibrs.
9.2.1 Dnition
Dnition 13 (Arbre rouge et noir). Un arbre binaire de recherche est un arbre rouge et noir sil satisfait les
proprits suivantes :
1. Chaque nud est soit rouge, soit noir.
2. Chaque feuille (NIL) est noire.
3. Si un nud est rouge, alors ses deux ls sont noirs.
4. Tous les chemins descendants reliant un nud donn une feuille (du sous-arbre dont il est la racine) contiennent
le mme nombre de nuds noirs.
On appelle hauteur noire dun nud x le nombre de nuds noirs sur un chemin descendant de x une feuille.
La gure 9.6 prsente un exemple darbre rouge et noir.
9.2. ARBRES ROUGE ET NOIR 67
15
NIL NIL
NIL NIL
NIL NIL
NIL
NIL NIL NIL
2
4
1
7
11
14
5 8
FIG. 9.6 Exemple darbre rouge et noir. Les hauteurs noires sont indiques ct des nuds.
9.2.2 Rotations
La gure 9.7 prsente les transformations darbres binaires appeles rotations pour dvidentes raisons. La
gure 9.8 prsente lalgorithme ralisant la rotation gauche (la rotation droite tant bien videmment symtrique). Les
rotations prservent la proprit des arbres de recherche mais pas la proprit des arbres rouge et noir.
x
y
A B
C
y
x
C B
A
ROTATION-DROITE(T, y)
ROTATION-GAUCHE(T, y)
FIG. 9.7 Rotations sur un arbre binaire de recherche.
9.2.3 Insertion
Pour raliser linsertion dans un arbre rouge et noir, on peut essayer dinsrer le nouveau nud comme si larbre
ntait quun vulgaire arbre de recherche. Pour ce qui est du choix de la couleur du nud insr, le noir est a priori
proscrire puisquil provoquerait systmatiquement une violation de la proprit 4. On choisit donc de colorier le
nouveau nud en rouge ce qui provoquera parfois des violations de la proprit 3 : un pre et un ls tant tous les
deux rouges. Nous tudions les diffrents cas de violations. La gure 9.9 prsente une premire srie de congura-
tions pathologiques qui sont transformes en dautres congurations. La gure 9.10 prsente une deuxime srie de
congurations pathologiques, ces congurations l pouvant tre rsolues par lapplication dune ou de deux rotations
suivant les cas. La gure 9.11 prsente lalgorithme dinsertion dun lment dans un arbre rouge et noir obtenu suite
cette tude de cas, et la gure 9.12 prsente de nouveau les diffrents cas pathologiques sur un exemple.
9.2.4 Suppression
Pour supprimer un lment dans un arbre rouge et noir, on commence par appliquer lalgorithme de suppression
pour les arbres de recherche. Si llment supprim tait de couleur rouge, aucune des proprits des arbres rouge et
noir nest viole. Par contre, si le nud supprim tait noir la proprit 4 (tous les chemins descendants dun nud
une feuille contiennent le mme nombre de nuds noirs) peut tre viole. Il nous faut donc rajouter un noir sur
tous les chemins perturbs. Pour ce faire, on rajoute un noir lunique ls du nud supprim (pour lunicit du ls,
voir lalgorithme de suppression gure 9.5). Si ce ls tait rouge, larbre obtenu est un arbre rouge et noir. Si ce ls
tait dj noir, on a deux noirs empils sur un mme nud et il nous faut les rpartir. La gure 9.13 prsente les
68 CHAPITRE 9. ARBRES DE RECHERCHE ET ARBRES DE RECHERCHE QUILIBRS
ROTATION-GAUCHE(T, x)
y droit(x)
droit(x) gauche(y)
si gauche(y) ,= NIL alors pre(gauche(y)) x
pre(y) pre(x)
si pre(y) = NIL
alors racine(T)y
sinon si x = gauche(pre(x))
alors gauche(pre(x)) y
sinon droit(pre(x)) y
gauche(y) x
pre(x) y
FIG. 9.8 Algorithme de rotation gauche pour un arbre binaire.
Transformation
Transformation
A

B
D

D

A

A

B
D

D
A

x
nouvel x
nouvel x
x

C
C
C
C
FIG. 9.9 Premire srie de cas pathologiques rencontrs par lalgorithme dinsertion. Les nuds noirs sont fond
noir, et les rouges sont fond blanc. Ici, seule la proprit 3 est viole, x tant le nud source du problme. Par
consquent, les sous-arbres , , , et sont tous de racine noire et ont tous la mme hauteur noire. Lalgorithme fait
descendre la couleur noire du grand-pre de x sur le pre et loncle de x, ce qui revient faire remonter le problme
dans larbre, seule la proprit 3 pouvant tre viole par cette transformation. Les cas non traits sont symtriques de
ceux prsents.
9.2. ARBRES ROUGE ET NOIR 69
A C

A

B

A

B

C

B

ROTATION-GAUCHE(A)
ROTATION-DROITE(C) ROTATION-GAUCHE(A)
ROTATION-DROITE(C)
arbre valide
(b) (c)
(d) (a)
x
x
x
x
B C
C
A
A
FIG. 9.10 Deuxime srie de cas pathologiques rencontrs par lalgorithme dinsertion. Les nuds noirs sont
fond noir, et les rouges sont fond blanc. Ici, seule la proprit 3 est viole, x est le nud source du problme et
nous ne sommes pas dans un des cas traits par la gure 9.9. Par consquent, les sous-arbres , , et sont tous de
racine noire et ont tous la mme hauteur noire (et les transformations dun cas lautre prservent cette proprit). Ici
on conjugue des rotations et des changements de couleur des nuds.
diffrents cas de gure possibles et les mthodes de rsolutions associes. Si le nud supprim navait pas de ls, on
rajoute un noir la feuille NIL correspondante de son pre. Pour pouvoir raliser cette manipulation, on utilise une
sentinelle : un nud spcial valant NIL et qui permet de ne pas traiter part les feuilles NIL. La gure 9.14 prsente
lalgorithme de suppression avec utilisation de sentinelles et appel de lalgorithme de correction celui qui rpartit
les noirs surnumraires lui-mme prsent gure 9.15.
9.2.5 Complexit
Thorme 8 (Hauteur des arbres rouge et noir). Un arbre rouge et noir contenant n nuds internes a une hauteur
au plus gale 2log(n+1).
On peut montrer par induction que le sous-arbre (dun arbre rouge et noir) enracin en un nud x quelconque
contient au moins 2
hn(x)
nuds internes, o hn(x) est la hauteur noire de x. Sachant que la hauteur est toujours inf-
rieure au double de la hauteur noire on en dduit la borne du thorme 8.
Ce thorme montre bien que les arbres rouge et noir sont relativement quilibrs : la hauteur dun arbre rouge et
noir est au pire du double de celle dun arbre binaire parfaitement quilibr.
Toutes les oprations sur les arbres rouge et noir sont de cot O(h), cest--dire O(logn), ce qui justie leur
utilisation par rapport aux arbres binaires de recherche classiques.
70 CHAPITRE 9. ARBRES DE RECHERCHE ET ARBRES DE RECHERCHE QUILIBRS
ROUGENOIR-INSERTION(T, x)
ARBRE-INSERTION(T, x)
couleur(x) ROUGE
tant que x ,= racine(T) et couleur(pre(x)) = ROUGE faire
si pre(x) = gauche(grand-pre(x))
alors
y droit(grand-pre(x))
si couleur(y) = ROUGE
alors cas de la gure 9.9
couleur(pre(x))NOIR
couleur(y)NOIR
couleur(grand-pre(x))ROUGE
x grand-pre(x)
sinon cas de la gure 9.10
si x =droit(pre(x))
alors cas a) de la gure 9.10
x pre(x)
ROTATION-GAUCHE(T, x)
cas b) de la gure 9.10
couleur(pre(x))NOIR
couleur(grand-pre(x))ROUGE
ROTATION-DROITE(T, grand-pre(x))
sinon (mme chose que prcdemment en changeant droit et gauche)
couleur(racine(T))NOIR
FIG. 9.11 Algorithme dinsertion dans un arbre rouge et noir.
9.2. ARBRES ROUGE ET NOIR 71
2
5 8
4
15 1
14
11
7
2
4
15 1
8
14
11
5
7
(a) (b)
4
15
2
5
11
14
8
7
1
15 4
2
8 5 1
7
11
14
(c) (d)
FIG. 9.12 Exemple dinsertion dans un arbre rouge et noir faisant apparatre les diffrents cas de gure pathologiques
pouvant apparatre aprs linsertion. Les nuds noirs sont fond noir, et les rouges sont fond blanc. chaque
fois le nud x et son pre sont tous les deux rouges : a) loncle de x est galement rouge, nous nous trouvons donc
dans le cas de la gure 9.9, le pre et loncle de x sont donc repeints en rouge et son grand-pre en noir, le problme est
alors remont de deux crans ; b) loncle de x est noir et x est le ls gauche de son pre, nous nous trouvons donc dans
le cas a) de la gure 9.10, nous appliquons alors une rotation gauche sur le pre de x et nous aboutissons la situation
du cas suivant ; c) loncle de x est noir, x est le ls droit de son pre et son pre est le ls gauche de son grand-pre,
nous nous trouvons donc dans le cas b) de la gure 9.10, nous appliquons alors une rotation droite sur le grand-pre
de x, lancien grand-pre de x est alors repeint en noir et le pre de x en rouge, ce qui nous donne un arbre rouge et
noir valide.
72 CHAPITRE 9. ARBRES DE RECHERCHE ET ARBRES DE RECHERCHE QUILIBRS
Cas 3
D
C
A

x
c
E
D
A


x w

c

nouveau w
E
D
A


x w

c
E
D
A


x w

Cas 4
A
B
E

E
D
A


x w

Cas 1
A
B
E

nouv.

w
Cas 2
E
D
A



c nouvel x
x
B B
C
E
C
B
C
B
C
D
C
B
C
D
B
C
FIG. 9.13 Congurations pathologiques pour la suppression dans un arbre rouge et noir. Les nuds fond noir sont
des nuds noirs , ceux fond blanc sont rouges et ceux fond gris sont soit noirs soit rouges . , ,
, , et dsignent des arbres quelconques. Le nud x comporte un noir supplmentaire. (1) Ce cas est transform
en cas 2, 3 ou 4. (2) Le noir supplmentaire est remont sur le pre de x, loncle de x tant repeint en rouge ; si le pre
de x tait rouge larbre est de nouveau valide, sinon on rapplique lalgorithme de correction cette fois-ci sur le pre
de x. (3) Ce cas est transform en cas 4. (4) Le noir supplmentaire est limin par rotation gauche sur le pre de x et
recoloriage du pre et de loncle de x.
9.2. ARBRES ROUGE ET NOIR 73
ARBRE-RN-SUPPRESSION(T, x)
si gauche(x) = NIL(T) et droit(x) = NIL(T)
alors
si pre(x) = NIL(T)
alors racine(T) NIL(T)
sinon
si x = gauche(pre(x))
alors gauche(pre(x)) NIL(T)
sinon droit(pre(x)) NIL(T)
si couleur(x) = NOIR
alors
pre(NIL(T)) pre(x)
RN-CORRECTION(T, x)
sinon si gauche(x) = NIL(T) ou droit(x) = NIL(T)
alors
si gauche(x) ,= NIL(T)
alors lsde_x gauche(x)
sinon lsde_x droit(x)
pre(lsde_x)pre(x)
si pre(x) = NIL(T)
alors racine(T)lsde_x
sinon si gauche(pre(x)) = x
alors gauche(pre(x)) lsde_x
sinon droit(pre(x)) lsde_x
si couleur(x) = NOIR alors
RN-CORRECTION(T, lsde_x)
sinon
min ARBRE-MINIMUM(droit(x))
cl(y) cl(min)
ARBRE-RN-SUPPRESSION(T, min)
renvoyer racine(T)
FIG. 9.14 Suppression dun lment dans un arbre rouge et noir.
74 CHAPITRE 9. ARBRES DE RECHERCHE ET ARBRES DE RECHERCHE QUILIBRS
RN-CORRECTION(T, x)
tant que x ,= racine(T) et couleur(x) = NOIR faire
si x = gauche(pre(x))
alors
w droit(pre(x))
si couleur(w) = ROUGE
alors cas 1 de la gure 9.13
couleur(w) NOIR
couleur(pre(w)) ROUGE
ROTATION-GAUCHE(T, pre(x))
w droit(pre(x))
si couleur(gauche(w)) = NOIR et couleur(droit(w)) = NOIR
alors cas 2 de la gure 9.13
couleur(w) ROUGE
x pre(x)
sinon
si couleur(droit(w)) = NOIR
alors cas 3 de la gure 9.13
couleur(gauche(w)) NOIR
couleur(w) ROUGE
ROTATION-DROITE(T, w)
w droit(pre(x))
cas 4 de la gure 9.13
couleur(w) couleur(pre(x))
couleur(pre(x)) NOIR
couleur(droit(w))) NOIR
ROTATION-GAUCHE(T, pre(x))
x racine(T)
sinon (mme chose que prcdemment en changeant droit et gauche)
couleur(x) NOIR
FIG. 9.15 Correction dun arbre rouge et noir aprs suppression dun lment.
Chapitre 10
Plus courts chemins
Dans un problme de plus courts chemins, on possde en entre un graphe orient pondr G = (S, A) de fonction
de pondration w : A R. Le poids du chemin p =v
0
, v
1
, ..., v
k
) est la somme des poids de ses arcs :
w(p) =
k

i=1
w(v
i1
, v
i
).
Le poids (u, v) dun plus court chemin dun sommet u un sommet v est bien videmment le minimum des poids des
chemins de u v (si celui-ci est dni, ce qui peut ne pas tre le cas si le graphe contient un circuit de poids strictement
ngatif). Un plus court chemin dun sommet u un sommet v est alors un chemin de u v de poids (u, v).
10.1 Plus courts chemins origine unique
On souhaite dans cette section trouver les plus courts chemins depuis un sommet origine s et vers nimporte quel
autre sommet.
Dans la suite, [u] dsignera le prdcesseur de u dans lestimation du plus court chemin de s u et d[u] dsignera
la longueur de ce chemin.
10.1.1 Algorithme de Dijkstra
Lalgorithme de Dijkstra rsout le problme de la recherche dun plus court chemin origine unique pour un
graphe orient pondr G = (S, A) dans le cas o tous les arcs ont un poids positif ou nul : (u, v) A, w(u, v) 0.
Lalgorithme de Dijkstra maintient jour un ensemble E des sommets de G dont le plus court chemin partir de
lorigine s est connu et calcul. chaque itration, lalgorithme choisit parmi les sommets de S E cest--dire
parmi les sommets dont le plus court chemin partir de lorigine nest pas connu le sommet u dont lestimation
de plus court chemin est minimale. Cet algorithme est donc glouton. Une fois un sommet u choisi, lalgorithme met
jour, si besoin est, les estimations des plus courts chemins de ses successeurs (les sommets qui peuvent tre atteint
directement partir de u).
SOURCE-UNIQUE-INITIALIZATION initialise les valeurs de [u] et de d[u] pour chaque sommet u : initialement,
il ny a pas de chemin connu de s u (si u ,= s) et u est estim tre une distance innie de s.
RELCHER(u, v, w) compare le plus court chemin de s v connu avec une nouvelle proposition (chemin estim de
s u puis arc de u v), et met les diffrentes donnes jour si besoin est.
Lalgorithme est prsent gure 10.1.
Cet algorithme fourni effectivement les plus courts chemins. Lalgorithme glouton fonctionne uniquement parce
que les poids sont positifs. On montre la correction de lalgorithme par rcurrence.
Le premier sommet ajout E est s car d[s] vaut alors 0 quand toutes les autres distances estimes sont innies.
Supposons qu un instant donn pour chaque sommet u de E, d[u] est bien la longueur du plus court chemin
de s u. On rajoute alors un sommet v E. d[v] est alors minimale parmi les sommets de S E. Montrons que
d[v] = (s, v).
75
76 CHAPITRE 10. PLUS COURTS CHEMINS
SOURCE-UNIQUE-INITIALIZATION[G, s]
pour chaque sommet v de G faire
d[v] +
[v] NIL
d[s] 0
RELCHER(u, v, w)
si d[v] > d[u] +w(u, v) alors
d[v] d[u] +w(u, v)
[v] u
DIJKSTRA(G, w, s)
SOURCE-UNIQUE-INITIALIZATION(G, s)
E / 0
F S
tant que F ,= / 0 faire
u EXTRAIRE-MIN(F)
E E u
pour chaque arc (u, v) de G faire
RELCHER(u, v, w)
FIG. 10.1 Algorithme de Dijkstra pour le calcul des plus courts chemins.
Soit p un plus court chemin de s v Soit y le premier sommet de p nappartenant pas E. Par minimalit de d[v]
on a : d[v] d[y]. De plus on a d[y] =(s, y) : parce que p contient le plus court chemin de s x et donc de s au
prdcesseur z de y, parce que d[z] =(s, z) par hypothse de rcurrence, et nalement parce que z a t relch.
Par positivit des poids, (s, y) (s, v). Donc d[v] d[y] = (s, y) (s, v) et d[v] = (s, v).
La gure 10.2 prsente un exemple dexcution de lalgorithme de Dijkstra.
Complexit
La complexit de lalgorithme dpend de la complexit de lopration EXTRAIRE-MIN. Dans le cas (dfavorable)
o on implmente lensemble F au moyen dun simple tableau, la recherche du minimum cote chaque fois ([F[) =
O([S[). La boucle tant que sexcutant exactement [S[ fois, et chaque arc tant visit une unique fois, la complexit
de lalgorithme est O([S[
2
+[A[) = O([S[
2
).
10.1.2 Algorithme de Bellman-Ford
Lalgorithme de Bellman-Ford rsout le problme des plus courts chemins avec origine unique dans le cas gnral
o le poids des arcs peut tre ngatif. Appel sur un graphe G = (S, A), lalgorithme de Bellman-Ford renvoie un
boolen indiquant si le graphe contient ou non un circuit de poids strictement ngatif accessible partir de lorigine.
Lalgorithme est prsent gure 10.3.
Correction
La correction de lalgorithme de Bellman-Ford peut se montrer par rcurrence sur le nombre darcs des plus courts
chemins : la n de la i
e
itration de la premire boucle, les plus courts chemins contenant au plus i arcs sont connus,
la condition que le graphe ne contienne aucun circuit de poids strictement ngatif. [S[ 1 itrations sufsent car un
plus court chemin est lmentaire (sans perte de gnralit) et contient donc au plus [S[ 1 arcs.
Vu ce qui prcde, lalgorithme renvoie VRAI sil ny a pas de circuit de poids strictement ngatif. Montrons
quil renvoie FAUX sinon. Pour sen convaincre, prenons un circuit c de sommets u
0
, u
1
, ..., u
p1
, u
p
u
0
. Si lalgorithme
10.1. PLUS COURTS CHEMINS ORIGINE UNIQUE 77
1
10
5
6
7
2
4
2 3
0
5
10

9
a) b)
d) e)
1
10
5
6
7
2
4
2 3
0
9
c)
f)
1
10
5
6
7
2
4
2 3
0
5
8 9
7
9
1
10
5
6
7
2
4
2 3
0
5
8 14
7
9
1
10
5
6
7
2
4
2 3
0
5
8 9
7
9
1
10
5
6
7
2
4
2 3
0
5
8 13
7
9
FIG. 10.2 Exemple dexcution de lalgorithme de Dijkstra : lorigine est le sommet le plus gauche ; dans chaque
graphe, les sommets noirs sont lments de E, le sommet gris est celui qui va tre rajout E et les arcs en pointills
sont ceux utiliss pour les estimations des plus courts chemins, les longueurs de ces chemins tant indiques dans les
sommets.
BELLMAN-FORD(G, s, w)
SOURCE-UNIQUE-INITIALIZATION(G, s)
pour i 1 [S[ 1 faire
pour chaque arc (u, v) A faire
RELCHER(u, v, w)
pour chaque arc (u, v) A faire
si d[v] > d[u] +w(u, v) alors renvoyer FAUX
renvoyer VRAI
FIG. 10.3 Algorithme de Bellman-Ford pour le calcul des plus courts chemins.
78 CHAPITRE 10. PLUS COURTS CHEMINS
renvoie VRAI, alors pour tout i [1, p], on a d(u
i
) d(u
i1
+w(u
i1
, u
i
). Par sommation on obtient :
p

i=1
d(u
i
)
p

i=1
d(u
i1
+
p

i=1
w(u
i1
, u
i
)
p

i=1
d(u
i
)
p1

i=0
d(u
i
+w(c) d(u
p
) d(u
0
) +w(c) 0 w(c).
Donc, si lalgorithme renvoie VRAI le graphe ne contient pas de circuit de poids strictement ngatif.
Complexit
Cet algorithme est en ([S[.[A[) car linitialisation et la vrication de la non-existence dun circuit de poids
strictement ngatif sont en ([S[) et ([A[) respectivement, et car la boucle pour sexcute exactement ([S[ 1)
fois et que chaque itration visite chaque arc exactement une fois ce qui nous cote ([S[.[A[).
La gure 10.4 prsente un exemple dexcution de cet algorithme.
c)
0
6
5
-2
-3
7
9
2 -4
8
x y
v u
z
6 4
2 7
7

a)
0
6
5
-2
-3
7
9
2 -4
8
x y
v u
z
d)
0
6
5
-2
-3
7
9
2 -4
8
x y
v u
z
2 4
2 7
7
7
b)
0
6
5
-2
-3
7
9
2 -4
8
x y
v u
z
6
7
7
e)
0
6
5
-2
-3
7
9
2 -4
8
x y
v u
z
2 4
-2 7
7
FIG. 10.4 Exemple dexcution de lalgorithme de Bellman-Ford : lorigine est le sommet le plus gauche ; dans
chaque graphe les arcs en pointills sont ceux utiliss pour les estimations des plus courts chemins, les longueurs de
ces chemins tant indiques dans les sommets. Les arcs sont considrs dans lordre lexicographique : (u, v), (u, x),
(u, y), (v, u), (x, v), (x, y), (y, v), (z, u) et (z, x).
10.2 Plus courts chemins pour tout couple de sommets
Nous nous intressons ici la recherche des plus courts chemins entre tous les couples de sommets dun graphe
(typiquement on cherche laborer la table des distances entre tous les couples de villes dun atlas routier). On dispose
en entre dun graphe G = (S, A) et dune fonction de pondration w.
10.2. PLUS COURTS CHEMINS POUR TOUT COUPLE DE SOMMETS 79
Nous supposons dans cette section quil peut y avoir des arcs de poids ngatifs, mais quil nexiste pas de circuits
de poids strictement ngatifs.
10.2.1 Programmation dynamique nave
Sous-structure optimale
Comme nous lavons dj remarqu prcdemment (pour lalgorithme glouton de Dijkstra), tout sous-chemin dun
plus court chemin est lui-mme un plus court chemin.
Rsolution rcursive
La rcursion porte ici sur le nombre darcs du plus court chemin. On note d
(m)
i, j
le poids minimal dun chemin dau
plus m arcs du sommet i au sommet j. Pour m = 0 il existe un plus court chemin sans arc de i vers j si et seulement si
i = j :
d
(0)
i, j
=
_
0 si i = j,
sinon.
Pour m 1, d
(m)
i, j
est la longueur du plus court chemin de i j contenant au plus m arcs. Soit un tel plus court chemin
contient exactement m arcs et il est obtenu par concatnation dun plus court chemin dau plus m1 arcs de i un
sommet k et de larc de k j, soit il nen contient au plus que m1 et sa longueur est gale d
(m1)
i, j
. Par consquent :
d
(m)
i, j
= min
_
d
(m1)
i, j
, min
1kn
_
d
(m1)
i,k
+w
k, j
_
_
= min
1kn
_
d
(m1)
i,k
+w
k, j
_
,
la formule tant simplie grce la proprit : w
j, j
= 0.
Calcul ascendant des poids des plus courts chemins
On note W = (w
i, j
)
1i, jn
le matrice des poids et D
(m)
=
_
d
(m)
i, j
_
1i, jn
la matrice des poids des plus courts
chemins contenant au plus m arcs. Le calcul de D
(m)
partir de D
(m1)
et de W se fait au moyen de lalgorithme
ci-dessous :
EXTENSION-PLUS-COURTS-CHEMINS(D, W)
n lignes(D)
soit D
/
= (d
/
i, j
)
1i, jn
une matrice carre de taille n
pour i 1 n faire
pour j 1 n faire
d
/
i, j
+
pour k 1 n faire
d
/
i, j
min(d
/
i, j
, d
i,k
+w
k, j
)
renvoyer D
/
Lalgorithme EXTENSION-PLUS-COURTS-CHEMINS sexcute en (n
3
), cause des trois boucles imbriques.
partir de cet algorithme, la rsolution du problme est triviale (cf. gure 10.5). Le cot total de rsolution est donc en
(n
4
).
La gure 10.6 prsente un exemple dexcution de cet algorithme.
10.2.2 Algorithme de Floyd-Warshall
Lalgorithme de Floyd-Warshall est un autre algorithme conu suivant le principe de la programmation dynamique.
80 CHAPITRE 10. PLUS COURTS CHEMINS
PLUS-COURTS-CHEMINS(W)
n lignes(W)
D
(1)
W
pour m 2 n1 faire
D
(m)
EXTENSION-PLUS-COURTS-CHEMINS(D
(m1)
,W)
renvoyer D
(n1)
FIG. 10.5 Algorithme naf par programmation dynamique pour le calcul des plus courts chemins.
2
3 1
4 5
3 4
-5
-4
6
8
7
2
1
D
(1)
=
_
_
_
_
_
_
0 3 8 4
0 1 7
4 0
2 5 0
6 0
_
_
_
_
_
_
D
(2)
=
_
_
_
_
_
_
0 3 8 2 4
3 0 4 1 7
4 0 5 11
2 1 5 0 2
8 1 6 0
_
_
_
_
_
_
D
(3)
=
_
_
_
_
_
_
0 3 3 2 4
3 0 4 1 1
7 4 0 5 11
2 1 5 0 2
8 5 1 6 0
_
_
_
_
_
_
D
(4)
=
_
_
_
_
_
_
0 1 3 2 4
3 0 4 1 1
7 4 0 5 3
2 1 5 0 2
8 5 1 6 0
_
_
_
_
_
_
FIG. 10.6 Un graphe orient et la squence des matrices calcules par PLUS-COURTS-CHEMINS.
10.2. PLUS COURTS CHEMINS POUR TOUT COUPLE DE SOMMETS 81
Structure dun plus court chemin
Ici, la rcursion na pas lieu sur le nombre darcs dun plus court chemin, mais sur les sommets intermdiaires
de ces chemins, un sommet intermdiaire tant un sommet autre que les extrmits du chemin. On note 1, 2, ..., n
les n sommets de G. Ici, d
(k)
i, j
est la longueur du plus court chemin de i j nutilisant comme sommets intermdiaires
que des sommets parmi 1, 2, ..., k. De deux choses lune, un plus court chemin de i j nayant comme sommets
intermdiaires que des sommets de 1, 2, .., k contient ou ne contient pas le sommet k :
1. Si le plus court chemin p de i j et nayant comme sommets intermdiaires que des sommets de 1, 2, .., k a
effectivement comme sommet intermdiaire k, alors p est de la forme i
p
1
k
p
2
j o p
1
(resp. p
2
) est un plus court
chemin de i k (resp. de k j) nayant comme sommets intermdiaires que des sommets de 1, 2, ..., k 1.
2. Si le plus court chemin p de i j et nayant comme sommets intermdiaires que des sommets de 1, 2, .., k ne
contient pas k, alors cest un plus court chemin p de i j et nayant comme sommets intermdiaires que des
sommets de 1, 2, .., k 1.
Rsolution rcursive
La structure explicite aux paragraphes prcdent nous donne directement une rcursion dnissant d
(k)
i, j
:
d
(k)
i, j
=
_
w
i, j
si k = 0,
min(d
(k1)
i, j
, d
(k1)
i,k
+d
(k1)
k, j
) sinon.
Calcul ascendant des poids des plus courts chemins
Lalgorithme est prsent gure 10.7.
FLOYD-WARSHALL(W)
n lignes(W)
D
(0)
W
pour k 1 n faire
pour i 1 n faire
pour j 1 n faire
d
(k)
i, j
min(d
(k1)
i, j
, d
(k1)
i,k
+d
(k1)
k, j
)
renvoyer D
(n)
FIG. 10.7 Algorithme de Floyd-Warshall pour le calcul des plus courts chemins.
Construction des plus courts chemins
Tout comme on a dni rcursivement les longueurs des plus courts chemins, on peut dnir rcursivement les
prdcesseurs dans les plus courts chemins :
(k)
i, j
reprsente ici le prdcesseur du sommet j dans le plus court chemin
de i j nutilisant comme sommets intermdiaires que des sommets parmi 1, 2, ..., k. Pour k = 0, un plus court
chemin ne possde aucun sommet intermdiaire, donc :

(0)
i, j
=
_
NIL si i = j ou w
i, j
= ,
i si i ,= j et w
i, j
< .
Dans le cas gnral, si le plus court chemin est de la forme i k j le prdcesseur de j est le mme que celui
du plus court chemin de k j et nutilisant comme sommets intermdiaires que des sommets parmi 1, 2, ..., k 1.
Autrement, on prend le mme prdcesseur de j que celui qui se trouvait sur le plus court chemin de i j et nutilisant
comme sommets intermdiaires que des sommets parmi 1, 2, ..., k 1. Nous avons donc, dans tous les cas :

(k)
i, j
=
_
_
_

(k1)
i, j
si d
(k1)
i, j
d
(k1)
i,k
+d
(k1)
k, j
,

(k1)
k, j
si d
(k1)
i, j
> d
(k1)
i,k
+d
(k1)
k, j
.
82 CHAPITRE 10. PLUS COURTS CHEMINS
Complexit
On remarque aisment que lalgorithme de Floyd-Warshall est de complexit (n
3
).
La gure 10.8 prsente le rsultat de lexcution de lalgorithme de Floyd-Warshall sur le graphe de la gure 10.6.
D
(0)
=
_
_
_
_
_
_
0 3 8 4
0 1 7
4 0
2 5 0
6 0
_
_
_
_
_
_

(0)
=
_
_
_
_
_
_
NIL 1 1 NIL 1
NIL NIL NIL 2 2
NIL 3 NIL NIL NIL
4 NIL 4 NIL NIL
NIL NIL NIL 5 NIL
_
_
_
_
_
_
D
(1)
=
_
_
_
_
_
_
0 3 8 4
0 1 7
4 0
2 5 5 0 2
6 0
_
_
_
_
_
_

(1)
=
_
_
_
_
_
_
NIL 1 1 NIL 1
NIL NIL NIL 2 2
NIL 3 NIL NIL NIL
4 1 4 NIL 1
NIL NIL NIL 5 NIL
_
_
_
_
_
_
D
(2)
=
_
_
_
_
_
_
0 3 8 4 4
0 1 7
4 0 5 11
2 5 5 0 2
6 0
_
_
_
_
_
_

(2)
=
_
_
_
_
_
_
NIL 1 1 NIL 1
NIL NIL NIL 2 2
NIL 3 NIL 2 2
4 1 4 NIL 1
NIL NIL NIL 5 NIL
_
_
_
_
_
_
D
(3)
=
_
_
_
_
_
_
0 3 8 4 4
0 1 7
4 0 5 11
2 1 5 0 2
6 0
_
_
_
_
_
_

(3)
=
_
_
_
_
_
_
NIL 1 1 NIL 1
NIL NIL NIL 2 2
NIL 3 NIL 2 2
4 3 4 NIL 1
NIL NIL NIL 5 NIL
_
_
_
_
_
_
D
(4)
=
_
_
_
_
_
_
0 3 1 4 4
3 0 4 1 1
7 4 0 5 3
2 1 5 0 2
8 5 1 6 0
_
_
_
_
_
_

(4)
=
_
_
_
_
_
_
NIL 1 4 2 1
4 NIL 4 2 1
4 3 NIL 2 1
4 3 4 NIL 1
4 3 4 5 NIL
_
_
_
_
_
_
D
(5)
=
_
_
_
_
_
_
0 1 3 2 4
3 0 4 1 1
7 4 0 5 3
2 1 5 0 2
8 5 1 6 0
_
_
_
_
_
_

(5)
=
_
_
_
_
_
_
NIL 3 4 5 1
4 NIL 4 2 1
4 3 NIL 2 1
4 3 4 NIL 1
4 3 4 5 NIL
_
_
_
_
_
_
FIG. 10.8 Squence des matrice D
(k)
et
(k)
calcules par lalgorithme FLOYD-WARSHALL pour le graphe de la
gure 10.6.
Chapitre 11
NP-compltude
Tous les algorithmes que nous avons vu jusqu prsent, taient des algorithmes en temps polynomial : sur des
entres de taille n, leur temps dexcution dans le pire cas tait en O(n
k
) pour une certaine constante k. Do la
question : tous les problmes peuvent-ils tre rsolus en temps polynomial ?
Non, car certains ne peuvent pas tre rsolus (non dcidabilit de la terminaison) ;
Non, a priori, car il y a des problmes pour lesquels on ne connat que des algorithmes de cot exponentiel.
On aimerait donc savoir si un problme peut ou non tre rsolu par un algorithme polynomial : sil ne peut exister dal-
gorithme polynomial pour le rsoudre, il vaudra alors sans doute mieux dvelopper un algorithme dapproximation
(ou heuristique) polynomial quun algorithme de rsolution exact la complexit super-polynomiale.
La question de lexistence dun algorithme de rsolution de complexit polynomiale nous amne dnir des
classes de complexit : intuitivement on aimerait avoir une classe des programmes que lon peut rsoudre en temps
polynomial, une classe de problme plus compliqus, et un moyen de dterminer quelle classe appartient un pro-
blme.
11.1 La classe P
11.1.1 Problmes abstraits
Dnition
On dnit un problme abstrait Q comme une relation binaire sur un ensemble I dinstances dun problme et
un ensemble S de solutions de ce problme.
Exemple : prenons le problme PLUS-COURT-CHEMIN qui consiste trouver le plus court chemin entre deux
sommets dun graphe.
Une instance de ce problme est un triplet compos dun graphe et de deux sommets.
Une solution du problme est une squence de sommets du graphe (si la squence est vide, il nexiste pas de
chemin du graphe reliant les deux sommets).
Le problme lui-mme est la relation qui associe une instance donne une ou plusieurs solutions.
Restriction aux problmes de dcision
Dans le cadre de la thorie de la NP-compltude, nous nous restreindrons aux problmes de dcision, cest--dire
ceux dont la solution est soit vrai soit faux.
Exemple : prenons le problme CHEMIN qui rpond la question tant donn un graphe G, deux sommets u et v
et un entier positif k, existe-t-il dans G un chemin de u v de longueur au plus k ? .
Problmes doptimisation
De nombreux problmes abstraits ne sont pas des problmes de dcisions mais des problmes doptimisation.
Pour leur appliquer la thorie de la NP-compltude, le plus souvent on les reformulera sous la forme dun problme
83
84 CHAPITRE 11. NP-COMPLTUDE
doptimisation en imposant une borne sur la valeur optimiser, comme nous lavons fait en passant du problme
PLUS-COURT-CHEMIN au problme CHEMIN.
11.1.2 Codage
Dnition
Pour quun programme informatique puisse rsoudre un problme abstrait, il faut que ces instances soient repr-
sentes sous une forme comprhensible par le programme. On appelle codage dun ensemble S dobjets abstraits une
application e de S dans lensemble des chanes binaires (ou dans lensemble des chanes dun alphabet ni quelconque).
Exemple : le classique codage des entiers sous forme binaire...
Un algorithme informatique qui rsout un certain problme de dcision prend en fait en entre un codage dune
instance de ce problme. Un problme dont les instances forment lensemble des chanes binaires est appel problme
concret. On dit quun algorithme rsout un problme concret en O(T(n)) quand, sur une instance i du problme de
longueur n = [i[, lalgorithme est capable de produire la solution en au plus O(T(n)). Un problme concret est donc
rsoluble en temps polynomial sil existe un algorithme permettant de le rsoudre en temps O(n
k
) pour une certaine
constante k.
Dnition 14 (Classe de complexit P). La classe de complexit P est lensemble des problmes concrets de dcision
qui sont rsolubles en temps polynomial.
Limportance des codages
Pour quoi sembter avec des codages plutt que de dnir directement la complexit dun problme abstrait ?
Parce que la complexit dpend du codage... Pour le voir, considrons un algorithme qui prend comme unique entre
un entier k, et dont le temps dexcution est en (k).
Si lentier k est fourni en unaire (son codage est alors une chane de k 1), le temps dexcution de lalgorithme
est en O(n) sur des entres de longueur n, et lalgorithme est de complexit polynomiale.
Si lentier k est fourni en binaire, la longueur du codage est alors de n = log
2
k| +1, et le temps dexcution
de lalgorithme est en (k) = (2
n
), et lalgorithme est de complexit superpolynomiale.
On ne peut donc pas parler de la complexit de la rsolution dun problme abstrait sans spcier son codage.
Relativiser cette importance
Dnition 15 (Fonction calculable en temps polynomial). Une fonction f : 0, 1

0, 1

est calculable en
temps polynomial sil existe un algorithme polynomial qui, tant donn une entre x 0, 1

quelconque, produit le
rsultat f (x).
Deux codages e
1
et e
2
dnis sur un mme ensemble S sont relis polynomialement sil existe deux fonctions
calculables en temps polynomial, f
12
et f
21
telles que pour tout s S on a f
12
(e
1
(s)) = e
2
(s) et f
21
(e
2
(s)) = e
1
(s).
Autrement dit, un codage peut tre calcul partir de lautre en temps polynomial, et rciproquement.
Thorme 9. Soit Q un problme de dcision abstrait et soient e
1
et e
2
deux codages (des instances de Q) relis
polynomialement. Alors, le problme concret dni par Q et e
1
appartient la classe P si et seulement si il en va de
mme du problme concret dni par Q et e
2
.
11.2 La classe NP
11.2.1 Algorithme de validation
Considrons le problme CHEMIN et une de ses instances (G, u, v, k). La question qui nous intresse est donc :
existe-t-il dans le graphe G un chemin reliant les sommets u et v dont la longueur est infrieure ou gale k ? Si lon se
donne galement un chemin p de u vers v, on peut facilement vrier que la longueur de p est au plus gale k et, le
cas chant on peut voir p comme un certicat que le problme de dcision CHEMIN renvoie vrai sur cette instance.
11.3. NP-COMPLTUDE 85
Ici, la validation du fait que le problme concret de dcision CHEMIN renvoie vrai sur linstance (G, u, v, k), vali-
dation effectue partir du certicat p, prend autant de temps que la rsolution du problme partir de rien. Ce nest
pas toujours le cas.
Exemple : il est trivial de vrier quun chemin est un cycle hamiltonien (cycle simple contenant tous les sommets)
dun graphe donn alors que lon ne sait rsoudre ce problme quen temps super polynomial.
Dnition 16 (Algorithme de validation). Soit un problme concret de dcision Q. Un algorithme de validation
pour Q est un algorithme de dcision A deux arguments, o un argument est une instance x du problme, et o
lautre argument est un certicat y. Lalgorithme A valide lentre x si et seulement si il existe un certicat y tel que
A(x, y) = vrai. Bien videmment, lalgorithme A ne doit valider que les instances x de Q pour lesquelles Q(x) est vrai.
Si Q(x) = faux, il ne doit pas y avoir de certicat validant x.
Exemple : dans le problme du cycle hamiltonien, le certicat est la liste des sommets du cycle hamiltonien. Si un
graphe est hamiltonien, le cycle lui-mme offre toute linformation ncessaire pour le prouver. Rciproquement, si un
graphe nest pas hamiltonien, il nexiste aucune liste de sommets capable de faire croire lalgorithme de validation
que le graphe est hamiltonien : lalgorithme de validation se rend bien compte que le cycle dcrit par la liste des
sommets nest pas un cycle du graphe tudi.
Remarque : dans limmense majorit des cas le certicat sera une solution du problme considr...
11.2.2 La classe de complexit NP
Dnition 17 (Classe de complexit NP). La classe de complexit NP est lensemble des problmes concrets de
dcision Q pour lesquels il existe un algorithme polynomial de validation A.
c 0 telle que pour tout x instance de Q : Q(x) = vrai y certicat, [y[ = O([x[
c
), A(x, y) = vrai
Remarques
Daprs cette dnition et ce qui prcde, le problme CYCLE-HAMILTONIEN appartient NP.
P NP (soit Q un problme de la classe P, il existe donc un algorithme polynomial qui rsout Q, on le convertit
facilement en algorithme de validation qui ignore le certicat).
P = NP ? On nen sait rien. La majorit des chercheurs pense que P ,= NP, et donc que P NP.
La classe de complexit P est la classe des problmes qui peuvent tre rsolus rapidement. La classe de com-
plexit NP est celle des problmes pour lesquels une solution peut tre rapidement valide (vrie). Intuiti-
vement, P NP signierait quil existe des algorithmes difciles rsoudre mais dont une solution peut tre
facilement vrie...
11.3 NP-compltude
Une des raisons qui laissent penser que P ,= NP est lexistence de la classe des problmes NP-complets : si un
seul problme NP-complet peut tre rsolu en temps polynomial, alors tous les problmes de NP peuvent tre rsolus
en temps polynomial et P = NP. Mais aucun algorithme polynomial na jamais t dcouvert pour aucun problme
NP-complet. Les problmes NP-complets sont, dans un certain sens, les problmes les plus difciles de NP.
11.3.1 Rductibilit
Nous avons besoin de pouvoir comparer la difcult de problmes. Intuitivement, un problme Q
1
peut tre ramen
un problme Q
2
si une instance quelconque x de Q
1
peut tre facilement reformule comme une certaine instance
y de Q
2
. Dans ce cas, la rsolution du problme Q
2
(y) nous fournira la solution du problme Q
1
(x) et le problme Q
1
nest, dans un certain sens, pas plus difcile rsoudre que le problme Q
2
.
86 CHAPITRE 11. NP-COMPLTUDE
Exemple trivial : le problme de la rsolution dquations linaires une inconnue (ax+b =0) peut tre ramene
la rsolution dquations quadratiques (ax
2
+bx +c = 0).
Dnition 18 (Problme rductible un autre en temps polynomial). Soient Q
1
et Q
2
deux problmes concrets.
Q
1
est rductible en temps polynomial Q
2
(ce que lon note Q
1

P
Q
2
) sil existe une fonction calculable en temps
polynomial f : 0, 1

0, 1

telle que pour tout x 0, 1

:
Q
1
(x) = vrai si et seulement si Q
2
( f (x)) = vrai.
Exemple non trivial :
1. Problme Q
1
: problme de lexistence dun cycle Hamiltonien (cycle simple qui comprend tous les sommets)
dans un graphe donn G
1
.
2. Problme Q
2
: tant donn un graphe G
2
de villes valu des distances inter-villes, existe-t-il un cycle (pas
forcment simple) passant par toutes les villes, et de longueur infrieure une valeur xe M ?
3. Rduction de Q
1
Q
2
:
On cre un graphe G
2
de villes contenant autant de villes que G
1
de sommets. On associe chaque sommet de
G
1
une ville de G
2
.
Si deux sommets de G
1
sont relis par une arte, on relie les deux villes correspondantes de G
2
par une arte
value de la distance interville 1 , et sinon value par la distance interville 2 .
4. On excute lalgorithme rsolvant Q
2
sur G
2
avec M =n, le nombre de sommets de G
1
. Sil existe un tel cycle...
il est hamiltonien ! Et si G
1
admet un cycle hamiltonien, G
2
admet un cycle tel que recherch.
5. G
2
contient autant de villes que G
1
de sommets, et le nombre dartes de G
2
est gal au nombre de paires de
sommets de G
1
:
n(n1)
2
. La rduction est linaire en la taille de G
2
et est donc bien polynomiale en la taille de
G
1
.
11.3.2 Dnition de la NP-compltude
Les rductions en temps polynomial fournissent un moyen formel de montrer quun problme est au moins aussi
difcile quun autre, un facteur polynomial prs : si Q
1

P
Q
2
, alors Q
1
nest pas plus difcile rsoudre un facteur
polynomial prs, que Q
2
. Les rductions nous permettent de dnir lensemble des problmes NP-complets, qui sont
les problmes les plus difciles de NP.
Dnition 19 (Problme NP-complet). Un problme Q est NP-complet si
1. Q NP.
2. Q
/
NP, Q
/

P
Q.
On note NPC la classe des problmes NP-complets.
Un problme concret qui vrie la proprit 2 mais pas ncessairement la proprit 1 est dit NP-difcile.
Thorme 10. Si un problme de NP est rsoluble en temps polynomial, alors P = NP. De faon quivalente, si un
problme quelconque de NP nest pas rsoluble en temps polynomial, alors aucun problme NP-complet ne peut se
rsoudre en temps polynomial.
11.3.3 Exemples de problmes NP-complets
Il existe des problmes NP-complets :
SAT : soit une formule boolenne compose de variables x
1
, ..., x
n
et de connecteurs (et, ou, non, implication,
quivalence) et de parenthses ; existe-t-il une affectation des variables x
1
, ..., x
n
pour laquelle la formule soit
vraie ?
Premier problme dont la NP-compltude ait t dmontre, par Cook en 1971.
3-SAT : mme problme que SAT, la formule tant sous forme normale conjonctive trois littraux, cest--dire
de la forme : ET
iI
(t
i,1
ou t
i,2
ou t
i,3
) avec i, j, k, t
i, j
= x
k
ou t
i, j
=x
k
.
PARTITION : peut-on diviser un ensemble dentier en deux ensembles de mme somme ?
11.3. NP-COMPLTUDE 87
CLIQUE : un graphe donn contient-il une clique (un sous-graphe complet) de taille k ?
CYCLE-HAMILTONIEN.
VOYAGEUR-DE-COMMERCE : le voyageur de commerce veut faire la tourne dun ensemble de villes (cycle
hamiltonien) la plus courte possible.
3-COLORIAGE DUN GRAPHE : peut-on colorier laide de trois couleurs les sommets dun graphe de sorte que
deux sommets adjacents aient des couleurs diffrentes ?
11.3.4 Preuves de NP-compltude
Comment dmontrer quun problme est NP-complet ?
Thorme 11. Si Q
1
est un problme tel que Q
2

P
Q
1
pour un certain problme Q
2
NPC, alors Q
1
est NP-difcile.
De plus, si Q
1
NP, alors Q
1
NPC.
Commentaire : la premire assertion montre que Q
1
est polynomialement plus difcile quun problme polyno-
mialement plus difcile que tous les problmes de NP.
Mthode pour montrer la NP-compltude dun problme Q
1
1. Prouver que Q
1
NP.
2. Choisir un problme NP-complet Q
2
.
3. Dcrire un algorithme polynomial capable de calculer une fonction f faisant correspondre toute instance de Q
2
une instance de Q
1
.
4. Dmontrer que la fonction f satisfait la proprit :
Q
2
(x) = vrai si et seulement si Q
1
( f (x)) = vrai.
5. Dmontrer que lalgorithme calculant f sexcute en temps polynomial.
Preuve de la NP-compltude de Cycle-Ham
1. On a vu la section 11.2.1 un algorithme polynomial de validation de CYCLE-HAM. Par consquent, CYCLE-
HAM NP.
2. On a choisi le problme de lexistence dun cycle passant par tous les sommets et de taille borne (on suppose
que lon sait que ce problme est NP-complet).
3. On a vu la section 11.3.1 un algorithme de rduction.
4. On a montr la section 11.3.1 la correction de la rduction.
5. On a montr la section 11.3.1 que lalgorithme de rduction tait polynomial.
Donc le problme CYCLE-HAM est NP-complet.
88 CHAPITRE 11. NP-COMPLTUDE
Chapitre 12
Heuristiques
Si le problme rsoudre est NP-complet, plutt que dlaborer un algorithme de complexit super-polynomiale,
on peut avoir intrt recourir un algorithme dapproximation ou heuristique cest--dire un algorithme
qui ne construira que des solutions presque optimales. On recherchera bien videmment des algorithmes dapproxi-
mations de complexit polynomiale .
Bornes de performances
Supposons que lon cherche rsoudre un problme doptimisation dans lequel chaque solution potentielle a un
cot positif et que lon cherche trouver une solution de cot minimal. Un algorithme dapproximation a une borne
(n) si pour toute entre de taille n, le cot dune solution produite par lalgorithme est au plus (n) fois le cot C

dune solution optimale :


C
C

(n),
autrement dit, un algorithme dapproximation a une borne (n) si pour toute entre de taille n, une solution produite
par lalgorithme est au pire (n) fois plus coteuse quune solution optimale. Un algorithme dapproximation qui
admet une borne est appel heuristique garantie.
On peut, de mme dnir lerreur relative dun algorithme dapproximation par :
[CC

[
C

.
Un algorithme dapproximation a une borne derreur relative gale (n) si et seulement si :
[CC

[
C

(n).
Un schma dapproximation est un algorithme dapproximation qui prend en entre, en plus dune instance du
problme, une valeur > 0 et qui renvoie une solution approche avec une borne derreur relative gale . Il sagit
donc dune heuristique dont on peut contraindre la prcision.
12.1 Le problme de la couverture de sommet
Soit un graphe non orient G = (S, A). Une couverture de sommet est un sous ensemble S
/
de S (S
/
S) tel que si
(u, v) est une arte de G, alors soit u S
/
, soit v S
/
(soit u et v appartiennent tous deux S
/
). La taille dune couverture
est le nombre de sommets quelle contient.
Le problme de la couverture de sommet consiste trouver une couverture de sommet de taille minimale. Ce
problme est NP-difcile (le problme de dcision associ est NP-complet).
89
90 CHAPITRE 12. HEURISTIQUES
12.1.1 Heuristique
Bien que le problme de la couverture de sommet soit compliqu, on peut facilement concevoir une heuristique
garantie pour le rsoudre :
COUVERTURE-SOMMET-APPROCHE(G)
C / 0
A
/
A
tant que A
/
,= / 0 faire
soit (u, v) une arte arbitraire de A
/
C Cu, v
supprimer de A
/
toutes les artes incidentes soit u soit v
renvoyer C
12.1.2 Exemple dutilisation
b
a e
c d
f g
a)
b
a e
c d
f g
b)
b
a e
c d
f g
c)
b
a e
c d
f g
d)
b
a e
c d
f g
e)
b
a e
c d
f g
f)
FIG. 12.1 Exemple dutilisation de lalgorithme COUVERTURE-SOMMET-APPROCHE, les sommets sur fond blanc
tant ceux appartenant la couverture : a) le graphe G de dpart ; b) larte (b, c), en gras, est la premire choisie par
COUVERTURE-SOMMET-APPROCHE, les sommets b et c sont rajouts la couverture ; c) larte (e, f) est choisie
et les sommets e et f sont rajouts la couverture ; d) larte (d, g) est choisie et les sommets d et g sont rajouts la
couverture ; e) la couverture produite contient donc les sommets b, c, d, e, f et g ; f) la couverture optimale ne contient
que trois sommets : b, d et e.
12.1.3 Garantie de performances
Thorme 12. Lheuristique COUVERTURE-SOMMET-APPROCHE possde une borne de 2.
12.2. LE PROBLME DU VOYAGEUR DE COMMERCE 91
Dmonstration
Soit E lensemble des artes qui ont t choisies la ligne 4 de lheuristique. Par construction, deux artes quel-
conque de E ne peuvent pas avoir un sommet en commun. Donc chaque excution de la ligne 5 de lheuristique ajoute
deux nouveaux sommets C et [C[ = 2 [E[. Soit C

une couverture de sommet de taille minimale. Comme deux


artes de E ne peuvent avoir de sommets en commun, un sommet de C

est incident au plus une arte de E. Par


ailleurs, par dnition dune couverture de sommets, C

doit contenir au moins une des deux extrmits de chacune


des artes de E. Donc [E[ [C

[. Do, [C[ 2[C

[.
12.2 Le problme du voyageur de commerce
Nous considrons ici aussi un graphe non orient G = (S, A). Mais ici le graphe est complet : chaque paire de
sommets est relie par une arte. On a un poids positif ou nul w(u, v) associ chaque arte (u, v) du graphe. Le
problme est ici de trouver un cycle hamiltonien (une tourne) de poids minimal.
Nous restreignons ici le problme en supposant que la fonction de poids w vrie lingalit triangulaire : soient
u, v et w trois sommets quelconques, alors :
w(u, w) w(u, v) +w(v, w).
TOURNE-APPROCHE(G, w)
Choisir arbitrairement un sommet r de G qui servira de racine
Construire un arbre couvrant minimal T pour G partir de la racine r
Soit L la liste des sommets visits lors dun parcours prxe de T
renvoyer le cycle hamiltonien H qui visite les sommets dans lordre de L.
Un arbre couvrant minimal est un arbre qui contient tous les sommets du graphe (= couvrant) et dont la somme
des poids des artes est minimale.
Un parcours prxe visite tous les sommets dun arbre. Larbre T tant ici couvrant, la liste L contient bien tous
les sommets du graphe et G est bien dni. Le parcours est prxe : un nud est donc visit avant que ses ls ne le
soient.
La complexit de cet algorithme est en (S
2
) car le graphe est complet (cest la complexit de la construction dun
arbre couvrant minimal dans ce cas).
12.2.1 Exemple dutilisation
Voir la gure 12.2.
12.2.2 Garantie de performances
Thorme 13. TOURNE-APPROCHE est un algorithme dapproximation ayant une borne gale deux pour le
problme du voyageur de commerce avec ingalit triangulaire.
Dmonstration
Nous devons donc montrer que, si H

est une tourne optimale, on a w(H) 2w(H

).
En supprimant certaines artes de H

(nimporte laquelle dans notre exemple), on peut toujours obtenir un arbre


couvrant T
/
. Do w(T
/
) w(H

). Comme T est, par dnition, un arbre couvrant de poids minimal, on a w(T)


w(T
/
) w(H

).
Un parcours complet de T liste les sommets ds quils sont visits pour la premire fois et galement quand ils
sont nouveau traverss aprs la visite dun sous-arbre. Soit W ce parcours. Le parcours complet dans notre exemple
a pour rsultat la liste :
a, b, c, b, h, b, a, d, e, f , e, g, e, d, a.
92 CHAPITRE 12. HEURISTIQUES
a) b)
e) d)
c)
c
d a
b f g
e
h
c
d a
b f g
e
h
c
d a
b f g
e
h
c
d a
b f g
e
h
c
d a
b f g
e
h
FIG. 12.2 Exemple dutilisation de lalgorithme TOURNE-APPROCHE : a) lensemble des sommets auxquels on
fait correspondre les sommets dune grille, le poids dune arte tant gal la distance euclidienne des deux sommets
quelle relie ; b) arbre couvrant de poids minimal et de racine a ; c) parcours de larbre partant de a ; un parcours
complet visite les sommets dans lordre : a, b, c, b, h, b, a, d, e, f, e, g, e, d et a ; un parcours prxe visite les
sommets dans lordre : a, b, c, h, d, e, f et g ; d) tourne des sommets obtenue partir du parcours prxe et de cot
environ 19,074 ; e) tourne optimale de cot environ 14,715.
Un parcours complet traverse toutes les artes de T exactement deux fois. Par consquent :
w(W) = 2w(T) 2w(H

).
W nest pas une tourne, et notre dmonstration nest pas termine ! Grce lingalit triangulaire, on peut
supprimer de W la visite dun sommet quelconque sans augmenter le poids : si un sommet v est supprim de W entre
les visites u et w, la nouvelle liste va directement de u w (avec un poids w(u, w) w(u, v) +w(v, w)). En appliquant
plusieurs fois ce rsultat, on peut supprimer de W toutes les visites chaque sommet sauf la premire, et sauf la
dernire visite du premier sommet (la racine). Dans notre exemple, on se retrouve avec la liste rduite :
a, b, c, h, d, e, f , g, a.
Cette liste est correspond exactement au parcours H et H est donc obtenu en supprimant (en utilisant lingalit
triangulaire) des sommets du parcours complet W. Par consquent :
w(H) w(W) et w(H) 2w(H

).
Bibliographie
[1] Robert Cori and Jean-Jacques Lvy. Algorithmes et programmation. http://www.enseignement.
polytechnique.fr/profs/informatique/Jean-Jacque%s.Levy/poly/. Cours de lcole Polytechnique.
[2] Thomas Cormen, Charles Leiserson, and Ronald Rivest. Introduction lalgorithmique. Dunod, 1994.
[3] Donald E. Knuth. Seminumerical Algorithms, volume 2 of The Art of Computer Programming. Addison Wesley,
1969.
[4] Donald E. Knuth. Sorting and searching, volume 3 of The Art of Computer Programming. Addison Wesley, 1973.
93

Vous aimerez peut-être aussi