Anda di halaman 1dari 88

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 xn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Dfinition 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 Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Dfinition 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 files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

5.2.1 Piles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5.2.2 Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 5.3 Listes chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.3.1 Dfinitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Dfinition 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 figures 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 file. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.5 Implmentation dune file par un tableau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.6 Algorithmes de manipulation des files 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 Efficacits 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 prfixe, infixe et postfixe 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 figure lors de la suppression dun noeud 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 configurations pathologiques pour linsertion dans un arbre roug e et noir. . . . . . . 68 9.10 Deuxime srie de configurations pathologiques pour linsertion dans un arbre rou ge 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 Configurations pathologiques pour la suppression dans un arbre rouge et noi r. . . . . . . . . . . . . . 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 ch

emins. . . . . . . . . 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 t ait dans le cours de Programmation Oriente Objet) ; lalgorithmique gomtrique (suppose tre traite dans les cours lis au traitement dim Chapitre 1 Introduction 1.1 Quest-ce que lalgorithmique ? Dfinition 1 (Algorithme). Un algorithme est suite finie doprations lmentaires constit uant un schma de calcul ou de rsolution dun problme. Historique : Le mot algorithme provient de la forme latine (Algorismus) du nom d u mathmaticien arabe ALKHAREZMI ou AL-KHWARIZMI auteur entre autres mais ce n est pas le plus important dun manuel de vulgarisation sur le calcul dcimal positionnel indien (v. 830) expliquant son utilisation et, s urtout, la manipulation des diffrents algorithmes permettant de raliser les oprations arithmtiques classiques (a ddition, soustraction, multiplication, 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 ax2 +bx +c ? (Rsultat bien connu.) Soient cinq nombres rels a, b, c, d et e, quelles sont les solutions de lquation ax 5+bx4+cx3+dx2+ex+ f ? (Pas de mthode gnrale, cf. la thorie de GALOIS.) 2. Trouver une mthode efficace. Savoir rsoudre un problme est une chose, le rsoudre efficacement 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 d onn (sur une architecture donne). Il sagit de la mise en oeuvre 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 xn 1.2.1 Problme Donnes : un entier naturel n et un rel x. On veut calculer xn. Moyens : Nous partons de y1 = x. Nous allons construire une suite de valeurs y1, ..., ym telle que la valeur yk soit obtenue par multiplication de deux puissances de x prcdemment calcules : yk = yu yv, avec 1 u;v < k, k 2 [2;m].

9 10 CHAPITRE 1. INTRODUCTION But : ym = xn. Le cot de lalgorithme sera alors de m1, le nombre de multiplications faites pour obtenir le rsultat recherch. 1.2.2 Algorithme trivial yi = yi1y1; i 2 [2;n]. Rsultat : yn = xn. Cot : m1 = n1 multiplications. Algorithme y[1] = x Pour i 2 n faire y[i] = y[i1] 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 xn o S signifie lever au carr (squaring) ; X signifie 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 : x2, x4, x5, x10, x11, x22, x23. Nous sommes donc capables de calculer x23 en 7 multiplications au lieu de 22 ! Explication de la mthode criture binaire de n : n = i=p i=0 ai2i. Plaons nous au cours du calcul de puissances de x. Soit j le dernier bit de la re prsentation binaire de n qui ait t dcod et soit yj le dernier rsultat obtenu. Initialement, j = p et yp = x = xap . Deux cas sont possibles pour aj1 : 1. aj1 = 1. aj1 est remplac par SX, nous levons y j au carr puis multiplions le rsulta t par x. Le nouveau rsultat est yj1 = y2jx. 2. aj1 =0. aj1 est remplac par S et nous levons simplement yj au carr. Le nouveau rsul tat est y j1 =y2j . Dans tous les cas nous avons : yj1 = y2j (xaj1 ). Do, yp1 = y2 p(xap1 ) = (xap )2(xap1 ) = (x2ap )(xap1 ) = (x2ap+ap1 ). Par rcurrence, nous pouvons montrer que y1 = xi=p i=0 ai2i = xn... 1.2. MOTIVATION : CALCUL DE XN 11 Complexit (cot) Note : les nombres dont la reprsentation binaire a exactement p chiffres forment exactement lintervalle [2p1;2p1]. Nombres de chiffres dans lcriture binaire de n : 1+[log2 n]. Notons n(n) le nombre de 1 dans lcriture binaire de n. Nombre doprations effectues : (1+[log2 n])1 lvations au carr (ne pas oublier ltape 3) ; n(n)1 multiplications par x (ne pas oublier ltape 3). Soit en tout T(n) = [log2 n]+n(n)1 multiplications. Trivialement, 1 n(n) [log2 n]

et [log2 n] T(n) 2[log2 n]. Pour n = 1000, lalgorithme trivial effectue 999 multiplications, et la mthode bina ire moins de 20. Historique Cette mthode a t prsente avant 200 avant J.C. en Inde, mais il semblerait quil ait fa lu 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 : x2, x3, x6, x7, x14, x15. Nous sommes donc capables de calculer x15 en 6 multiplications. Autre schma de calcul : x2, x3, x6, x12, x15 = x12x3. Nous obtenons ainsi x15 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 xn = 8< : x si n = 1; xn1x si n premier; (xp)n0 si n = pn0 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 x15 = (x3) 5. Nous rappliquons lalgorithme pour calculer x3 et y5, o y = x3. 2. Calcul de x3 : (a) 3 est premier. Donc x3 = x2x. Nous rappliquons lalgorithme pour calculer x2. (b) 2 est premier. Donc x2 = xx. (c) Finalement, x3 est calcul comme suit : x3 = xxx, soit en deux multiplications. 3. Calcul de y5 : (a) 5 est premier. Donc y5 = y4y. Nous rappliquons lalgorithme pour calculer y4. (b) 4 = 22, o 2 est le plus petit facteur premier de 4. Donc y4 = (y2)2. (c) Finalement y5 est calcul comme suit : t = yy, u = t t, y5 = uy, soit en 3 multip lications. 4. Finalement, x15 est calcul en 5 multiplications. 12 CHAPITRE 1. INTRODUCTION Peut-on faire mieux ? Oui... 1.2.5 Algorithme de larbre Le k+1e niveau de larbre est dfini comme suit : on suppose que lon a dj les k premiers niveaux ; on construit le k+1e de la gauche vers la droite en ajoutant sous le noeud n les noeuds de valeur n+1, n+a1, ..., n+ak1 o 1, a1, ..., ak1 est le chemin de la racine au noeud n ; on supprime tous les noeuds qui dupliquent une valeur dj obtenue. Cf. la figure 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 figure 1.2 nous pouvons constater que cette mthode permet de calculer x23 en 6 multiplications, au lieu de 7 pour la mthode binaire et celle des facteurs... Cette mthode nest optimale que po ur 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, mai s quil est trs difficile de rsoudre efficacement... Dans ce cours nous verrons des problmes classiques, des mthodes classiques de rsolu tions (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 f ait 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 finirez sans doute par obten ir un rsultat digeste, mais vous accomplirez beaucoup plus defforts que ncessaire, et le rsultat aura peu de chances dtre esthtiqu ment satisfaisant. Chapitre 2 Complexit et optimalit ; premier algorithme de tri 2.1 Dfinition de la complexit 2.1.1 Notations de Landau Quand nous calculerons la complexit dun algorithme, nous ne calculerons gnralement p as sa complexit exacte, mais son ordre de grandeur. Pour ce faire, nous avons besoin de notation s asymptotiques. O : f = O(g) , 9n0;9c 0;8n n0; f (n) cg(n) W : f = W(g) , g = O( f ) o : f = o(g) , 8c 0;9n0;8n n0; f (n) cg(n) Q : f = Q(g) , f = O(g) et g = O( f ) Exemples O : n = O(n), 2n = O(3n), n+2 = O(n) (pour sen convaincre, prendre n0 = 2 et c = 2), p n = O(n), log(n) = O(n), n = O(n2). o : p n = o(n), log(n) = o(n), n = o(n2), log(n) = o( p n). Q : n+log(n) = Q(n+ p n). 2.1.2 Complexit Dfinition 2 (Complexit). La complexit dun algorithme est la mesure du nombre dopratio s fondamentales quil effectue sur un jeu de donnes. La complexit est exprime comme une fonction de la ta ille du jeu de donnes. Nous notons Dn lensemble des donnes de taille n et T(d) le cot de lalgorithme sur la donne d. Complexit au meilleur : Tmin(n) = mind2DnC(d). Cest le plus petit nombre doprations quaura excuter lalgorithme sur un jeu de donnes de taille fixe, ici n. Cest une borne infrieure de la complexit de lalgorithme sur un jeu de donnes de taille n. Complexit au pire : Tmax(n) = maxd2DnC(d). Cest le plus grand nombre doprations quaur a excuter lalgorithme sur un jeu de donnes de taille fixe, ici n.

Avantage : il sagit dun maximum, et lalgorithme finira donc toujours avant davoir ef fectu Tmax(n) oprations. Inconvnient : cette complexit peut ne pas reflter le comportement usuel de lalgorit me, 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 : Tmoy(n) = d2Dn C(d) jDnj . 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 pr obabilit dapparition de chacun des jeux de donnes). Avantage : reflte le comportement gnral de lalgorithme si les cas extrmes sont rar ou si la complexit varie peu en fonction des donnes. Inconvnient : la complexit en pratique sur un jeu de donnes particulier peut tre net tement plus importante que la complexit en moyenne, dans ce cas la complexit en moyenne ne donnera pas un e bonne indication du comportement de lalgorithme. En pratique, nous ne nous intresserons qu la complexit au pire et la complexit en mo enne. Dfinition 3 (Optimalit). Un algorithme est dit optimal si sa complexit est la compl exit 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 modl e de la machine sur laquelle lalgorithme sera implment (sous forme de programme). On prendra comme rfrence un modl de machine accs alatoire (RAM) et processeur unique, o les instructions sont excutes lune apr re, sans oprations simultanes. 2.2 Illustration : cas du tri par insertion 2.2.1 Problmatique du tri Entre : une squence de n nombres, a1, ..., an. Sortie : une permutation, a0 1, ..., a0 n, de la squence dentre, telle que a0 1 a0 2 ::: a0 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 p 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 j1

tant que i > 0 et A[i] > cl faire A[i+1] A[i] i i1 A[i+1] cl On retire un nombre de la squence dentre Les j1 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 figure 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 e t entour par un cercle. 2.2.5 Complexit Nous passons en revue les diffrentes tapes de notre algorithme afin dvaluer son temp s dexcution. Pour ce faire, nous attribuons un cot en temps chaque instruction, et nous comptons le no mbre dexcutions de chacune des instructions. Pour chaque valeur de j 2 [2;n], nous notons t j le nombre dexcution s 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 j1 tant que i > 0 et A[i] > cl faire A[i+1] A[i] i i1 A[i+1] cl Cot c1 c2 c3 c4 c5 c6 c7 Nombre dexcutions n n1 n1 nj =2 t j nj =2(t j 1) nj =2(t j 1) n1 Le temps dexcution total de lalgorithme est alors : T(n) = c1n+c2(n1)+c3(n1)+c4 n j=2 t j +c5 n j=2

(t j 1)+c6 n j=2 (t j 1)+c7(n1) Complexit au meilleur : le cas le plus favorable pour lalgorithme TRI-INSERTION es t quand le tableau est dj tri, comme le montre le cas j = 4 de la figure 2.1. Dans ce cas t j = 1 pour tout j. T(n) = c1n+c2(n1)+c3(n1)+c4(n1)+c7(n1) = (c1+c2+c3+c4+c7)n(c2+c3+c4+c7): T(n) peut ici tre crit sous la forme T(n) = an+b, a et b tant des constantes indpend antes 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 fix pou r une entre donne ; mais il existe des algorithmes alatoires intressants dont le comportement peut var ier mme pour une entre fixe. 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 qu and le tableau est dj tri dans lordre inverse, comme le montre le cas j = 5 de la figure 2.1. Dans ce cas t j = j pour tout j. Rappel : nj =1 j = n(n+1) 2 . Donc nj =2 j = n(n+1) 2 1 et nj =2( j1) = n(n1) 2 . T(n) = c1n+c2(n1)+c3(n1)+c4 n(n+1) 2 1 +c5 n(n1) 2 +c6 n(n1) 2 +c7(n1) = c4 2 + c5 2 + c6 2 n2+

c1+c2+c3+ c4 2 c5 2 c6 2 +c7

n(c2+c3+c4+c7): T(n) peut ici tre crit sous la forme T(n) = an2 +bn+c, a, b et c tant des constante s, 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 hasard. Quelle sera la valeur de t j ? Cest--dire, o devra-t-on insrer A[ j] dans le sous-ta bleau A[1.. j 1] ? En moyenne, pour moiti les lments de A[1.. j 1] sont infrieurs A[ j], et pour moiti prieurs. Donc t j = j=2. Si lon reporte cette valeur dans lquation dfinissant T(n), on obtient, co mme 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 , 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 permutatio ns 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 te rme dominant de la formule exprimant la complexit nous importe, les termes dordres infrieurs ntant pas s ignificatifs quand n devient grand. On ignore galement le coefficient multiplicateur constant du terme dominan t. On crira donc, propos de la complexit du tri par insertion : meilleur cas : Q(n). pire cas : Q(n2). en moyenne : Q(n2). En gnral, on considre quun algorithme est plus efficace quun autre si sa complexit da s 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 co nsidrs comme rapides. Les algorithmes polynomiaux en O(nk) pour k > 3 sont considrs comme lents, sans pa rler des algorithmes exponentiels (dont la complexit est suprieure tout polynme en n) que lon saccorde e 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 -mme ! 3.1.1 Dfinition Dfinition 4 (Dfinition rcursive, algorithme rcursif). Une dfinition rcursive est une inition dans laquelle intervient ce que lon veut dfinir. Un algorithme est dit rcursif lorsquil est dfini e n fonction de lui-mme. Dans le cadre de ce cours, nous ne nous intresserons quaux programmes et algorithm es rcursifs. Mais la notion de dfinition rcursive est beaucoup plus gnrale : en mathmatiques : dfinition de lexponentielle : 8x 2 R; f 0(x) = f (x) et f (0) = 1 . en programmation : dfinition en Ocaml dune liste infinie dont tous les lments valent 1 : let rec z = 1::z ; ; 3.1.2 Rcursivit simple Revenons la fonction puissance x 7! xn. Cette fonction peut tre dfinie rcursivement : xn = 1 si n = 0; xxn1 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 dfinition rcursive peut contenir plus dun appel rcursif. Nous voulons calculer i ci les combinaisons Cp n en se servant de la relation de Pascal : Cp n = 1 si p = 0 ou p = n; Cp n1+Cp1 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 dfinitions sont dites mutuellement rcursives si elles dpendent les unes des aut res. a peut tre le cas pour la dfinition 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 dfinie comme suit : A(m;n) = 8< : 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 mat hmatiques. 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. Difficults : la dfinition 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 d rt ; il nous faut nous assurer que la fonction est compltement dfinie, cest--dire, quelle est dfinie su tout son domaine dapplications. Moyen : existence dun ordre strict tel que la suite des valeurs successives des a rguments invoqus par la dfinition soit strictement monotone et finit toujours par atteindre une valeur pour laquel le la solution est explicitement dfinie. 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 stricte ment positif, et on finit toujours pas aboutir un couple darguments (a;b) tel que ba est ngatif, cas dfini exp licitement. 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 dfini et vaut 1 sur N.

Question : Ny a-t-il vraiment aucun moyen de dterminer automatiquement si un algor ithme rcursif quelconque va terminer ? Rponse la section suivante... 3.1.7 Non dcidabilit de la terminaison Question : peut-on crire un programme qui vrifie automatiquement si un programme d onn 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 vrification de la terminai son. partir de ce programme on conoit le programme Q suivant : programme Q rsultat = termine(Q, /0) tant que rsultat = vrai faire attendre une seconde fin 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 indfiniment et Q ne termine pas. Il y a donc contr adiction et le programme Q ne termine pas. Donc, termine(Q, /0) renvoie faux, la deuxime instruction de Q ne bo ucle pas, et le programme Q termine normalement. Il y a une nouvelle fois contradiction : par consquent, il nexiste pa s de programme tel que termine, cest--dire qui vrifie 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 affiche les entiers par ordre dcroissant, de n jusqu 1 : DCROISSANT(n) Si n = 0 alors ne rien faire sinon afficher n DCROISSANT(n1) Excution pour n = 2 : 20 CHAPITRE 3. LA RCURSIVIT ET LE PARADIGME DIVISER POUR RGNER Appel de DCROISSANT(2) Affichage de 2. Appel de DCROISSANT(1) Affichage de 1. Appel de DCROISSANT(0) Lalgorithme ne fait rien. Rsultat affichage dabord de 2 puis de 1 : laffichage a lieu dans lordre dcroissant. Intervertissons maintenant lordre de laffichage et de lappel rcursif : CROISSANT(n) Si n = 0 alors ne rien faire sinon CROISSANT(n1) afficher n Excution pour n = 2 : Appel de CROISSANT(2) Appel de CROISSANT(1) Appel de CROISSANT(0) Lalgorithme ne fait rien. Affichage de 1. Affichage de 2. Rsultat affichage dabord de 1 puis de 2 : laffichage 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 enfils des disques de

diamtres tous diffrents. Les seules rgles du jeu sont que lon ne peut dplacer quun se l 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 fin sur celle de droit e. Rsolution Voir la figure 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 (n1) 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 su r 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) = 2n1. On a donc ici un algorithme de complexit exponentielle . 3.2 Drcursivation Drcursiver, cest transformer un algorithme rcursif en un algorithme quivalent ne cont enant pas dappels rcursifs. 3.2.1 Rcursivit terminale Dfinition 5 (Rcursivit terminale). Un algorithme est dit rcursif terminal sil ne cont ient aucun traitement aprs un appel rcursif. Exemple : ALGORITHME P(U) si C alors D;P(a(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) ; a(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 a(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 rcursi f, typiquement les paramtres de lappel engendrant lappel rcursif. Originellement, lalgorithme est : ALGORITHME Q(U) si C(U) alors D(U);Q(a(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 fonction s 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(fin, U) empiler(nouvel_appel, a(U)) sinon T(U) si tat = fin alors U V F(U) Illustration de la drcursivation de lalgorithme Q Exemple dexcution de Q : Appel Q(U0) C(U0) vrai D(U0) Appel Q(a(U0)) C(a(U0)) vrai D(a(U0)) Appel Q(a(a(U0))) C(a(a(U0))) faux T(a(a(U0))) F(a(U0)) F(U0) Lexcution correspondante de Q est prsente figure 3.2. Les instructions de gestion de piles y figurent en italic, et les instructions de lalgorithme originel (ce qui nous importe) y figurent en g ras. 3.3. DIVISER POUR RGNER 23 Appel Q(U0) empiler(nouvel_appel, U)) pile = [(nouvel_appel, U0)] dpiler(tat, V)) tat nouvel_appel ; V U0 ; pile = []

U U0 C(U0) vrai D(U0) empiler(fin, U)) pile = [(fin, U0)] empiler(nouvel_appel, a(U))) pile = [(fin, U0) ; (nouvel_appel, a(U0))] dpiler(tat, V)) tat nouvel_appel ; V a(U0) ; pile = [(fin, U0)] U a(U0) C(a(U0)) vrai D(a(U0)) empiler(fin, U)) pile = [(fin, U0) ; (fin, a(U0))] empiler(nouvel_appel, a(U))) pile = [(fin, U0) ; (fin, a(U0)) ; (nouvel_appel, a(a(U0)))] dpiler(tat, V)) tat nouvel_appel ; V a(a(U0)) ; pile = [(fin, U0) ; (fin, a(U0))] U a(a(U0)) C(a(a(U0))) faux T(a(a(U0))) dpiler(tat, V)) tat fin ; V a(U0) ; pile = [(fin, U0)] F(a(U0)) dpiler(tat, V)) tat fin ; V U0 ; pile = [] F(U0) FIG. 3.2 Exemple dexcution de lalgorithme drcursiv. 3.2.3 Remarques Les programmes itratifs sont souvent plus efficaces, 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 s ppellent eux-mmes rcursivement une ou plusieurs fois sur des problmes trs similaires, mais de tailles moindres, rsolvent les sousproblmes 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 rcursivi 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 sousproblme est assez rduite, le rsoudre directement ; Combiner : les solutions des sous-problmes en une solution complte du problme initi al. 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

ci; j 0 Pour k 1 n faire ci; j ci; j +ai;k:bk; j renvoyer C Cet algorithme effectue Q(n3) multiplications et autant dadditions. Algorithme diviser pour rgner naf Dans la suite nous supposerons que n est une puissance exacte de 2. Dcomposons le s 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 div iser pour rgner dont la complexit est donne par la rcurrence : T(n) = 8T(n=2)+Q(n2); laddition des matrices carrs de taille n=2 tant en Q(n2). 3.3.3 Analyse des algorithmes diviser pour rgner Lorsquun algorithme contient un appel rcursif lui-mme, son temps dexcution peut souv nt tre dcrit par une quation de rcurrence qui dcrit le temps dexcution global pour un problme de taill n en fonction du temps dexcution pour des entres de taille moindre. La rcurrence dfinissant le temps dexcution dun algorithme diviser pour rgner se d e suivant les trois tapes du paradigme de base : 1. Si la taille du problme est suffisamment rduite, n c pour une certaine constant e c, la rsolution est directe et consomme un temps constant Q(1). 2. Sinon, on divise le problme en a sous-problmes chacun de taille 1=b de la taill e 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 finale partir des solut ions aux sous-problmes. La relation de rcurrence prend alors la forme : T(n) = Q(1) si n c; aT(n=b)+D(n)+C(n) sinon, o lon interprte n=b soit comme bn=bc, soit comme dn=be. 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 fo

nction dfinie pour les entiers positifs par la rcurrence : T(n) = aT(n=b)+ f (n); o lon interprte n=b soit comme bn=bc, soit comme dn=be. T(n) peut alors tre borne asymptotiquement comme suit : 1. Si f (n) = O(n(logb a)e) pour une certaine constante e > 0, alors T(n) = Q(nlo gb a). 2. Si f (n) = Q(nlogb a), alors T(n) = Q(nlogb a logn). 3. Si f (n) = W(n(logb a)+e) pour une certaine constante e > 0, et si a f (n=b) c f (n) pour une constante c < 1 et n suffisamment grand, alors T(n) = Q( f (n)). Remarques : 1. Le remplacement des termes T(n=b) par T(bn=bc) ou T(dn=be) naffecte pas le com portement 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 nlogb a, mais pas polynomialement. Dans un tel c as, 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 multiplicat ion de matrices diviser pour rgner naf. Ici, a = 8, b = 2 et f (n) = Q(n2). Donc logb a = 3, nous nous tro uvons dans le cas 1 du thorme (avec e = 1), lalgorithme a une complexit en Q(n3) 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 mu ltiplications de matrices, contrairement 8 dans lalgorithme prcdent, mais qui effectue plus dadditions et de so ustractions de matrices, ce qui est sans consquence une addition de matrices tant gratuite par rapport au cot d ne multiplication. Complexit La complexit de lalgorithme de Strassen est donne par la rcurrence : T(n) = 7T(n=2)+Q(n2): En utilisant le thorme 1, nous obtenons comme complexit : T(n) = Q(nlog2 7) = O(n2; 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 Q(n2) additions et soustractions scalaires, calculer 14 matrices ( prciser) A1, ..., A7, B1, ..., B7 carrs de taille n=2. 3. Calculer rcursivement les 7 produits de matrices Pi = AiBi, i 2 [1;7]. 4. Calculer les sous-matrices dsires r, s, t et u en additionnant et/ou soustrayan t les combinaisons idoines des matrices Pi ad-hoc, laide de Q(n2) additions et soustractions scalaires. Produits de sous-matrices Nous supposons que chaque matrice produit Pi peut scrire sous la forme : Pi = AiBi = (ai;1a+ai;2b+ai;3c+ai;4d):(bi;1e+bi;2 f +bi;3g+bi;4h); o les coefficients ai; j et bi; j sont tous pris dans lensemble f1; 0;1g. Nous supp osons donc que chaque produit peut tre obtenu en additionnant et soustrayant certaines des sous-matrices de A, en ad ditionnant et soustrayant certaines des sous-matrices de B, et en multipliant les deux matrices ainsi obtenues. Rcrivons lquation dfinissant r : r = ae+b f = (a b c d) 0

BB@ +1 0 0 0 0 +1 0 0 0 0 0 0 0 0 0 0 1 CCA 0 BB@ e f g h 1 CCA = e f g h a b c d 0 BB@ + : : : : + : : : : : : : : : : 1 CCA o + reprsente +1 , . reprsente 0 et - reprsente -1 . Nous rcrivo dfinissant s, t et u : s = ag+bh = e f g h a b c d 0 BB@ : : + : : : : + : : : : : : : : 1 CCA; t = ce+d f = e f g h a b c d 0 BB@ : : : : : : : : + : : : : + : : 1 CCA ;

u = cg+dh = e f g h a b c d 0 BB@ : : : : : : : : : : + : : : : + 1 CCA : On remarque que lon peut calculer s par s = P1 +P2 o P1 et P2 sont calcules chacune au moyen dune unique multiplication de matrice : P1 = A1B1 = a:(gh) = agah = 0 BB@ : : + : : : : : : : : : : : : 1 CCA ;P2 = A2B2 = (a+b):h = ah+bh = 0 BB@ : : : + : : : + : : : : : : : : 1 CCA : 3.3. DIVISER POUR RGNER 27 De mme la matrice t peut tre calcule par t = P3+P4 avec : P3 = A3B3 = (c+d):e = ce+de = 0 BB@ : : : : : : : : + : : : + : : : 1 CCA ;P4 = A4B4 = d:( f e) = d f de = 0 BB@ : : : : : : : : : : : : + : : 1 CCA : Pour calculer r et u on introduit une matrice P5 dfinie comme suit : P5 = A5B5 = (a+d):(e+h) =

0 BB@ + : : + : : : : : : : : + : : + 1 CCA ; et on cherche obtenir r partir de P5 : r = 0 BB@ + : : : : + : : : : : : : : : : 1 CCA = 0 BB@ + : : + : : : : : : : : + : : + 1 CCA + 0 BB@ : : : : + : : : : : : : : 1 CCA = 0 BB@ + : : + : : : : : : : : + : : + 1 CCA + 0 BB@ : : : : : : : : : : : : + : : 1 CCA + 0 BB@ : : : : + : :

: : : : : : 1 CCA = 0 BB@ + : : + : : : : : : : : + : : + 1 CCA + 0 BB@ : : : : : : : : : : : : + : : 1 CCA+ 0 BB@ : : : : : : : : : : : : : : 1 CCA + 0 BB@ : : : : : + : + : : : : : : 1 CCA : Do, en posant P6 = A6B6 = (bd):( f +h) 0 BB@ : : : : : + : + : : : : : : 1 CCA ; on obtient r = P5+P4P2+P6. 28 CHAPITRE 3. LA RCURSIVIT ET LE PARADIGME DIVISER POUR RGNER De mme, on cherche obtenir u partir de P5 : u = 0 BB@ : : : :

: : : : : : + : : : : + 1 CCA = 0 BB@ + : : + : : : : : : : : + : : + 1 CCA + 0 BB@ : : : : : : : : + : : : : 1 CCA = 0 BB@ + : : + : : : : : : : : + : : + 1 CCA + 0 BB@ : : + : : : : : : : : : : : : 1 CCA + 0 BB@ : : : : : : : : + : : : : 1 CCA = 0 BB@ + : : + : : : : : : : : + : : + 1 CCA +

0 BB@ : : + : : : : : : : : : : : : 1 CCA + 0 BB@ : : : : : : : : : : : : : : 1 CCA + 0 BB@ : : : : : : + : + : : : : : 1 CCA : Do, en posant P7 = A7B7 = (ac):(e+g) = ae+agcecg = 0 BB@ + : + : : : : : : : : : : : 1 CCA ; on obtient u = P5+P1P3P7. Discussion Lalgorithme de Strassen nest intressant en pratique que pour de grandes matrices (n > 45) denses (peu dlments non nuls). La meilleure borne suprieure connue pour la multiplication de matrices carrs de ta ille n est environ en O(n2;376). La meilleure borne infrieure connue est en W(n2) (il faut gnrer n2 valeurs). On ne connat donc toujours pas le niveau de difficult 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 rgne r : 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 minimau x des deux sous-listes tries, le plus petit des deux tant llment minimal de lensemble on le met de ct et o ommence. 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 figure 4.1 . Complexit de la fusion tudions les diffrentes tapes de lalgorithme : les initialisations ont un cot constant Q(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 q p+1 et de rq, ces deux complexits tant en O(r p) ; la recopie finale cote Q(r p+1). Par consquent, lalgorithme de fusion a une complexit en Q(r p). Le tri crire lalgorithme de tri par fusion est maintenant une trivialit (cf. figure 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+k1] 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 b(p+r)=2c

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 complex it est donc en Q(1). Rgner : lalgorithme rsout rcursivement deux sous-problmes de tailles respectives n2 , do une complexit en 2T( n 2 ). Combiner : la complexit de cette tape est celle de lalgorithme de fusion qui est de Q(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) =

Q(1) si n = 1; 2T( n 2 )+Q(n) sinon. Pour dterminer la complexit du tri par fusion, nous utilisons de nouveau le thorme 1 . Ici a = 2 et b = 2, donc logb a = 1 et nous nous trouvons dans le deuxime cas du thorme : f (n) = Q(nlogb a) = Q(n). Par consquent : T(n) = Q(nlogn): Pour des valeurs de n suffisamment grandes, le tri par fusion avec son temps dexcu tion en Q(nlogn) est nettement plus efficace que le tri par insertion dont le temps dexcution est en Q(n2). 4.2. TRI PAR TAS 31 4.2 Tri par tas 4.2.1 Dfinition dun tas Dfinition 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 q ue ses deux fils. Pour un exemple de tas, voir la figure 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 droit Les fonctions daccs aux lments du tableau sont alors : PRE(i) renvoyer bi=2c 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 noeud de larbre est la valeur contenue dans ce noeud ; le nombre au-dessus est lin dice correspondant dans le tableau.

4.2.2 Conservation de la structure de tas Lalgorithme ENTASSER (cf. figure 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 fils (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 figure 4.5. Correction Le rsultat de lalgorithme ENTASSER est bien un tas car : La structure de larbre nest pas modifie. 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 6= i alors changer A[i]$A[max] ENTASSER(A, max) FIG. 4.4 Algorithme ENTASSER FIG. 4.5 Action de ENTASSER(A, 2) : la configuration initiale (figure gauche) vi ole la proprit du tas ; pour i = 2 cette proprit est restaure par interversion de la cl avec celle du fils gauche (figu re de droite) ; le rsultat nest toujours pas un tas, et lappel rcursif ENTASSER(A, 4) intervertit la cl du noeud i = 4 avec celle de son fils droit ; on obtient finalement le tas de la figure 4.3. Un change de valeurs entre un pre et un fils na lieu que si la valeur du fils est s uprieure celle du pre. Or la valeur du pre tait suprieure celles stockes dans ses deux arbres fils excepte la aleur ajoute larbre. La nouvelle cl de la racine est donc bien plus grande que lintgralit de celles stocke s dans larbre dont elle devient la racine. Complexit Le temps dexcution de ENTASSER sur un arbre de taille n est en Q(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 ENT ER est donc dcrit par la rcurrence : T(n) T 2n 3 +Q(1) ce qui, daprs le cas 2 du thorme 1, nous donne : T(n) = Q(logn), car a = 1, b = 32 et logb a = 0. 4.2.3 Construction dun tas La construction se fait simplement par utilisation successive de lalgorithme ENTA SSER, comme le montre lalgorithme la figure 4.6. Complexit Premire borne : chaque appel entasser cote O(log2 n) et il y a O(n) appels de ce t ype. La complexit de CONSTRUIRE-TAS est donc en O(nlog2 n). On peut en fait obtenir une borne plus fi

ne. 4.3. TRI RAPIDE (QUICKSORT) 33 CONSTRUIRE-TAS(A, Valeurs) taille[A] longueur[A] Pour i b longueur(A) 2 c 1 faire ENTASSER(A,i) FIG. 4.6 Algorithme CONSTRUIRE-TAS. En effet, un tas n lments est de hauteur blog2 nc et une hauteur h il contient au maximum d n 2h+1 e noeuds. De plus, lalgorithme ENTASSER requiert un temps dexcution en O(h) quand il est appel su r un tas de hauteur h. Do : T(n) = blog2 nc j=0 l n 2h+1 m O(h) = O n blog2 nc h=0 h 2h ! ; or h=0 h 2h = 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 figure 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 figure 4.8. Complexit La procdure TRIER-TAS prend un temps O(nlog2 n) car lappel CONSTRUIRE-TAS prend un temps O(n) et que chacun des n1 appels ENTASSER prend un temps O(log2 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 fusi on, 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 10 14 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]. Lindic st calcul pendant la procdure de partitionnement. Rgner : Les deux sous-tableaux A[p::q] et A[q+1::r] sont tris par des appels rcursi fs. Combiner : Comme les sous-tableaux sont tris sur place, aucun travail nest ncessair e 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 lalg orithme 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 j1 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 j1 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 j1 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 j1 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 n1 lments et une u n lment, comme nous le montrerons ci-aprs. Comme le partitionnement cote Q(n) et que T(1) = Q(1), la rcurrence pour le temps dexcution est : T(n) = T(n1)+Q(n): Do par sommation : T(n) = n k=1 Q(k) = Q n k=1 k ! = Q

n2 : Pour montrer que cette configuration est bien le pire cas, montrons que dans tou s les cas T(n)=O(n2), cest--dire quil existe une constante c telle que T(n) cn2. Si T(n) est la complexit au pire : T(n) = max 1qn1 (T(q)+T(nq))+Q(n); o le paramtre q est dans lintervalle [1::n1] puisque la procdure PARTITIONNEMENT gnre eux rgions de tailles chacune au moins gale un. Do : T(n) max 1qn1

cq2+c(nq)2 +Q(n): Or lexpression q2 +(nq)2 atteint son maximum lune des extrmits de lintervalle (driv ive puis positive). Do max 1qn1 q2+(nq)2 = 12+(n1)2 = n22(n1): et T(n) cn22c(n1)+Q(n) cn2; puisque lon peut choisir la constante c assez grande pour que le terme 2c(n1) domi ne le terme Q(n). Du coup, le temps dexcution du tri rapide (dans le pire cas) est Q(n2). Meilleur cas On subodore que le meilleur cas apparat quand la procdure de partitionnement produ it deux rgions de taille n 2 . La rcurrence est alors : T(n) = 2T( n

2 )+Q(n); ce qui, daprs le cas 2 du thorme 1 nous donne T(n) = Q(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 co mportement est dtermin non seulement par son entre mais aussi par les valeurs produites par un gnrateur de nom bres alatoires. On modifie 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 linfluence des configurations pathologiques. 38 CHAPITRE 4. ALGORITHMES DE TRI Analyse du partitionnement. La valeur q renvoye par PARTITIONNEMENT ne dpend que d u rang de x = A[p] parmi les lments de A[p::r] (le rang dun nombre dans un ensemble tant le nombre dlme qui lui sont infrieurs ou gaux). Du fait de lencapsulation de PARTITIONNEMENT dans PARTITIONNEMENT-STOCHA STIQUE 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 uprieure. Lorsque PARTITIONNEMENT se termine, chacun des rang(x)1 lments de la rgion infrieure de la rtition est strictement infrieur x. Ainsi pour chaque i = 1, 2, ..., n1, 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)) ! +Q(n):

Comme T(1) = Q(1) et T(n1) = O(n2) (vue ltude du pire cas), on a : 1 n (T(1)+T(n1)) = 1 n Q(1)+O(n2) = O(n); et ce terme peut tre absorb par le terme Q(n) de la formule. Ainsi : T(n) = 1 n n1 q=1 (T(q)+T(nq))+Q(n) = 2 n n1 q=1 T(q)+Q(n): Rsolution de la rcurrence. On suppose par induction quil existe des constantes stri ctement positives a et b telles que T(n) anlogn+b. Si a et b sont tels que lhypothse est vraie pour n = 1 alors, s i lon suppose lhypothse vraie jusquau rang n1, on a : T(n) = 2 n n1 q=1 T(q)+Q(n) 2 n n1 k=1 (ak log k+b)+Q(n) = 2a n n1 k=1 k log k+ 2b n (n1)+Q(n): Si lon sait que (cf. [2, P. 164]) : n1 k=1 k log k 1 2 n2 logn 1

8 n2; on obtient : T(n) 2a n 1 2 n2 logn 1 8 n2 + 2b n (n1)+Q(n) anlogn a 4 n+2b+Q(n) = anlogn+b+ Q(n)+b a 4 n

do T(n) anlogn+b; puisque lon peut choisir a suffisamment grand pour que a 4n domine Q(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 den semble. 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 rarem ent figs. Chaque lment de ces ensembles pourra comporter plusieurs champs qui peuvent tre exa mins ds lors que lon possde un pointeur ou une rfrence si on prfre utiliser une terminologie plus pro de Java que de C sur cet lment. Certains ensembles dynamiques supposent que lun des champs de lobjet contient une cl servant didentifiant. 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 es un pointeur sur un lment de S de cl k, sil en existe un, et la valeur NIL sinon NIL tant un pointeur ou ne 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 s pprimer un lment dont on ne connat que la cl k, il suffit de rcuprer un pointeur sur cet lment via un

ppel RECHERCHE(S, k)). Si lensemble des cls, ou lensemble lui-mme, est totalement ordonn, dautres oprations nt 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 e llment de S point par x, et NIL dans le cas contraire. 5.2 Piles et files 5.2.1 Piles Dfinition 7 (Pile). Une pile est une structure de donnes mettant en oeuvre le prin cipe dernier entr, premier sorti (LIFO : Last-In, First-Out en anglais). Llment t de lensemble par lopration SUPPRESSION est spcifi lavance (et donc ce e 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, DPIL ER. La figure 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 lo ion DPILER, qui a renvoy la valeur 1. Il est facile dimplmenter une pile au moyen dun tableau, comme le montre la figure 5.2. La seule difficult 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 l taille nest pas fixe a priori (comme une liste chane). Les algorithmes ralisant les fonctions EMPILER et DP ILER, ainsi que la ncessaire fonction auxiliaire PILE-VIDE, sont prsents figure 5.3. FIG. 5.2 Implmentation dune pile par un tableau : a) tat initial de la pile ; b) no uvel tat aprs les actions EMPILER( 7) et EMPILER(3) ; c) nouvel tat aprs lopration DPILER qui a renvoy la valeur 3. 5.2.2 Files Dfinition 8 (File). Une file est une structure de donnes mettant en oeuvre le prin cipe premier entr, premier sorti (FIFO : First-In, First-Out en anglais). Llment t de lensemble par lopration SUPPRESSION est spcifi lavance (et donc ce e prend alors que lensemble comme argument) : llment supprim est celui qui est rest le plus l ngtemps dans la file. Une file se comporte exactement comme une file dattente de la vie courante. La figure 5.4 montre les consquences des oprations INSERTION et SUPPRESSION sur une file. On peut implmenter les files au moyen de tableaux. La figure 5.5 illustre limplment ation de files n1 lments au moyen dun tableau n lments et de deux attributs : tte(F) qui indexe (ou pointe) vers la tte de la file ;

queue(F) qui indexe le prochain emplacement o sera insr un lment nouveau. Les lments de la file 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 INSER TION 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 file : a) initialement la file contient les valeurs 7, 4, 8, 9, 6 et 1 (de la plus anciennement la plus rcemment insre) ; b) tat de la file aprs lopration INSERTION(3) ; c) tat de la file aprs lopration SUPPRESSION qui a renvoy la valeur 7. FIG. 5.5 Implmentation dune file par un tableau : a) tat initial de la file ; b) nouvel tat aprs laction INSERTION( 7) ; d) nouvel tat aprs laction INSERTION(5) ; d) nouvel tat aprs lopration SUPPRESSION qui a renvoy la valeur 1. 42 CHAPITRE 5. STRUCTURES DE DONNES LMENTAIRES la ncessaire fonction auxiliaire FILE-VIDE, sont prsents figure 5.6. La seule diffi cult dans cette implmentation est la gestion des dbordements de file qui interviennent quand on tente deffectuer lopration SUPPRESSION sur une pile vide et lopration INSERTION sur un tableau codant la file qui est dj plein. Ce dernier problme napparat pas lorsque lon implmente les files au moyen dune structure de donne dont la taille nest pas fixe 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 files implmentes par des tableaux. 5.3 Listes chanes 5.3.1 Dfinitions Dfinition 9 (Liste chane). Une liste chane est une structure de donnes dans laquelle es 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 p ointeur sur llment suivant dans la liste chane. Si le champ successeur dun lment vaut NIL, cet lment na pas de esseur et est donc le dernier lment ou la queue de la liste. Le premier lment de la liste est appel la t

e de la liste. Une liste L est manipule via un pointeur vers son premier lment, que lon notera TTE(L). Si TTE(L) vau NIL, la liste est vide. La figure 5.7 prsente un exemple de liste chane et montre les consquences des opratio ns INSERTION et SUPPRESSION sur une telle structure de donnes. FIG. 5.7 Exemple de liste chane : a) initialement la liste chane contient les valeur s 9, 6, 4 et 1 ; b) tat de la liste chane aprs lopration INSERTION(5) ; c) tat de la liste chane aprs lopration SUPP 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 l t 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 l qui nest pas doublement chane est dite simplement chane. La figure 5.8 prsente un exemple de liste doublement chane et montre les consquences des oprations INSERTION 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 o on lordre linaire des cls de ces lments. Circulaire : si le champ prccesseur de la tte de la liste pointe sur la queue, et s i 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 pa r 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 6= NIL et cl(x) 6= k faire x successeur(x) renvoyer x Cet algorithme manipule aussi bien des listes simplement que doublement que simp lement 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) 6= NIL alors prdecesseur(TTE(L)) x TTE(L) x prdecesseur(x) NIL Cet algorithme est crit pour les listes doublement chanes. Il suffit dignorer les de ux 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 soin dun pointeur sur llment x supprimer. Si on ne possde que la cl de cet lment, il faut pralablem liser lalgorithme RECHERCHE-LISTE pour obtenir le pointeur ncessaire.

SUPPRESSION-LISTE(L, x) si prdcesseur(x) 6= NIL alors successeur(prdcesseur(x)) successeur(x) sinon TTE(L) successeur(x) si successeur(x) 6= 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 en 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) 6= 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 inconvnien ts. La figure 5.9 prsente un comparatif des listes simplement chanes, doublement chanes et des tableaux, tris o u non, sur des oprations lmentaires. Les complexits indiques sont celles du pire cas. Suivant les oprations qu e 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) Q(n)a Q(n)a Q(n)a Q(n)a Q(1)b Q(1)b Q(n)c Q(n)d INSERTION(L, x) Q(1) Q(n)e Q(1) Q(n)e ou Q(n)c ou erreurf erreurf SUPPRESSION(L, x) Q(n) Q(n) Q(1) Q(1) Q(n)g Q(n)g SUCCESSEUR(L, x) h Q(n)i Q(1) Q(n)i Q(1) Q(n)i Q(1) PRDCESSEUR(L, x) h Q(n)i Q(n)j Q(n)i Q(1) Q(n)i Q(1) MINIMUM(L) Q(n)i Q(1) Q(n)i Q(1) Q(n)i Q(1) MAXIMUM(L) Q(n)i Q(n)k Q(n)i Q(n)k Q(n)i Q(1) aDans le pire cas il faut parcourir tous les lments pour se rendre compte que la c lef ntait pas dans lensemble. bLa cl tant lindice de llment dans le tableau. cDans le pire cas, il faut allouer un nouveau tableau et recopier tous les lments de lancien tableau dans le nouveau. dDans le pire cas, linsertion a lieu dans la premire cas du tableau, et il faut dca ler tous les lments dj prsents. eAu pire, linsertion a lieu en fin de liste. fAu cas o lon veut effectuer une insertion dans un tableau dj plein et quil nest pas ossible deffectuer une allocation dynamique de tableau, comme en FORTRAN 77 ou en PASCAL. gDans le pire cas on supprime le premier lment du tableau et il faut dcaler tous le s autres lments. hAu sens de lordre sur la valeur des cls. iComplexit de la recherche du maximum (ou du minimum) dans un ensemble n lments... jComplexit de la recherche du maximum dans un ensemble n lments... car il faut entr eprendre la recherche du prdcesseur depuis le dbut de la liste. kIl faut parcourir la liste en entier pour trouver son dernier lment. FIG. 5.9 Efficacits 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 al gorithme diviser pour rgner fait plus de travail que ncessaire, en rsolvant plusieurs fois les sous-sous-problm es communs. Un algorithme de programmation dynamique rsout chaque sous-sous-problme une unique fois et mmorise s a 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 pro blmes peuvent admettre plusieurs solutions, parmi lesquelles on veut choisir une solution opti male (maximale ou minimale pour une certaine fonction de cot). Le dveloppement dun algorithme de programmation dynamique peut tre planifi en quatre tapes : 1. Caractriser la structure dune solution optimale. 2. Dfinir 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 souhait e 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, A1, ..., An, et que lon souhaite cal culer le produit : A1A2:::An: On peut valuer cette expression en utilisant comme sous-programme lalgorithme clas sique de multiplications de matrices (cf. section 3.3.2), aprs avoir compltement parenths cette expression afin de lever toute ambigut sur lordre des multiplications de matrices un produit de matrices compltement parenths es t soit une matrice unique soit le produit de deux produits de matrice compltement parenthss). La multiplicati on de matrices tant associative, le rsultat de la multiplication est indpendant du parenthsage. Il y a ainsi cinq ma nires diffrentes de calculer le produit de quatre matrices : A1A2A3A4 = (A1(A2(A3A4))) = (A1((A2A3)A4)) = ((A1A2)(A3A4)) = ((A1(A2A3))A4) = (((A1A2)A3)A4) Le parenthsage du produit peut avoir un impact crucial sur le cot de lvaluation du p roduit. 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 A1, A2 et A3 de dimensions respectives 10100, 1005 et 550. Si on effectue la multiplication de ces trois matrices suivant le parenthsage ((A1A2)A3, on effectue 101005 = 5 000 multiplications dans un premier temps, puis 10550 = 2 500 dans un deuxime temps, soit 7 500 au tota

l. Si, au contraire, on effectue la multiplication suivant le parenthsage (A1(A2A3)) on effectue 100550 = 2 5 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 A1, ..., An de n matrices, o pour i = 1;2; :::;n la matrice Ai est de dimensions pi1 pi, parenthser compltement le produit A1A2:::An de faon minimiser le nombre de multiplications scalaires. Nombre de parenthsages Le passage en revue de tous les parenthsages possibles ne donnera pas un algorith me efficace, 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 c ouper une squence de n matrices entre la ke et la (k+1)e, pour k prenant nimporte quelle valeur dans lint ervalle [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 Cn1 2n2 = W 4n n3=2 : Le nombre de solutions est donc au moins exponentiel en n et la mthode directe co nsistant 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 Ai:: j la matrice rsultant de lvaluation du produit AiAi+1:::Aj1Aj . Un parenthsage optimal de A1A2:::An spare le produit entre Ak et Ak+1 pour une certaine valeur k. Dans notr e solution optimale on commence donc par calculer les matrices A1::k et Ak+1::n puis on les multiplie pour obten ir la matrice A1::n recherche. Le cot du calcul est donc la somme des cots des calculs des matrices A1::k et Ak+1::n et de leur produit. Par consquent le parenthsage de la sous-suite A1:::Ak (et celui de la sous-suite Ak+1::An) doit tre optimal : sinon, on le remplace par un parenthsage plus conomique, et on obtient un parenthsage global plus efficace qu e... 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-struc ture optimale lintrieur dune

solution optimale est lune des garanties de lapplicabilit de la programmation dynam ique. Rsolution rcursive La deuxime tape du paradigme de la programmation dynamique consiste dfinir rcursivem ent 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-p roblmes les problmes consistant dterminer le cot minimum dun parenthsage de AiAi+1:::Aj , pour 1 i < j n Soit m[i; j] le nombre minimum de multiplications scalaires ncessaires au calcul de AiAi+1:::Aj = Ai:: j . Pour tout i, m[i; i] = 0 car Ai::i = Ai et aucune multiplication nest ncessaire. C onsidrons un couple (i; j) avec i < j. Supposons quun parenthsage optimal spare le produit AiAi+1:::Aj entre Ak et Ak+1. Alors, m[i; j], le cot du 6.1. MULTIPLICATION DUNE SUITE DE MATRICES 49 calcul de Ai:: j est gal au cot du calcul de Ai::k, plus celui de Ak+1:: j , plus celui du produit de ces deux matrices. Nous avons donc : m[i; j] = m[i;k]+m[k+1; j]+ pi1 pk pj: Cette quation ncessite la connaissance de la valeur de k, connaissance que nous nav ons pas. Il nous faut donc passer en revue tous les cas possibles et il y en a ji : m[i; j] = 0 si i = j; minik<j m[i;k]+m[k+1; j]+ pi1 pk pj

si i < j: (6.1) m[i; j] nous donne le cot dune solution optimale. Pour pouvoir construire une tell e solution on note s[i; j] une valeur k telle que m[i; j] = m[i;k]+m[k+1; j]+ pi1 pk pj . Algorithme rcursif Une premire solution notre problme pourrait tre lalgorithme CHANEDEMATRICES-RCURSIF -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 j1 faire q CHANEDEMATRICES-RCURSIF(p, i, k) + CHANEDEMATRICES-RCURSIF(p, k+1, j) + pi1 pk pj 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)=W(2n). La quantit totale de travail effectu par lappe l CHANEDEMATRICESRCURSIF( P, 1, n) est donc au moins exponentiel et est donc prohibitif... Heureusement, o n 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 C2 n +n = Q(n2) choix. Lalgorithme rcursif rencontre chaque sous-problme un grand nombre de fois (ici, un nombre exponentiel de fois) dans diffrentes branches de la rbre des appels rcursifs. Cette proprit, dite des sous-problmes superposs (des sous-problmes ont des sous-sous-problm s 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 digme de la programmation dynamique : on calcule le cot optimal en utilisant une approche asc endante. Lentre de lalgorithme ORDONNER-CHANEDEMATRICES ci-dessous est la squence p0; p1; :::; pn des dimensions des matrices. Cet algorithme calcul le cot optimal m[i; j] et enregistre un indice s[i; j] permettant de lobten ir. 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+l1 m[i; j] + pour k 1 j1 faire q m[i;k]+m[k+1; j]+ pi1 pk pj 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 de s 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 figure 6.1 prsente un exemple dexcution de lalgorithme ORDONNER-CHANEDEMATRICES. C omme m[i; j] nest dfini que pour i j, seule la partie du tableau m strictement suprieure la diag onale 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 aille. ORDONNERCHANEDEMATRICES 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 9375 7125 5375 11875 10500 15125

0 0 0 0 0 5 1 2 3 4 5 1 3 3 3 3 3 3 3 3 4 6 5 4 3 2 1 1 3 6 A1 A2 A3 A4 A6 A5 m s 6 5 4 3 2 1 4 5 2 j i 5 6 j 3 i 2 1 FIG. 6.1 Tableaux m et s calculs par ORDONNER-CHANEDEMATRICES pour n = 6 et les di mensions : 30;35;15;5;10;20; 25. Complexit Un simple coup doeil lalgorithme montre que sa complexit est en O(n3). Plus prcismen : T(n) = nl =2nl+1 i=1 i+l2 k=i 1 = nl =2nl+1 i=1 (l1) = nl =2(nl+1)(l1) = nl =2(l2+l(n+2)(n+1)) = n3+5n+12 6 sachant que n i=1 i3 = n(n+1)(2n+1) 6 . La complexit de lalgorithme ORDONNER-CHANEDEMATRICES est donc en Q(n3) ce qui est infiniment meilleur que la solution nave numrant tous les parenthsa ges ou que la solution rcursive, 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 nef ectue pas la multiplication de la suite de matrices. Par contre, linformation ncessaire la ra lisation dun calcul suivant un parenthsage optimal est stocke au fur et mesure dans le tableau s : s[i; j] contie nt une valeur k pour laquelle une sparation du produit AiAi+1:::Aj entre Ak et Ak+1 fourni un parenthsage optima l. Lalgorithme MULTIPLIERCHANEDEMATRICES 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 Ai Dans lexemple de la figure 6.1, MULTIPLIER-CHANEDEMATRICES(A, s, 1, 6) calcule le produit de la suite de matrices en suivant le parenthsage : ((A1(A2A3))((A4A5)A6)); 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 dopt imisation pour que la programmation dynamique soit applicable : une sous-structure optimale et des sous-problmes supe rposs. 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 signifier quune stratgie gloutonn e est applicable, cf. chapitre 7). La sous-structure optimale dun problme suggre souvent une classe de sous-problmes pe rtinents 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 prog rammation dynamique soit applicable est ltroitesse de lespace des sous-problmes, au sens o un algorith 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 al gorithme rcursif repasse sur le mme problme constamment, on dit que le problme doptimisation contient des sous-pr oblmes superposs. A contrario, un problme pour lequel lapproche diviser pour rgner est plus adapte gn plus souvent des problmes nouveaux chaque tape de la rcursivit. Les algorithmes de programmation dyna mique tirent parti de la superposition des sous-problmes en rsolvant chaque sous-problme une unique fois, pu is en conservant la solution dans un tableau o on pourra la retrouver au besoin avec un temps de recherche con stant. 6.2.3 Recensement Il existe une variante de la programmation dynamique qui offre souvent la mme eff icacit que lapproche usuelle, tout en conservant une stratgie descendante. Son principe est de recenser les act

ions naturelles, mais inefficaces, de lalgorithme rcursif. Comme pour la programmation dynamique ordinaire, on conser ve dans un tableau les solutions 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 soluti on de chaque sous-problme. 52 CHAPITRE 6. PROGRAMMATION DYNAMIQUE Chaque lment contient au dpart une valeur spciale pour indiquer quil na pas encore t pli. Lorsque le sousproblme est rencontr pour la premire fois durant lexcution de lalgorithme rcursif, sa solutio est calcule puis stocke dans le tableau. chaque nouvelle confrontation avec ce sous-problme, la val eur 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 j1 faire q RCUPRATION-CHANE(p; i;k)+RCUPRATION-CHANE(p;k+1; j)+ pi1pk pj si q < m[i; j] alors m[i; j] q s[i; j] k Chacun des Q(n2) lments du tableau m est rempli une unique fois par RCUPRATION-CHANE et chacun de ces Q(n2) appels RCUPRATION-CHANE requiert un temps en O(n) en excluant le temps pass culer dautres lments ventuels. La complexit de RCUPRATION-CHANE est donc en O(n3). En pratique, si tous les sous-problmes doivent tre rsolus au moins une fois, un alg orithme ascendant de programmation dynamique bat en gnral un algorithme descendant avec recensement dun facteur consta nt car il limine le temps pris par les appels rcursifs et prend moins de temps pour grer le tableau . En revanche, si certains sousproblmes de lespace des sous-problmes nont pas besoin dtre rsolus du tout, la solution du rece sement 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 pes, au cours desquelles ils sont confronts un ensemble doptions. Pour de nombreux problmes doptim isation la programmation dynamique est une approche trop lourde pour dterminer les meilleures solutions ; dautres algorithmes plus simples et efficaces 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 solut ion 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 no n 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 fin de cette location. Nous voulons obtenir un ensemble F maximal de demandes satisfaites. Cet ensemble F doit vrifier une unique contrainte : deux de mandes 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 : 8e1 2 F;8e2 2 F; d(e1) d(e2)) f (e1) d(e2): Algorithme LOCATIONDUNEVOITURE(E) Tri des lments de E par date de fin croissante. On obtient donc une suite e1;e2; :::;en telle que f (e1) f (e2) ::: f (en). F[1] e1 j 1 pour i 1 n faire si d(ei) 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 finit le plus tt parmi celles qui sont satisfiables. 53 54 CHAPITRE 7. ALGORITHMES GLOUTONS Preuve de loptimalit de lalgorithme Soit F =fx1;x2; :::;xpg la solution obtenue par lalgorithme glouton, et soit G=fy 1;y2; :::;yqg, 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 fins de location croissantes. Si G ne contient pas F, il existe un entier k tel que : 8i < k;xi = yi et xk 6= yk. Par construct ion de F, xk est une demande de location qui la date de fin minimale et dont la date de dbut soit postrieure la date de fin de xk1 = yk1. Par consquent, f (yk) f (xk). On peut alors remplacer G par G0 = fy1;y2; :::;yk1;xk;yk+1; :::;yq g tout en satisfaisant la contrainte de non chevauchement des demandes. G0 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 ense mble 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 fin de xp, 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 fin croissante s. Le tableau 7.1 prsente trois demandes de location classes par dates de dbut croissantes pour lesquelles lalgorit hme 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. e1 e2 e3

d 2 3 5 F 8 4 8 TAB. 7.1 Demandes classes par dates de dbut croissantes. e1 e2 e3 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 tot ale de location du vhicule. Mme si on classe les demandes de location par dures dcroissantes, un algorithme glo uton 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 complex it polynomiale pour le rsoudre. Si nous disposons de deux voitures et non plus dune seule, lalgorithme prcdent ne do nne plus loptimum. 7.2 lments de la stratgie gloutonne Un algorithme glouton dtermine une solution aprs avoir effectu une srie de choix. Po ur chaque point de dcision, 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 prt e 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 ef fectuant un choix localement optimal (ou choix glouton). En programmation dynamique on fait un choix chaque ta pe, mais ce choix dpend de la solution de sous-problmes, au contraire, dans un algorithme glouton, on fai t 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 itr ativement 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 d nstration de loptimalit prouver quune solution optimale doit faire apparatre une sous-structure o ptimale. 7.3. FONDEMENTS THORIQUES DES MTHODES GLOUTONNES 55 Un problme fait apparatre une sous-structure optimale si une solution optimale con tient la solution optimale de sous-problmes. Cette proprit est un indice important de lapplicabilit de la progra mmation dynamique comme des algorithmes gloutons. Le sujet du TD 6 montre un exemple de problme qui peut t re 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 glouton ne, mais elle couvre de nombreux cas intressants en pratique. 7.3.1 Matrodes Dfinition 10 (Matrode). Un matrode est un couple M = (E; I) vrifiant les conditions suivantes : 1. E est un ensemble fini non vide. 2. I est une famille non vide de sous-ensembles de E, appels sous-ensembles indpen dants de E, telle que si H 2 I

et si F H alors F 2 I (on dit que I est hrditaire). Autrement dit, si I contient u n sous-ensemble H de E, I contient tous les sous-ensembles de H. On remarque que lensemble vide est obligat oirement membre de I. 3. Si F et H sont deux lments de I, avec jFj < jHj, alors il existe (au moins) un lm ent x 2 H n F tel que F [fxg 2 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-ensembl e strict H0 de H, ce qui contredit la maximalit de H. Dfinition 11 (Matrode pondr). Un matrode M = (E; I) est dit pondr si lon dispose d ction de pondration w qui affecte un poids strictement positif w(x) chaque lment x de E. La fonction d e pondration w stend aux sous-ensembles de E. Soit F un sous-ensemble quelconque de E : w(F) = x2F w(x): 7.3.2 Algorithmes gloutons sur un matrode pondr De nombreux problmes pour lesquels une approche gloutonne donne les solutions opt imales peuvent tre ramens une recherche dun sous-ensemble indpendant de pondration maximale dans un matrode po ndr. Autrement dit, on dispose dun matrode pondr M = (E; I) et on souhaite trouver un ensemble indpendant F 2 I pour lequel w(F) est maximis. Un tel sous-ensemble indpendant et qui possde la plus grande pondr ation possible est appel sous-ensemble optimal du matrode. Comme la pondration est strictement positive par dfinition, un sous-ensemble optimal est toujours un sous-ensemble indpendant maximal. Lalgorithme ci-dessous prend en entre un matrode pondrM =(E; I) et sa fonction de pon dration w et retourne un sous-ensemble optimal F. GLOUTON(M = (E; I), w) F /0 Trier E par ordre de poids dcroissant pour x 2 E par ordre de poids dcroissant faire si F [fxg 2 I alors F F [fxg renvoyer F 56 CHAPITRE 7. ALGORITHMES GLOUTONS Cet algorithme est glouton parce quil considre les lments de E par ordre de poids dcr oissant et quil ajoute immdiatement un lment x F si F [fxg est indpendant. Si E contient n lments et si la fication de lindpendance de F [fxg prend un temps O( f (n), lalgorithme tout entier sexcute en O(nlogn+n f ( 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 ta blir loptimalit de F. Thorme 3 (Les matrodes satisfont la proprit du choix glouton). Soit M = (E; I) un ma rode pondr de fonction de pondration w. Supposons que E soit tri par ordre de poids dcroissant. S oit x le premier lment de E tel que fxg soit indpendant, sil existe. Si x existe, il existe un sous-ensemble o ptimal F de E contenant x. Si x nexiste pas, le seul lment de I est lensemble vide. Soit H un sous-ensemble opt

imal. On utilise H pour construire, au moyen de la proprit dchange, un ensemble F maximal (de mme cardinalit ue H) et contenant x. Par construction, F et H ne diffrent que dun lment et il existe donc un lment y tel q e : F = (H n fyg)[fxg. 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 fxg n st 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 uti lis : lalgorithme GLOUTON ne fait donc pas derreur en ne considrant pas les lments de E qui ne sont pa s extension de /0. Thorme 5 (Les matrodes satisfont la proprit de sous-structure optimale). Soit x le pr emier lment de E choisi par GLOUTON pour le matrode pondr M = (E; I). Le reste du problme trouver un s ous-ensemble indpendant contenant x et de poids maximal se rduit trouver un sous-ensemble indpendant et de poids maximal du matrode pondr M0 = (E0; I0), o : E0 = fy 2 E : fx;yg 2 Ig; I0 = fH E n fxg : H [fxg 2 Ig; et o la fonction de pondration de M0 est celle de M restreinte E0. Une solution de poids maximum sur M contenant x engendre une solution de poids m aximum sur M0, et vice versa. Thorme 6 (Validit de lalgorithme glouton sur les matrodes). SiM =(E; I) est un matrod pondr de fonction de pondration w, alors lappel GLOUTON(M = (E; I), w) renvoie un sous-ensemble opti mal. Chapitre 8 Graphes et arbres 8.1 Graphes Un graphe orient G est reprsent par un couple (S, A) o S est un ensemble fini et A u ne relation binaire sur S. Lensemble S est lensemble des sommets de G et A est lensemble des arcs de G. La figure 8.1 est une reprsentation graphique du graphe orient G = (S;A) avec lensemble de sommets S = f1 ;2;3;4;5;6g et lensemble darcs A = f(1;2); (2;2); (2;4); (2;5); (4;1); (4;5); (5;4); (6;3)g ; les sommets t ant reprsents par des cercles et les arcs par des flches. On notera que les boucles une boucle tant un arc qui relie un sommet lui-mme sont ici possibles. 4 1 2 3 5 6 FIG. 8.1 Exemple de graphe orient. 4 1 2 3 5 6 FIG. 8.2 Exemple de graphe non orient. Dans un graphe non orient G = (S;A), lensemble des artes A nest pas constitu de coupl es 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 fu;vg mais, indiffremment, par les notatio ns (u;v) ou (v;u). Dans un graphe non orient les boucles sont interdites et chaque arte est donc constitue de deux so mmets distincts. La figure 8.2 est une reprsentation graphique du graphe non orient G = (S;A) avec lensemble de so

mmets S = f1;2;3;4;5;6g et lensemble darcs A = f(1;2); (2;5); (5;1); (6;3)g. 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 incide nte aux sommets u et v. Dans un graphe non orient, le degr dun sommet est le nombre dartes qui lui sont incid entes. Si un sommet est de degr 0, comme le sommet 4 de la figure 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 q ui 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 (u0;u1; :::;uk) de sommets telle que u = u0, v = uk et (ui1;ui) 2 A pour tout i d ans f1; :::;kg. Un chemin est lmentaire si ces sommets sont tous distincts. Dans la figure 8.1, le chemin (1;2;5;4) est lm entaire et de longueur 3, mais le chemin (2;5;4;5) nest pas lmentaire. Un sous-chemin p0 dun chemin p = (u0;u1; ::: ;uk) 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 p0 = ( ui;ui+1; :::;uj). On dfinit dans les graphes non orients la notion correspondante de chane. Dans un graphe orient G=(S;A), un chemin (u0;u1; :::;uk) forme un circuit si u0 = uk et si le chemin contient au moins un arc. Ce circuit est lmentaire si les sommets u1, ..., uk sont distincts. Une boucle est un circuit de longueur 1. Dans un graphe non orient G = (S;A), une chane (u0;u1; :::;uk) forme un cycle s i k 3 et si u0 = uk. Ce cycle est lmentaire si les sommets u1, ..., uk 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 relatio n est accessible partir de . Le graphe de la figure 8.2 contient trois composantes connexes : f1;2;5g, f3;6g et f4g. 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 i nduites par la relation sont accessibles lun partir de lautre . Le graphe de la figure 8.1 contient trois c omposantes connexes : f1;2;4;5g, f3g et f6g. On dit quun graphe G0 = (S0;A0) est un sous-graphe de G = (S;A) si S0 S et si A0 A. 8.2 Arbres Un graphe non orient acyclique est une fort et un graphe non orient connexe acycliq ue est un arbre. La figure 8.3 prsente un graphe qui nest ni un arbre ni une fort car contenant un cycle ; la figure 8.4 prsente un graphe qui est une fort mais pas un arbre, puisque ntant pas connexe ; la figure 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 affirmations

suivantes sont quivalentes. 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 pl us connexe. 4. G est connexe et jAj = jSj1. 5. G est acyclique et jAj = jSj1. 6. G est acyclique, mais si une arte quelconque est ajoute A, le graphe rsultant co ntient 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 la rbre se retrouve orient par lutilisation qui en est faite... Dans la suite de ce cours, et sauf avis contrair e, tous les arbres que nous manipulerons seront des arbres enracins et nous omettrons de le prciser. En outre, on appellera souvent noeuds les sommets des arbres (enracins). La figure 8.6 prsente deux arbres qui ne diffrent que sils sont c onsidrs comme des arbres enracins. Soit x un noeud dun arbre T de racine r. Un noeud 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 fils de y . La racine est le seul noeud qui nait 8.2. ARBRES 59 1 3 7 12 4 12 1 7 3 4 FIG. 8.6 Exemple darbres qui ne diffrent que sils sont enracins. pas de pre. Un noeud sans fils est un noeud externe ou une feuille. Un noeud qui nest pas une feuille est un noeud 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 figure 8.7, le sous-arbre de racine 8 contient les noeuds 8, 6, 5 et 9. 8 3 7 10 4 12 11 2 6 5 9 1 8 6 5 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 fils du noeud x est appel le degr de x. Donc, suivant quun arbre (enra cin) 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 noeud x est la profondeur de x. La plus grande profondeur que puisse avoir un noeud quelconque de larbre T est la hauteur de T. Les deux arbres prsents figure 8.7 sont de hauteur 4. Un arbre ordonn est un arbre enracin dans lequel les fils de chaque noeud sont ord onns entre eux. Les deux arbres de la figure 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 dfinie sur un ensemble fini de noeuds et qui : ne contient aucun noeud, ou est form de trois ensembles disjoints de noeuds : une racine, un arbre binaire ap pel son sous-arbre gauche et un arbre binaire appel son sous-arbre droit. Un arbre binaire est plus quun arbre ordonn dont chaque noeud serait de degr au plu s deux : dans un arbre binaire, si un noeud na quun seul fils, la position de ce filsquil soit fils gauche ou fils droitest importante. La figure 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 noeud est soit une feuille, soit de degr deu xaucun noeud nest donc de degr un. Un arbre k-aire est une gnralisation de la notion darbre binaire o chaque noeud 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 8 2 3 7 FIG. 8.8 Exemple darbres ordonns qui ne diffrent que quand ils sont vus comme des a rbres 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 dan s larbre puis, une fois quune feuille a t atteinte, on remonte pour explorer les autres branches en commenan t par la branche la plus basse parmi celles non encore parcourues ; les fils dun noeud sont bien videmment parcourus suivant lordre sur

larbre. PP(A) si A nest pas rduit une feuille faire pour tous les fils 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 figure 8.10 prsente trois algorithmes qui affichent les valeurs contenues dans les noeuds dun arbre binaire , suivant des parcours en profondeur prfixe, infixe et postfixe, respectivement. PRFIXE(A) si A 6= NIL faire affiche racine(A) PRFIXE(FILS-GAUCHE(A)) PRFIXE(FILS-DROIT(A)) INFIXE(A) si A 6= NIL faire INFIXE(FILS-GAUCHE(A)) affiche racine(A) INFIXE(FILS-DROIT(A)) POSTFIXE(A) si A 6= NIL faire POSTFIXE(FILS-GAUCHE(A)) POSTFIXE(FILS-DROIT(A)) affiche racine(A) FIG. 8.10 Parcours prfixe, infixe et postfixe dun arbre. Parcours en largeur Dans un parcours en largeur dabord, tous les noeuds une profondeur i doivent avoi r t visits avant que le premier noeud 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 file (ici note F). 8.3. PARCOURS 61 PL(A) F fracine(A)g tant que F 6= /0 faire u SUPPRESSION(F) pour tous les fils 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 ef fet, les graphes peuvent contenir des cycles et nous voulons viter de parcourir indfiniment ces cycles ! Po ur viter cet cueil on colorie les sommets des graphes : initialement les sommets sont tous blancs ; lorsquil est re ncontr pour la premire fois un sommet est peint en gris ; lorsque tous ses successeurs dans lordre de parcours o nt 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, cou leur) 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 6= s faire couleur[u] BLANC F fsg tant que F 6= /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 Dfinition Dfinition 12 (Arbre binaire de recherche). Un arbre binaire de recherche est un a rbre binaire vrifiant la proprit suivante : soient x et y deux noeuds de larbre, si y est un noeud du sous-arbre g auche de x, alors clef (y) clef (x), si y est un noeud du sous-arbre droit de x, alors clef (y) clef (x). La figure 9.1 prsente deux exemples darbres binaires de recherche. Bien que diffren ts, 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) 6= NIL faire x gauche(x) renvoyer x ARBRE-MAXIMUM(x) tant que droit(x) 6= 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 noeud x est le noe ud contenant la plus petite cl suprieure x. k A B y x FIG. 9.2 Localisation du successeur. Considrons le fragment darbre prsent figure 9.2. De par la proprit des arbres binaire de recherche : 1. Le sous-arbre A ne contient que des cls infrieures k et ne peut contenir le suc cesseur de k. 2. Le sous-arbre B ne contient que des cls suprieures k et peut contenir le succes seur de k sil nest pas vide. 3. y dsigne le plus proche anctre de k qui soit le fils gauche de son pre (y = k si k est fils gauche de son pre). Tous les anctres de k jusqu y sont infrieurs ou gaux k et leurs sous-arbres gauches e contiennent que des valeurs infrieures k. x est le pre de y. Sa valeur est suprieure toutes celles contenues dans son sous-a rbre 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 successe ur de k est le premier anctre de k dont le fils gauche est aussi anctre de k. ARBRE-SUCCESSEUR(x) si droit(x) 6= NIL alors renvoyer ARBRE-MINIMUM(droit(x)) y pre(x) tant que y 6= 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 ion, prsent figure 9.3, recherche donc llment dans larbre et, quand il aboutit la conclu n que llment nappartient pas larbre (lalgorithme aboutit sur NIL), il insre llment comme fils du dernier noe visit. 9.1.4 Suppression dun lment La figure 9.4 prsente les diffrents cas de figure que doit traiter lalgorithme de s uppression dun lment dans un arbre binaire de recherche. Lalgorithme, prsent figure 9.5, tient en plus compte de s conditions aux limites (changement de racine). 9.1. ARBRES BINAIRES DE RECHERCHE 65 ARBRE-INSERTION(T, z) x racine(T) pre_de_x NIL tant que x 6= 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 3 12 10 13 6 7 18 20 23 16 5 15 3 12 10 6 7 18 20 23 16 (a) 5 15 3 12 10 13 6 7 18 20 23 16 18 20 23 5 15 3 12 10 13 6 7 (b) 12 1 4 10 13 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 figure possibles lors de la suppression dun noeud dun arbre binaire de recherche (les noeuds supprimer sont en gris fonc) : a) le noeud supprimer na pas de fils et on ll mine simplement de larbre ; b) le noeud supprimer a un unique fils, on dtache le noeud et on relie directemen t son pre et son fils ; c) le noeud supprimer a deux fils, on le remplace par son successeur (qui, dans ce cas, est toujours le minimum de son fils droit, noeud 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) 6= NIL alors filsde_x gauche(x) sinon filsde_x droit(x) pre(filsde_x) pre(x) si pre(x) = NIL alors racine(T) filsde_x sinon si gauche(pre(x)) = x alors gauche(pre(x)) filsde_x sinon droit(pre(x)) filsde_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 prcd ents ont une complexit en O(h). Malheureusement, un arbre binaire quelconque n noeuds a une hauteur compri se, en ordre de grandeur, entre

log2 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 Dfinition Dfinition 13 (Arbre rouge et noir). Un arbre binaire de recherche est un arbre ro uge et noir sil satisfait les proprits suivantes : 1. Chaque noeud est soit rouge, soit noir. 2. Chaque feuille (NIL) est noire. 3. Si un noeud est rouge, alors ses deux fils sont noirs. 4. Tous les chemins descendants reliant un noeud donn une feuille (du sous-arbre dont il est la racine) contiennent le mme nombre de noeuds noirs. On appelle hauteur noire dun noeud x le nombre de noeuds noirs sur un chemin desc endant de x une feuille. La figure 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 5 8 14 FIG. 9.6 Exemple darbre rouge et noir. Les hauteurs noires sont indiques ct des noe ds. 9.2.2 Rotations La figure 9.7 prsente les transformations darbres binaires appeles rotations pour d dentes raisons. La figure 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 B C 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 nouv eau noeud comme si larbre ntait quun vulgaire arbre de recherche. Pour ce qui est du choix de la couleur du n oeud insr, le noir est a priori proscrire puisquil provoquerait systmatiquement une violation de la proprit 4. On ch oisit donc de colorier le nouveau noeud en rouge ce qui provoquera parfois des violations de la proprit 3 : un pre et un fils tant tous les deux rouges. Nous tudions les diffrents cas de violations. La figure 9.9 prsente un e premire srie de configurations pathologiques qui sont transformes en dautres configurations. La figure 9.10 prsent

e une deuxime srie de configurations pathologiques, ces configurations l pouvant tre rsolues par lapplicat ion dune ou de deux rotations suivant les cas. La figure 9.11 prsente lalgorithme dinsertion dun lment dans un arbr rouge et noir obtenu suite cette tude de cas, et la figure 9.12 prsente de nouveau les diffrents cas pathologi ques sur un exemple. 9.2.4 Suppression Pour supprimer un lment dans un arbre rouge et noir, on commence par appliquer lalg orithme de suppression pour les arbres de recherche. Si llment supprim tait de couleur rouge, aucune des pro prits des arbres rouge et noir nest viole. Par contre, si le noeud supprim tait noir la proprit 4 (tous les che ins descendants dun noeud une feuille contiennent le mme nombre de noeuds noirs) peut tre viole. Il nous faut donc rajouter un noir sur tous les chemins perturbs. Pour ce faire, on rajoute un noir lunique fils du noeud supprim (pour lunicit du fils, voir lalgorithme de suppression figure 9.5). Si ce fils tait rouge, larbre obtenu e st un arbre rouge et noir. Si ce fils tait dj noir, on a deux noirs empils sur un mme noeud et il nous faut les rpartir figure 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) 6= 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 a b B D g d e D d e A b B a g A a b B D g d e D A b B a g x

nouvel x nouvel x x d e C C C C FIG. 9.9 Premire srie de cas pathologiques rencontrs par lalgorithme dinsertion. Les noeuds noirs sont fond noir, et les rouges sont fond blanc. Ici, seule la proprit 3 est viole, x tant le eud source du problme. Par consquent, les sous-arbres a, b, g, d et e 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 revi ent faire remonter le problme dans larbre, seule la proprit 3 pouvant tre viole par cette transformation. Les cas n on traits sont symtriques de ceux prsents. 9.2. ARBRES ROUGE ET NOIR 69 A C a b g d A a b B d g A d B b a g C g d a B b a C B g d b ROTATION-GAUCHE(A) ROTATION-GAUCHE(A) ROTATION-DROITE(C) ROTATION-DROITE(C) arbre valide (b) (c) (a) (d) x x x x C B C A A FIG. 9.10 Deuxime srie de cas pathologiques rencontrs par lalgorithme dinsertion. Le noeuds noirs sont fond noir, et les rouges sont fond blanc. Ici, seule la proprit 3 est viole, x est le noeud source du problme et nous ne sommes pas dans un des cas traits par la figure 9.9. Par consquent, les so us-arbres a, b, g et d sont tous de racine noire et ont tous la mme hauteur noire (et les transformations dun cas lautr e prservent cette proprit). Ici

on conjugue des rotations et des changements de couleur des noeuds. diffrents cas de figure possibles et les mthodes de rsolutions associes. Si le noeud supprim navait pas de fils, on rajoute un noir la feuille NIL correspondante de son pre. Pour pouvoir raliser cet te manipulation, on utilise une sentinelle : un noeud spcial valant NIL et qui permet de ne pas traiter part les feuilles NIL. La figure 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 figure 9.15. 9.2.5 Complexit Thorme 8 (Hauteur des arbres rouge et noir). Un arbre rouge et noir contenant n no euds 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 noeud x quelconque contient au moins 2hn(x) noeuds internes, o hn(x) est la hauteur noire de x. Sach ant que la hauteur est toujours infrieure 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 h auteur 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(log n), ce qui justifie 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 6= 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 B cas de la figure 9.9 couleur(pre(x)) NOIR couleur(y) NOIR couleur(grand-pre(x)) ROUGE x grand-pre(x) sinon B cas de la figure 9.10 si x =droit(pre(x)) alors B cas a) de la figure 9.10 x pre(x) ROTATION-GAUCHE(T, x) B cas b) de la figure 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 1 15 14 11 7 2

4 1 15 8 14 11 5 7 (a) (b) 4 2 15 5 11 14 8 7 1 4 15 2 1 5 8 7 11 14 (c) (d) FIG. 9.12 Exemple dinsertion dans un arbre rouge et noir faisant apparatre les dif frents cas de figure pathologiques pouvant apparatre aprs linsertion. Les noeuds noirs sont fond noir, et les rouge ont fond blanc. chaque fois le noeud 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 figure 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 fils gauche de so n pre, nous nous trouvons donc dans le cas a) de la figure 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 fils droit de son pre et son pre est le fils gauche de son grand-pre, nous nous trouvons donc dans le cas b) de la figure 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 A C a b x c E A D a b e z x w g d c e z d g nouveau w

E A D a b e z x w g d c E A D a b e z x w g d Cas 4 A B E e d z a b g E A D a b e z x w g d Cas 1 A B E e d nouv. z a b g w Cas 2 E A D a b g d e z nouvel x c x B B C E C B C B C D C B C D B C FIG. 9.13 Configurations pathologiques pour la suppression dans un arbre rouge e t noir. Les noeuds fond noir sont des noeuds noirs , ceux fond blanc sont rouges et ceux fond gris sont soit no oit rouges . a, b,

g, d, e et z dsignent des arbres quelconques. Le noeud x comporte un noir supplmen taire. (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 t ant repeint en rouge ; si le pre de x tait rouge larbre est de nouveau valide, sinon on rapplique lalgorithme de cor rection cette fois-ci sur le pre de x. (3) Ce cas est transform en cas 4. (4) Le noir supplmentaire est limin par rot ation 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) 6= NIL(T) alors filsde_x gauche(x) sinon filsde_x droit(x) pre(filsde_x) pre(x) si pre(x) = NIL(T) alors racine(T) filsde_x sinon si gauche(pre(x)) = x alors gauche(pre(x)) filsde_x sinon droit(pre(x)) filsde_x si couleur(x) = NOIR alors RN-CORRECTION(T, filsde_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 6= racine(T) et couleur(x) = NOIR faire si x = gauche(pre(x)) alors w droit(pre(x)) si couleur(w) = ROUGE alors B cas 1 de la figure 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 B cas 2 de la figure 9.13 couleur(w) ROUGE x pre(x) sinon si couleur(droit(w)) = NOIR

alors B cas 3 de la figure 9.13 couleur(gauche(w)) NOIR couleur(w) ROUGE ROTATION-DROITE(T, w) w droit(pre(x)) B cas 4 de la figure 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 = hv0;v1; :::;vki est la somme des po ids de ses arcs : w(p) = k i=1 w(vi1;vi): Le poids d(u;v) dun plus court chemin dun sommet u un sommet v est bien videmment l e minimum des poids des chemins de u v (si celui-ci est dfini, 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 d(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, p[u] dsignera le prdcesseur de u dans lestimation du plus court chemi n 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 origi ne unique pour un graphe orient pondr G = (S;A) dans le cas o tous les arcs ont un poids positif ou nu l : 8(u;v) 2 A;w(u;v) 0. Lalgorithme de Dijkstra maintient jour un ensemble E des sommets de G dont le plu s court chemin partir de lorigine s est connu et calcul. chaque itration, lalgorithme choisit parmi les somme ts de S n E cest--dire parmi les sommets dont le plus court chemin partir de lorigine nest pas connu le s ommet 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 p[u] et de d[u] pour chaq ue sommet u : initialement, il ny a pas de chemin connu de s u (si u 6= s) et u est estim tre une distance infi nie de s. RELCHER(u, v, w) compare le plus court chemin de s v connu avec une nouvelle prop osition (chemin estim de s u puis arc de u v), et met les diffrentes donnes jour si besoin est.

Lalgorithme est prsent figure 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 dis tances estimes sont infinies. Supposons qu un instant donn pour chaque sommet u de E, d[u] est bien la longueur d u plus court chemin de s u. On rajoute alors un sommet v E. d[v] est alors minimale parmi les sommet s de S nE. Montrons que d[v] = d(s;v). 75 76 CHAPITRE 10. PLUS COURTS CHEMINS SOURCE-UNIQUE-INITIALIZATION[G, s] pour chaque sommet v de G faire d[v] + p[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) p[v] u DIJKSTRA(G, w, s) SOURCE-UNIQUE-INITIALIZATION(G, s) E /0 F S tant que F 6= /0 faire u EXTRAIRE-MIN(F) E E [fug 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] = d(s;y) : parce que p contient le plus cour t chemin de s x et donc de s au prdcesseur z de y, parce que d[z] = d(s; z) par hypothse de rcurrence, et finalement parce que z a t relch. Par positivit des poids, d(s;y) d(s;v). Donc d[v] d[y] = d(s;y) d(s;v) et d[v] = d(s;v). La figure 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 as (dfavorable) o on implmente lensemble F au moyen dun simple tableau, la recherche du minimum cote chaque fois Q(jFj)= O(jSj). La boucle tant que sexcutant exactement jSj fois, et chaque arc tant visit ne unique fois, la complexit de lalgorithme est O(jSj2+jAj) = O(jSj2). 10.1.2 Algorithme de Bellman-Ford Lalgorithme de Bellman-Ford rsout le problme des plus courts chemins avec origine u nique dans le cas gnral o le poids des arcs peut tre ngatif. Appel sur un graphe G = (S;A), lalgorithme de Be llman-Ford renvoie un boolen indiquant si le graphe contient ou non un circuit de poids strictement ngat if accessible partir de lorigine. Lalgorithme est prsent figure 10.3. Correction La correction de lalgorithme de Bellman-Ford peut se montrer par rcurrence sur le nombre darcs des plus courts

chemins : la fin de la ie itration de la premire boucle, les plus courts chemins c ontenant au plus i arcs sont connus, la condition que le graphe ne contienne aucun circuit de poids strictement ngatif . jSj1 itrations suffisent car un plus court chemin est lmentaire (sans perte de gnralit) et contient donc au plus jSj1 arcs. Vu ce qui prcde, lalgorithme renvoie VRAI sil ny a pas de circuit de poids strictemen t ngatif. Montrons quil renvoie FAUX sinon. Pour sen convaincre, prenons un circuit c de sommets u0;u 1; :::;up1;upu0. 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 p lus gauche ; dans chaque graphe, les sommets noirs sont lments de E, le sommet gris est celui qui va tre rajo ut 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 jSj1 faire pour chaque arc (u;v) 2 A faire RELCHER(u, v, w) pour chaque arc (u;v) 2 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 2 [1; p], on a d(ui) d(ui1+w(ui1;ui). Par sommatio n on obtient : p i=1 d(ui) p i=1 d(ui1+ p i=1

w(ui1;ui), p i=1 d(ui) p1 i=0 d(ui+w(c),d(up) d(u0)+w(c),0 w(c): Donc, si lalgorithme renvoie VRAI le graphe ne contient pas de circuit de poids s trictement ngatif. Complexit Cet algorithme est en Q(jSj:jAj) car linitialisation et la vrification de la non-e xistence dun circuit de poids strictement ngatif sont en Q(jSj) et Q(jAj) respectivement, et car la boucle pour sexcute exactement (jSj1) fois et que chaque itration visite chaque arc exactement une fois ce qui nous cote Q(jSj:jAj). La figure 10.4 prsente un exemple dexcution de cet algorithme. c) 0 6 5 -2 -3 7 9 2 -4 8 x y u v z 6 4 7 2 7 a) 0 6 5 -2 -3 7 9 2 -4 8 x y u v z d) 0 6 5 -2 -3 7 9 2 -4 8

x y u v z 2 4 7 2 7 7 b) 0 6 5 -2 -3 7 9 2 -4 8 x y u v z 6 7 7 e) 0 6 5 -2 -3 7 9 2 -4 8 x y u v z 2 4 7 -2 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 plu s courts chemins, les longueurs de ces chemins tant indiques dans les sommets. Les arcs sont considrs dans lordre lexico graphique : (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 coup les 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, mai s 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 us-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 s ans 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 g ale d(m1) i; j . Par consquent : d(m) i; j = min d(m1) i; j ; min 1kn n d(m1) i;k +wk; j o = min 1kn n d(m1) i;k +wk; j o ; la formule tant simplifie grce la proprit : wj; j = 0. Calcul ascendant des poids des plus courts chemins On note W = (wi; 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 fa it au moyen de lalgorithme ci-dessous : EXTENSION-PLUS-COURTS-CHEMINS(D,W) n lignes(D) soit D0 = (d0 i; j)1i; jn une matrice carre de taille n pour i 1 n faire pour j 1 n faire d0 i; j + pour k 1 n faire d0 i; j min(d0

i; j;di;k +wk; j) renvoyer D0 Lalgorithme EXTENSION-PLUS-COURTS-CHEMINS sexcute en Q(n3), cause des trois boucles imbriques. partir de cet algorithme, la rsolution du problme est triviale (cf. figure 10.5). Le cot total de rsolution est donc en Q(n4). La figure 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 cour ts chemins. 2 1 3 5 4 3 4 -4 -5 6 8 7 2 1 D(1) = 0 BBBB@ 0 3 8 4 0 1 7 4 0 2 5 0 6 0 1 CCCCA D(2) = 0 BBBB@ 0 3 8 2 4 3 0 4 1 7 4 0 5 11 2 1 5 0 2 8 1 6 0 1 CCCCA D(3) = 0 BBBB@ 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

1 CCCCA D(4) = 0 BBBB@ 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 1 CCCCA FIG. 10.6 Un graphe orient et la squence des matrices calcules par PLUS-COURTS-CHEM INS. 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 chem in. On note f1;2; :::;ng les n sommets de G. Ici, d(k) i; j est la longueur du plus court chemin de i j nutilisant comme sommets intermdi aires que des sommets parmi f1;2; :::;kg. De deux choses lune, un plus court chemin de i j nayant comme sommets intermdiaires que des sommets de f1;2; ::;kg contient ou ne contient pas le somme t k : 1. Si le plus court chemin p de i j et nayant comme sommets intermdiaires que des sommets de f1;2; ::;kg a effectivement comme sommet intermdiaire k, alors p est de la forme i p1 k p2 j o p1 (resp. p2) est un plus court chemin de i k (resp. de k j) nayant comme sommets intermdiaires que des sommets de f1;2; :::;k1g. 2. Si le plus court chemin p de i j et nayant comme sommets intermdiaires que des sommets de f1;2; ::;kg ne contient pas k, alors cest un plus court chemin p de i j et nayant comme sommets i ntermdiaires que des sommets de f1;2; ::;k1g. Rsolution rcursive La structure explicite aux paragraphes prcdent nous donne directement une rcursion df inissant d(k) i; j : d(k) i; j = ( wi; 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 figure 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 dfini rcursivement les longueurs des plus courts chemins, on peut dfinir rcursivement les prdcesseurs dans les plus courts chemins : p(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 f1;2; :::;kg. Pour k = 0, un plus court chemin ne possde aucun sommet intermdiaire, donc : p(0) i; j = NIL si i = j ou wi; j = ; i si i 6= j et wi; 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 somm ets parmi f1;2; :::;k1g. Autrement, on prend le mme prdcesseur de j que celui qui se trouvait sur le plus co urt chemin de i j et nutilisant comme sommets intermdiaires que des sommets parmi f1;2; :::;k1g. Nous avons donc, dans tous les cas : p(k) i; j = 8< : p(k1) i; j si d(k1) i; j d(k1) i;k +d(k1) k; j ; p(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 Q(n3). La figure 10.8 prsente le rsultat de lexcution de lalgorithme de Floyd-Warshall sur l e graphe de la figure 10.6. D(0) = 0 BBBB@ 0 3 8 4 0 1 7 4 0 2 5 0 6 0 1 CCCCA P(0) = 0

BBBB@ 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 1 CCCCA D(1) = 0 BBBB@ 0 3 8 4 0 1 7 4 0 2 5 5 0 2 6 0 1 CCCCA P(1) = 0 BBBB@ 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 1 CCCCA D(2) = 0 BBBB@ 0 3 8 4 4 0 1 7 4 0 5 11 2 5 5 0 2 6 0 1 CCCCA P(2) = 0 BBBB@ 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 1 CCCCA D(3) = 0 BBBB@ 0 3 8 4 4 0 1 7 4 0 5 11 2 1 5 0 2 6 0 1 CCCCA P(3) = 0 BBBB@

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 1 CCCCA D(4) = 0 BBBB@ 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 1 CCCCA P(4) = 0 BBBB@ 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 1 CCCCA D(5) = 0 BBBB@ 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 1 CCCCA P(5) = 0 BBBB@ 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 1 CCCCA FIG. 10.8 Squence des matrice D(k) et P(k) calcules par lalgorithme FLOYD-WARSHALL pour le graphe de la figure 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(nk) pour une cer taine 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 algorith mes de cot exponentiel.

On aimerait donc savoir si un problme peut ou non tre rsolu par un algorithme polyn omial : sil ne peut exister dalgorithme polynomial pour le rsoudre, il vaudra alors sans doute mieux dvelopper un algorith me dapproximation (ou heuristique) polynomial quun algorithme de rsolution exact la complexit super-p olynomiale. La question de lexistence dun algorithme de rsolution de complexit polynomiale nous amne dfinir 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 c lasse appartient un problme. 11.1 La classe P 11.1.1 Problmes abstraits Dfinition On dfinit un problme abstrait Q comme une relation binaire sur un ensemble I dinsta nces 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 vid e, 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, de x 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 problme s doptimisation. Pour leur appliquer la thorie de la NP-compltude, le plus souvent on les reformule ra sous la forme dun problme 83 84 CHAPITRE 11. NP-COMPLTUDE doptimisation en imposant une borne sur la valeur optimiser, comme nous lavons fai t en passant du problme PLUS-COURT-CHEMIN au problme CHEMIN. 11.1.2 Codage Dfinition Pour quun programme informatique puisse rsoudre un problme abstrait, il faut que ce s instances soient reprsentes sous une forme comprhensible par le programme. On appelle codage dun ensemble S dob jets abstraits une application e de S dans lensemble des chanes binaires (ou dans lensemble des chanes dun alphabet fini 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 b inaires 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 = jij, 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 t emps O(nk) pour une certaine constante k. Dfinition 14 (Classe de complexit P). La classe de complexit P est lensemble des pro blmes concrets de dcision qui sont rsolubles en temps polynomial. Limportance des codages Pour quoi sembter avec des codages plutt que de dfinir directement la complexit dun p oblme abstrait ? Parce que la complexit dpend du codage... Pour le voir, considrons un algorithme qu i prend comme unique entre un entier k, et dont le temps dexcution est en Q(k). Si lentier k est fourni en unaire (son codage est alors une chane de k 1), le temp s dexcution de lalgorithme est en O(n) sur des entres de longueur n, et lalgorithme est de complexit polynomia le. Si lentier k est fourni en binaire, la longueur du codage est alors de n = blog2 kc+1, et le temps dexcution de lalgorithme est en Q(k) = Q(2n), et lalgorithme est de complexit superpolynomial e. On ne peut donc pas parler de la complexit de la rsolution dun problme abstrait sans spcifier son codage. Relativiser cette importance Dfinition 15 (Fonction calculable en temps polynomial). Une fonction f : f0;1g ! f 0;1g est calculable en temps polynomial sil existe un algorithme polynomial qui, tant donn une entre x 2 f0 ;1g quelconque, produit le rsultat f (x). Deux codages e1 et e2 dfinis sur un mme ensemble S sont relis polynomialement sil ex iste deux fonctions calculables en temps polynomial, f12 et f21 telles que pour tout s 2 S on a f12( e1(s)) = e2(s) et f21(e2(s)) = e1(s). Autrement dit, un codage peut tre calcul partir de lautre en temps polynomial, et rc iproquement. Thorme 9. Soit Q un problme de dcision abstrait et soient e1 et e2 deux codages (des instances de Q) relis polynomialement. Alors, le problme concret dfini par Q et e1 appartient la classe P si et seulement si il en va de mme du problme concret dfini par Q et e2. 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 no us intresse est donc : existe-t-il dans le graphe G un chemin reliant les sommets u et v dont la longue ur est infrieure ou gale k ? Si lon se donne galement un chemin p de u vers v, on peut facilement vrifier que la longueur de p est au plus gale k et, le cas chant on peut voir p comme un certificat que le problme de dcision CHEMIN renvoi e vrai sur cette instance. 11.3. NP-COMPLTUDE 85 Ici, la validation du fait que le problme concret de dcision CHEMIN renvoie vrai s ur linstance (G;u;v;k), validation effectue partir du certificat p, prend autant de temps que la rsolution du problme partir de rien. Ce nest pas toujours le cas. Exemple : il est trivial de vrifier quun chemin est un cycle hamiltonien (cycle si mple contenant tous les sommets) dun graphe donn alors que lon ne sait rsoudre ce problme quen temps super polynomial.

Dfinition 16 (Algorithme de validation). Soit un problme concret de dcision Q. Un a lgorithme de validation pour Q est un algorithme de dcision A deux arguments, o un argument est une instan ce x du problme, et o lautre argument est un certificat y. Lalgorithme A valide lentre x si et seulement s i il existe un certificat y tel que A(x;y) = vrai. Bien videmment, lalgorithme A ne doit valider que les instances x d e Q pour lesquelles Q(x) est vrai. Si Q(x) = faux, il ne doit pas y avoir de certificat validant x. Exemple : dans le problme du cycle hamiltonien, le certificat est la liste des so mmets 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 c roire 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 certificat sera une solution du problme considr... 11.2.2 La classe de complexit NP Dfinition 17 (Classe de complexit NP). La classe de complexit NP est lensemble des p roblmes concrets de dcision Q pour lesquels il existe un algorithme polynomial de validation A. 9c 0 telle que pour tout x instance de Q : Q(x) = vrai , 9y certificat; jyj = O( jxjc);A(x;y) = vrai Remarques Daprs cette dfinition 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 q ui rsout Q, on le convertit facilement en algorithme de validation qui ignore le certificat). P = NP ? On nen sait rien. La majorit des chercheurs pense que P 6= NP, et donc qu e P ( NP. La classe de complexit P est la classe des problmes qui peuvent tre rsolus rapidemen t. La classe de complexit NP est celle des problmes pour lesquels une solution peut tre rapidement valide (vri fie). Intuitivement, P ( NP signifierait quil existe des algorithmes difficiles rsoudre mais dont une s olution peut tre facilement vrifie... 11.3 NP-compltude Une des raisons qui laissent penser que P 6= NP est lexistence de la classe des p roblmes 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 difficiles de NP. 11.3.1 Rductibilit Nous avons besoin de pouvoir comparer la difficult de problmes. Intuitivement, un problme Q1 peut tre ramen un problme Q2 si une instance quelconque x de Q1 peut tre facilement reformule com e une certaine instance y de Q2. Dans ce cas, la rsolution du problme Q2(y) nous fournira la solution du p roblme Q1(x) et le problme Q1 nest, dans un certain sens, pas plus difficile rsoudre que le problme Q2. 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 (ax2+bx+c = 0). Dfinition 18 (Problme rductible un autre en temps polynomial). Soient Q1 et Q2 deux problmes concrets. Q1 est rductible en temps polynomial Q2 (ce que lon note Q1 P Q2) sil existe une fon ction calculable en temps polynomial f : f0;1g !f0;1g telle que pour tout x 2 f0;1g : Q1(x) = vrai si et seulement si Q2( f (x)) = vrai: Exemple non trivial : 1. Problme Q1 : problme de lexistence dun cycle Hamiltonien (cycle simple qui compre nd tous les sommets) dans un graphe donn G1. 2. Problme Q2 : tant donn un graphe G2 de villes valu des distances inter-villes, ex iste-t-il un cycle (pas forcment simple) passant par toutes les villes, et de longueur infrieure une valeu r fixe M? 3. Rduction de Q1 Q2 : On cre un graphe G2 de villes contenant autant de villes que G1 de sommets. On as socie chaque sommet de G1 une ville de G2. Si deux sommets de G1 sont relis par une arte, on relie les deux villes correspond antes de G2 par une arte value de la distance interville 1 , et sinon value par la distance interville 2 . 4. On excute lalgorithme rsolvant Q2 sur G2 avec M = n, le nombre de sommets de G1. Sil existe un tel cycle... il est hamiltonien ! Et si G1 admet un cycle hamiltonien, G2 admet un cycle tel que recherch. 5. G2 contient autant de villes que G1 de sommets, et le nombre dartes de G2 est ga l au nombre de paires de sommets de G1 : n(n1) 2 . La rduction est linaire en la taille de G2 et est donc bien polynomiale en la taille de G1. 11.3.2 Dfinition de la NP-compltude Les rductions en temps polynomial fournissent un moyen formel de montrer quun prob lme est au moins aussi difficile quun autre, un facteur polynomial prs : si Q1 P Q2, alors Q1 nest pas plus difficile rsoudre un facteur polynomial prs, que Q2. Les rductions nous permettent de dfinir lensemble des problme s NP-complets, qui sont les problmes les plus difficiles de NP. Dfinition 19 (Problme NP-complet). Un problme Q est NP-complet si 1. Q 2 NP. 2. 8Q0 2 NP; Q0 P Q. On note NPC la classe des problmes NP-complets. Un problme concret qui vrifie la proprit 2 mais pas ncessairement la proprit 1 est d NP-difficile. Thorme 10. Si un problme de NP est rsoluble en temps polynomial, alors P = NP. De fao n 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 x1, ..., xn et de connecteurs (et, ou, non, implication, quivalence) et de parenthses ; existe-t-il une affectation des variables x1, ..., xn 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 l

ittraux, cest--dire de la forme : ETi2I(ti;1 ou ti;2 ou ti;3) avec 8i; j; 9k; ti; j = xk ou ti; j = :xk. 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 d e villes (cycle hamiltonien) la plus courte possible. 3-COLORIAGE DUN GRAPHE : peut-on colorier laide de trois couleurs les sommets dun g raphe 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 Q1 est un problme tel que Q2 P Q1 pour un certain problme Q2 2 NPC, alo rs Q1 est NP-difficile. De plus, si Q1 2 NP, alors Q1 2 NPC. Commentaire : la premire assertion montre que Q1 est polynomialement plus diffici le quun problme polynomialement plus difficile que tous les problmes de NP. Mthode pour montrer la NP-compltude dun problme Q1 1. Prouver que Q1 2 NP. 2. Choisir un problme NP-complet Q2. 3. Dcrire un algorithme polynomial capable de calculer une fonction f faisant cor respondre toute instance de Q2 une instance de Q1. 4. Dmontrer que la fonction f satisfait la proprit : Q2(x) = vrai si et seulement si Q1( 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, CYCLEHAM 2 NP. 2. On a choisi le problme de lexistence dun cycle passant par tous les sommets et d e 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 per-polynomiale, on peut avoir intrt recourir un algorithme dapproximation ou heuristique cest- n algorithme qui ne construira que des solutions presque optimales. On recherchera bien videmm ent des algorithmes dapproximations de complexit polynomiale . Bornes de performances Supposons que lon cherche rsoudre un problme doptimisation dans lequel chaque soluti on potentielle a un cot positif et que lon cherche trouver une solution de cot minimal. Un algorithme da pproximation a une borne r(n) si pour toute entre de taille n, le cot dune solution produite par lalgorithme est au plus r(n) fois le cot C dune solution optimale :

C C r(n); autrement dit, un algorithme dapproximation a une borne r(n) si pour toute entre d e taille n, une solution produite par lalgorithme est au pire r(n) fois plus coteuse quune solution optimale. Un algo rithme dapproximation qui admet une borne est appel heuristique garantie. On peut, de mme dfinir lerreur relative dun algorithme dapproximation par : jCCj C : Un algorithme dapproximation a une borne derreur relative gale e(n) si et seulement si : jCCj C e(n): Un schma dapproximation est un algorithme dapproximation qui prend en entre, en plus dune instance du problme, une valeur e > 0 et qui renvoie une solution approche avec une borne derre ur relative gale e. 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 ensembl e S0 de S (S0 S) tel que si (u;v) est une arte de G, alors soit u 2 S0, soit v 2 S0 (soit u et v appartiennen t tous deux S0). La taille dune couverture est le nombre de sommets quelle contient. Le problme de la couverture de sommet consiste trouver une couverture de sommet d e taille minimale. Ce problme est NP-difficile (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 c oncevoir une heuristique garantie pour le rsoudre : COUVERTURE-SOMMET-APPROCHE(G) C /0 A0 A tant que A0 6= /0 faire soit (u, v) une arte arbitraire de A0 C C[fu;vg supprimer de A0 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 somme ts 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 l es sommets d et g sont rajouts la couverture ; e) la couverture produite contient donc les sommets b, c, d, e, f e t 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 constr ction, deux artes quelconque 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 jCj = 2jEj. Soit C une couverture de sommet de taille m inimale. Comme deux artes de E ne peuvent avoir de sommets en commun, un sommet de C est incident au p lus une arte de E. Par ailleurs, par dfinition dune couverture de sommets, C doit contenir au moins une de s deux extrmits de chacune des artes de E. Donc jEj jCj. Do, jCj 2jCj. 12.2 Le problme du voyageur de commerce Nous considrons ici aussi un graphe non orient G = (S;A). Mais ici le graphe est c omplet : chaque paire de sommets est relie par une arte. On a un poids positif ou nul w(u;v) associ chaque a rte (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 vrifie ling alit 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 prfixe 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 prfixe 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 dfini. Le parcours est prfixe : un noeud est d onc visit avant que ses fils ne le soient. La complexit de cet algorithme est en Q(S2) car le graphe est complet (cest la com plexit de la construction dun arbre couvrant minimal dans ce cas). 12.2.1 Exemple dutilisation Voir la figure 12.2. 12.2.2 Garantie de performances Thorme 13. TOURNE-APPROCHE est un algorithme dapproximation ayant une borne gale de 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 T0. Do w(T0) w(H). Comme T est, par dfinition, un arbre couvrant de poids m inimal, on a w(T) w(T0) 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 parcour s 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) d) e) c) c a d b f g e h c a d b f g e h c a d b f g e h c a d b f g e h c a d b f g e h FIG. 12.2 Exemple dutilisation de lalgorithme TOURNE-APPROCHE : a) lensemble des som ets auxquels on fait correspondre les sommets dune grille, le poids dune arte tant gal la distance e clidienne 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 prfixe visite les sommets dans lordre : a, b, c, h, d, e, f et g ; d) tourne des sommets obtenue par tir du parcours prfixe 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 consq uent : w(W) = 2w(T) 2w(H): W nest pas une tourne, et notre dmonstration nest pas termine ! Grce lingalit tr e, on peut supprimer de W la visite dun sommet quelconque sans augmenter le poids : si un so mmet 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 somme t 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 supp rimant (en utilisant lingalit triangulaire) des sommets du parcours completW. Par consquent : w(H) w(W) et w(H) 2w(H): Bibliographie [1] Robert Cori and Jean-Jacques Lvy. Algorithmes et programmation. http://www.en seignement. polytechnique.fr/profs/informatique/Jean-Jacque%s.Levy/poly/. Cours de lcole Polyt echnique. [2] Thomas Cormen, Charles Leiserson, and Ronald Rivest. Introduction lalgorithmi que. Dunod, 1994. [3] Donald E. Knuth. Seminumerical Algorithms, volume 2 of The Art of Computer P rogramming. Addison Wesley, 1969. [4] Donald E. Knuth. Sorting and searching, volume 3 of The Art of Computer Prog ramming. AddisonWesley, 1973. 93

Anda mungkin juga menyukai