Eléments d'algorithmique


Eléments d'algorithmique

 

´ El´ ements d?algorithmique D. Beauquier, J. Berstel, Ph. Chr´ etienne 6 f´ evrier 2005 2 c D. Beauquier, J. Berstel, Ph. Chr´ etienne, 2003 Premi` ere ´ edition par Masson, 1992. Version 6 f´ evrier 2005 3 à Bruno Sophie Bruno Clara Jérôme Solange Version 6 f´ evrier 2005 4 Version 6 f´ evrier 2005 TABLE DES MATI` ERES I Table des mati` eres Avant-propos XIV 1 Pr´ eliminaires 1 1.1 Les algorithmes et leur co? ut . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.1 Algorithmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.2 Probl` emes intraitables . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1.3 Sur la pr´ esentation d?algorithmes . . . . . . . . . . . . . . . . . . 3 1.2 Mesures du co? ut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.1 Co? ut dans le cas le plus d´ efavorable . . . . . . . . . . . . . . . . 4 1.2.2 Co? ut moyen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.3 Co? ut amorti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.3 Une borne inf´ erieure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2 Evaluations 13 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.1 Notations de Landau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.1.1 Notation O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.1.2 Notations ? et ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.1.3 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.2 R´ ecurrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2.1 R´ ecurrences lin´ eaires ` a coefficients constants . . . . . . . . . . . 20 2.2.2 R´ ecurrences diverses . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.2.3 R´ ecurrences de partitions . . . . . . . . . . . . . . . . . . . . . . 29 2.2.4 R´ ecurrences compl` etes . . . . . . . . . . . . . . . . . . . . . . . . 33 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3 Structures de donn´ ees 37 3.1 Types de donn´ ees et structures de donn´ ees . . . . . . . . . . . . . . . . . 37 3.2 Les structures lin´ eaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.2.1 Piles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.2.2 Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.2.3 Listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.3 Arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.3.1 Arbres binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.3.2 Dictionnaires et arbres binaires de recherche . . . . . . . . . . . . 52 Version 6 f´ evrier 2005 II TABLE DES MATI` ERES 3.3.3 Arborescences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 3.4 Files de priorit´ e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.5 Gestion des partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.5.1 Le probl` eme union-find . . . . . . . . . . . . . . . . . . . . . . 61 3.5.2 Union pond´ er´ ee et compression des chemins . . . . . . . . . . . . 62 3.5.3 Preuve du th´ eor` eme . . . . . . . . . . . . . . . . . . . . . . . . . 65 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4 Graphes 73 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.1 D´ efinitions et propri´ et´ es ´ el´ ementaires . . . . . . . . . . . . . . . . . . . . 74 4.1.1 D´ efinitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 4.1.2 Impl´ ementations d?un graphe . . . . . . . . . . . . . . . . . . . . 75 4.1.3 Chemins, cha? ?nes, circuits, cycles . . . . . . . . . . . . . . . . . . 76 4.1.4 Lemme de K¨ onig . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.1.5 Graphes sans circuit . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.2 Accessibilit´ e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.2.1 Algorithme de Roy-Warshall . . . . . . . . . . . . . . . . . . . . 81 4.2.2 Autres probl` emes d?accessibilit´ e . . . . . . . . . . . . . . . . . . . 82 4.2.3 Semi-anneaux et accessibilit´ e . . . . . . . . . . . . . . . . . . . . 86 4.2.4 Forte connexit´ e . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.3 Arbres et arborescences . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.3.1 Arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.3.2 Arborescences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.3.3 Arborescences ordonn´ ees . . . . . . . . . . . . . . . . . . . . . . . 94 4.3.4 Arbres positionn´ es et arbres binaires . . . . . . . . . . . . . . . . 95 4.3.5 Arbre binaire complet . . . . . . . . . . . . . . . . . . . . . . . . 95 4.4 Parcours d?un graphe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 4.4.1 Parcours d?un graphe non orient´ e . . . . . . . . . . . . . . . . . . 97 4.4.2 Parcours en profondeur . . . . . . . . . . . . . . . . . . . . . . . 102 4.4.3 Parcours en largeur . . . . . . . . . . . . . . . . . . . . . . . . . 104 4.4.4 Parcours d?un graphe orient´ e . . . . . . . . . . . . . . . . . . . . 106 4.4.5 Calcul des composantes fortement connexes . . . . . . . . . . . . 111 4.4.6 Parcours d?une arborescence . . . . . . . . . . . . . . . . . . . . . 115 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 5 Tris 121 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 5.1 Tri interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 5.1.1 Le tri rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 5.1.2 Le tri fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 5.1.3 Le tri par tas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 5.2 Tri externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 5.2.1 Construction des monotonies . . . . . . . . . . . . . . . . . . . . 133 5.2.2 R´ epartition des monotonies . . . . . . . . . . . . . . . . . . . . . 134 Version 6 f´ evrier 2005 TABLE DES MATI` ERES III Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 6 Arbres et ensembles ordonn´ es 145 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 6.1 Arbres de recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 6.1.1 D´ efinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 6.1.2 Rotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 6.2 Arbres AVL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 6.2.1 D´ efinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 6.2.2 Insertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 6.2.3 Suppression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 6.2.4 Arbres balis´ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 6.3 Arbres a?b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 6.3.1 D´ efinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 6.3.2 Recherche d?un ´ el´ ement . . . . . . . . . . . . . . . . . . . . . . . 161 6.3.3 Insertion d?un ´ el´ ement . . . . . . . . . . . . . . . . . . . . . . . . 161 6.3.4 Suppression d?un ´ el´ ement . . . . . . . . . . . . . . . . . . . . . . 163 6.3.5 Concat´ enation et scission . . . . . . . . . . . . . . . . . . . . . . 167 6.3.6 Co? ut amorti des arbres 2?4 . . . . . . . . . . . . . . . . . . . . . 169 6.4 Arbres bicolores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 6.4.1 Pr´ esentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 6.4.2 Hauteur d?un arbre bicolore . . . . . . . . . . . . . . . . . . . . . 175 6.4.3 Insertion dans un arbre bicolore . . . . . . . . . . . . . . . . . . . 177 6.4.4 Suppression d?un ´ el´ ement dans un arbre bicolore . . . . . . . . . 179 6.5 Enrichissement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 6.6 Arbres persistants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 6.6.1 Ensembles ordonn´ es persistants . . . . . . . . . . . . . . . . . . . 186 6.6.2 Duplication de chemins . . . . . . . . . . . . . . . . . . . . . . . 188 6.6.3 M´ ethode de duplication des sommets pleins . . . . . . . . . . . . 195 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 7 Graphes valu´ es 211 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 7.1 Arbre couvrant de co? ut minimum . . . . . . . . . . . . . . . . . . . . . . 212 7.1.1 D´ efinition du probl` eme . . . . . . . . . . . . . . . . . . . . . . . . 212 7.1.2 Propri´ et´ es des arbres optimaux . . . . . . . . . . . . . . . . . . . 212 7.1.3 Algorithme g´ en´ eral . . . . . . . . . . . . . . . . . . . . . . . . . . 214 7.1.4 Algorithmes sp´ ecifiques . . . . . . . . . . . . . . . . . . . . . . . 214 7.2 Chemins de co? ut minimum . . . . . . . . . . . . . . . . . . . . . . . . . 219 7.2.1 D´ efinition du probl` eme . . . . . . . . . . . . . . . . . . . . . . . . 220 7.2.2 Existence d?une solution . . . . . . . . . . . . . . . . . . . . . . . 221 7.2.3 It´ eration fondamentale . . . . . . . . . . . . . . . . . . . . . . . . 223 7.2.4 Algorithme de Ford . . . . . . . . . . . . . . . . . . . . . . . . . 224 7.2.5 Graphe sans circuit . . . . . . . . . . . . . . . . . . . . . . . . . . 226 7.2.6 Algorithme de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . 226 Version 6 f´ evrier 2005 IV TABLE DES MATI` ERES 7.2.7 Algorithme A?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 7.2.8 Algorithme paps . . . . . . . . . . . . . . . . . . . . . . . . . . 232 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 8 Flots 239 8.1 Pr´ eliminaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 8.2 Flots d?un r´ eseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 8.2.1 Existence d?un flot compatible de co? ut minimum . . . . . . . . . 242 8.2.2 Quelques probl` emes particuliers . . . . . . . . . . . . . . . . . . . 244 8.2.3 Trois propri´ et´ es fondamentales . . . . . . . . . . . . . . . . . . . 246 8.3 Probl` eme du flot maximum . . . . . . . . . . . . . . . . . . . . . . . . . 251 8.3.1 L?algorithme g´ en´ erique de Ford et Fulkerson . . . . . . . . . . . . 255 8.3.2 L?algorithme des distances estim´ ees au puits . . . . . . . . . . . . 257 8.3.3 L?algorithme du pr´ eflot . . . . . . . . . . . . . . . . . . . . . . . 263 8.3.4 L?algorithme de Karzanov . . . . . . . . . . . . . . . . . . . . . . 269 8.3.5 L?algorithme des exc` es ´ echelonn´ es . . . . . . . . . . . . . . . . . 270 8.4 Flot de co? ut minimum . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 8.4.1 Graphe d?´ ecart et conditions d?optimalit´ e . . . . . . . . . . . . . 273 8.4.2 Probl` eme dual et conditions d?optimalit´ e . . . . . . . . . . . . . 273 8.4.3 Un algorithme primal . . . . . . . . . . . . . . . . . . . . . . . . 275 8.4.4 Flot maximum de co? ut minimum . . . . . . . . . . . . . . . . . . 280 8.4.5 Plan de transport de co? ut minimum . . . . . . . . . . . . . . . . 285 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 9 Automates 293 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 9.1 Mots et langages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 9.2 Automates finis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 9.2.1 D´ efinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 9.2.2 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 9.2.3 Automates d´ eterministes . . . . . . . . . . . . . . . . . . . . . . . 297 9.3 Op´ erations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 9.3.1 Op´ erations bool´ eennes . . . . . . . . . . . . . . . . . . . . . . . . 301 9.3.2 Automates asynchrones . . . . . . . . . . . . . . . . . . . . . . . 301 9.3.3 Produit et ´ etoile . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 9.4 Langages rationnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 9.4.1 Langages rationnels : d´ efinitions . . . . . . . . . . . . . . . . . . 303 9.4.2 Le th´ eor` eme de Kleene . . . . . . . . . . . . . . . . . . . . . . . . 304 9.4.3 Expressions rationnelles . . . . . . . . . . . . . . . . . . . . . . . 308 9.5 Automate minimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 9.5.1 Quotients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 9.5.2 Equivalence de Nerode . . . . . . . . . . . . . . . . . . . . . . . . 315 9.6 Calcul de l?automate minimal . . . . . . . . . . . . . . . . . . . . . . . . 318 9.6.1 Construction de Moore . . . . . . . . . . . . . . . . . . . . . . . 318 9.6.2 Scinder une partition . . . . . . . . . . . . . . . . . . . . . . . . . 319 Version 6 f´ evrier 2005 TABLE DES MATI` ERES V 9.6.3 Algorithme de Hopcroft . . . . . . . . . . . . . . . . . . . . . . . 321 9.6.4 Complexit´ e de l?algorithme . . . . . . . . . . . . . . . . . . . . . 327 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 10 Motifs 337 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 10.1 Recherche d?un motif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 10.1.1 Un algorithme na¨ ?f . . . . . . . . . . . . . . . . . . . . . . . . . . 339 10.1.2 L?algorithme de Morris et Pratt . . . . . . . . . . . . . . . . . . . 340 10.1.3 Bords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 10.1.4 L?algorithme de Knuth, Morris et Pratt . . . . . . . . . . . . . . 346 10.1.5 L?automate des occurrences . . . . . . . . . . . . . . . . . . . . . 350 10.1.6 L?algorithme de Simon . . . . . . . . . . . . . . . . . . . . . . . . 354 10.2 L?algorithme de Boyer et Moore . . . . . . . . . . . . . . . . . . . . . . . 358 10.2.1 Algorithme de Horspool . . . . . . . . . . . . . . . . . . . . . . . 358 10.2.2 Algorithme de Boyer et Moore . . . . . . . . . . . . . . . . . . . 360 10.2.3 Fonction du bon suffixe . . . . . . . . . . . . . . . . . . . . . . . 364 10.3 L?algorithme de Aho et Corasick . . . . . . . . . . . . . . . . . . . . . . 367 10.4 Recherche d?expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 10.4.1 Calcul efficace d?un automate . . . . . . . . . . . . . . . . . . . . 370 10.4.2 Recherche d?occurrences . . . . . . . . . . . . . . . . . . . . . . . 372 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 11 G´ eom´ etrie algorithmique 379 11.1 Notions pr´ eliminaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 11.1.1 Notations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 11.1.2 Lignes polygonales, polygones . . . . . . . . . . . . . . . . . . . . 381 11.1.3 Ordre polaire, circuit polaire . . . . . . . . . . . . . . . . . . . . 382 11.2 Enveloppe convexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 11.2.1 G´ en´ eralit´ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 11.2.2 Marche de Jarvis . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 11.2.3 Algorithme de Graham . . . . . . . . . . . . . . . . . . . . . . . 390 11.2.4 Algorithme dichotomique . . . . . . . . . . . . . . . . . . . . . . 393 11.2.5 Gestion dynamique d?une enveloppe convexe . . . . . . . . . . . 395 11.3 Localisation de points dans le plan . . . . . . . . . . . . . . . . . . . . . 403 11.3.1 Cas d?un polygone simple . . . . . . . . . . . . . . . . . . . . . . 404 11.3.2 Cas d?un polygone simple convexe . . . . . . . . . . . . . . . . . 405 11.3.3 Cas d?une subdivision planaire g´ en´ eralis´ ee . . . . . . . . . . . . . 406 11.4 Diagrammes de Vorono¨ ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 11.4.1 Diagrammes de Vorono¨ ? de points . . . . . . . . . . . . . . . . . 408 11.4.2 L?algorithme de Fortune . . . . . . . . . . . . . . . . . . . . . . . 411 11.4.3 Diagramme de Vorono¨ ? de segments . . . . . . . . . . . . . . . . 422 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 Version 6 f´ evrier 2005 VI TABLE DES MATI` ERES 12 Planification de trajectoires 431 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 12.1 Translation d?un segment . . . . . . . . . . . . . . . . . . . . . . . . . . 433 12.1.1 Pr´ esentation du probl` eme . . . . . . . . . . . . . . . . . . . . . . 433 12.1.2 Pr´ esentation de l?algorithme . . . . . . . . . . . . . . . . . . . . . 434 12.1.3 Pr´ etraitement des donn´ ees . . . . . . . . . . . . . . . . . . . . . 440 12.1.4 R´ esolution du probl` eme de translation . . . . . . . . . . . . . . . 445 12.2 D´ eplacement d?un disque . . . . . . . . . . . . . . . . . . . . . . . . . . 446 12.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 12.2.2 R´ etraction ? Diagramme de Vorono¨ ? . . . . . . . . . . . . . . . 447 12.2.3 Expos´ e de l?algorithme . . . . . . . . . . . . . . . . . . . . . . . . 450 12.2.4 Remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 Index 457 Notes et Compl´ ements 463 Version 6 f´ evrier 2005 LISTE DES FIGURES VII Liste des figures Pr´ eliminaires 3.1 L?arbre de d´ ecision d?un algorithme de tri. . . . . . . . . . . . . . . 10 Evaluations 2.1 Les arbres binaires de hauteur ?1 ? h ? 2. . . . . . . . . . . . . . . 28 Structures de donn´ ees 2.1 Une liste et une place. . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.2 Un pile repr´ esent´ ee par une liste cha? ?n´ ee. . . . . . . . . . . . . . . . 41 2.3 La file (c, a, b, c, c, a, b, d, a, c, c, d). . . . . . . . . . . . . . . . . . . . 43 2.4 Effet de chainer(p,q). . . . . . . . . . . . . . . . . . . . . . . . . . 48 2.5 Effet de dechainer(q). . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.1 Une arborescence repr´ esent´ ee comme arbre binaire. . . . . . . . . . . 55 4.1 Les arbres parfaits ` a 6, 7, et 8 sommets. . . . . . . . . . . . . . . . . 56 4.2 Un arbre tournoi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.3 Un tas (tournoi parfait). . . . . . . . . . . . . . . . . . . . . . . . . 57 4.4 Mise en place de la cl´ e 7 par comparaison aux fils. . . . . . . . . . . 59 5.1 Partition en trois classes, de noms 1, 3, et 7. . . . . . . . . . . . . . 62 5.2 Compression d?un chemin. . . . . . . . . . . . . . . . . . . . . . . . 64 5.3 Un arbre filet´ e. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.4 Un tournoi et sa pagode. . . . . . . . . . . . . . . . . . . . . . . . . 71 Graphes 1.1 Sous-graphes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 1.2 Impl´ ementations d?un graphe. . . . . . . . . . . . . . . . . . . . . . 75 1.3 Un graphe sans circuit. . . . . . . . . . . . . . . . . . . . . . . . . . 79 1.4 Classement par rang. . . . . . . . . . . . . . . . . . . . . . . . . . . 80 2.1 Un graphe orient´ e et sa matrice d?adjacence. . . . . . . . . . . . . . 82 2.2 Un graphe ´ etiquet´ e. . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 2.3 Un graphe orient´ e et son graphe r´ eduit. . . . . . . . . . . . . . . . . 90 3.1 Un arbre ` a quatorze sommets. . . . . . . . . . . . . . . . . . . . . . 91 3.2 Le graphe Gu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 3.3 Structure r´ ecursive d?une arborescence. . . . . . . . . . . . . . . . . 93 3.4 Une arborescence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 3.5 Arbre binaire et arbre binaire complet. . . . . . . . . . . . . . . . . 96 3.6 Les premiers arbres binaires complets. . . . . . . . . . . . . . . . . . 96 Version 6 f´ evrier 2005 VIII LISTE DES FIGURES 3.7 Effeuillage d?un arbre binaire complet. . . . . . . . . . . . . . . . . . 97 3.8 Compl´ etion d?un arbre binaire. . . . . . . . . . . . . . . . . . . . . . 98 4.1 Bordure d?un sous-ensemble de sommets. . . . . . . . . . . . . . . . 98 4.2 Parcours d?un graphe et arbre couvrant. . . . . . . . . . . . . . . . . 100 4.3 Parcours en profondeur. . . . . . . . . . . . . . . . . . . . . . . . . 103 4.4 Parcours en largeur. . . . . . . . . . . . . . . . . . . . . . . . . . . 105 4.5 Un graphe non orient´ e non connexe. . . . . . . . . . . . . . . . . . . 106 4.6 Bordure pour un graphe orient´ e. . . . . . . . . . . . . . . . . . . . . 106 4.7 Un graphe orient´ e. . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 4.8 Rangs d?attache et points d?attache. . . . . . . . . . . . . . . . . . . 110 4.9 Une ex´ ecution de Desc. . . . . . . . . . . . . . . . . . . . . . . . . 113 4.10 Une arborescence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 4.11 Un arbre binaire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Tris 1.1 Un pivotage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 1.2 Dernier ´ echange d?un couple invers´ e. . . . . . . . . . . . . . . . . . . 125 1.3 Appels r´ ecursifs du tri rapide. . . . . . . . . . . . . . . . . . . . . . 125 1.4 Un peigne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 1.5 Un tri fusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 1.6 Un tri par tas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 2.1 S´ election et remplacement. . . . . . . . . . . . . . . . . . . . . . . . 134 2.2 Le tri ´ equilibr´ e. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 2.3 R´ epartition des monotonies fant? omes. . . . . . . . . . . . . . . . . . 139 Arbres et ensembles ordonn´ es 1.1 Un arbre binaire de recherche. . . . . . . . . . . . . . . . . . . . . . 147 1.2 Un arbre sans balises. . . . . . . . . . . . . . . . . . . . . . . . . . . 148 1.3 L?arbre avec balises. . . . . . . . . . . . . . . . . . . . . . . . . . . 148 1.4 L?arbre apr` es insertion de la derni` ere cl´ e. . . . . . . . . . . . . . . . 149 1.5 Insertion de 6 dans l?arbre balis´ e. . . . . . . . . . . . . . . . . . . . 149 1.6 Suppression de 5 dans l?arbre balis´ e. . . . . . . . . . . . . . . . . . . 150 1.7 L?arbre A = (x, B, C). . . . . . . . . . . . . . . . . . . . . . . . . . 150 1.8 Rotations gauche et droite. . . . . . . . . . . . . . . . . . . . . . . . 151 1.9 Rotation gauche-droite. . . . . . . . . . . . . . . . . . . . . . . . . . 151 1.10 Rotation droite-gauche. . . . . . . . . . . . . . . . . . . . . . . . . . 151 2.1 Un arbre AVL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 2.2 Arbres de Fibonacci ?k pour k = 2, 3, 4, 5. . . . . . . . . . . . . . . . 153 2.3 Le chemin ? de r´ e´ equilibrage. . . . . . . . . . . . . . . . . . . . . . 155 2.4 L?arbre de racine x avant et apr` es insertion. . . . . . . . . . . . . . . 155 2.5 Cas (1) : une rotation simple r´ etablit l?´ equilibre. . . . . . . . . . . . 156 2.6 Cas (2) : une rotation double r´ etablit l?´ equilibre. . . . . . . . . . . . 156 2.7 Le chemin de r´ e´ equilibrage. . . . . . . . . . . . . . . . . . . . . . . 157 2.8 L?arbre de racine x avant et apr` es suppression. . . . . . . . . . . . . 157 2.9 Une rotation simple sur le chemin de r´ e´ equilibrage. . . . . . . . . . . 158 2.10 Une rotation double sur le chemin de r´ e´ equilibrage. . . . . . . . . . . 158 2.11 Arbre de Fibonacci avant la suppression de la cl´ e 12. . . . . . . . . . 159 Version 6 f´ evrier 2005 LISTE DES FIGURES IX 2.12 Apr` es suppression et r´ e´ equilibrage. . . . . . . . . . . . . . . . . . . . 159 3.1 Un arbre 2?4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 3.2 Insertion d?une feuille, cas c < ci. . . . . . . . . . . . . . . . . . . . 162 3.3 Insertion d?une feuille, cas c > ci. . . . . . . . . . . . . . . . . . . . 162 3.4 R` egle d?´ eclatement. . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 3.5 L?arbre apr` es insertion de 15. . . . . . . . . . . . . . . . . . . . . . 163 3.6 R` egle de fusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 3.7 R` egle du partage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 3.8 Un arbre 2?4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 3.9 Apr` es suppression de 12 et avant r´ e´ equilibrage. . . . . . . . . . . . . 166 3.10 Apr` es partage avec le fr` ere droit. . . . . . . . . . . . . . . . . . . . . 166 3.11 Apr` es fusion avec le fr` ere gauche. . . . . . . . . . . . . . . . . . . . 166 3.12 Un arbre 2?4 avant la scission par la cl´ e 36. . . . . . . . . . . . . . . 168 3.13 Les deux for? ets F1 et F2 apr` es la s´ eparation. . . . . . . . . . . . . . 168 3.14 Reconstitution de l?arbre ` a partir de la for? et F1. . . . . . . . . . . . 169 3.15 Eclatement de x. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 3.16 Partage entre les fr` eres s et t. . . . . . . . . . . . . . . . . . . . . . 172 3.17 Fusion des fr` eres s et t. . . . . . . . . . . . . . . . . . . . . . . . . . 172 4.1 Un arbre bicolore : (a) avec ses feuilles, (b) sans feuilles. . . . . . . . 173 4.2 Affectation d?une couleur ` a un n?ud en fonction du rang. . . . . . . 175 4.3 Attribution d?un rang aux sommets de l?arbre de la premi` ere figure. . 175 4.4 Les trois cas possibles. . . . . . . . . . . . . . . . . . . . . . . . . . 176 4.5 Premi` ere phase de l?insertion de A dans A. . . . . . . . . . . . . . . 177 4.6 R´ e´ equilibrage apr` es une insertion : r` egle ?. . . . . . . . . . . . . . . 177 4.7 R´ e´ equilibrage apr` es une insertion : r` egles ?. . . . . . . . . . . . . . . 178 4.8 R´ e´ equilibrage apr` es une insertion : r` egles ?. . . . . . . . . . . . . . . 178 4.9 R´ e´ equilibrage apr` es insertion de A. . . . . . . . . . . . . . . . . . . 179 4.10 Premi` ere phase de suppression d?un ´ el´ ement dans un arbre bicolore . 180 4.11 R´ e´ equilibrage apr` es une suppression : r` egles (a1), (a2), (a3). . . . . . 181 4.12 R´ e´ equilibrage apr` es une suppression : r` egles (b1), (b2), (b3). . . . . . . 182 4.13 Suppression de p. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 5.1 Un arbre 2?3 ` a liaisons par niveau. . . . . . . . . . . . . . . . . . . 184 5.2 Une liste doublement cha? ?n´ ee sur les sommets d?un arbre. . . . . . . 184 5.3 Les num´ eros d?ordre (en blanc) et les tailles (en noir). . . . . . . . . 185 6.1 Persistance par recopie int´ egrale. . . . . . . . . . . . . . . . . . . . . 187 6.2 Duplication de chemin. . . . . . . . . . . . . . . . . . . . . . . . . . 189 6.3 Modifications de pointeurs dans une rotation gauche. . . . . . . . . . 189 6.4 Premi` ere phase de l?insertion. . . . . . . . . . . . . . . . . . . . . . 190 6.5 Insertion d?un nouvel ´ el´ ement ? phase 1. . . . . . . . . . . . . . . . . 191 6.6 R´ e´ equilibrage par rotation gauche lors d?une insertion. . . . . . . . . 191 6.7 Insertion d?un nouvel ´ el´ ement ? phase 2. . . . . . . . . . . . . . . . . 192 6.8 Suppression d?un ´ el´ ement - phase 1. . . . . . . . . . . . . . . . . . . 192 6.9 Suppression de O - phase 1. . . . . . . . . . . . . . . . . . . . . . . . 193 6.10 R´ e´ equilibrage dans une suppression, r` egles (a), (b), (c). . . . . . . . . 194 6.11 R´ e´ equilibrage dans une suppression, r` egles (d), (e). . . . . . . . . . . 194 6.12 Suppression d?un ´ el´ ement-phase 2 (r` egle (d)). . . . . . . . . . . . . . 195 6.13 Recherche de F ` a l?instant 4. . . . . . . . . . . . . . . . . . . . . . . 197 Version 6 f´ evrier 2005 X LISTE DES FIGURES 6.14 Le sommet contenant L a ´ ete dupliqu´ e pour contenir G. . . . . . . . . 197 6.15 Le fils gauche de L est dupliqu´ e ` a l?instant t7. . . . . . . . . . . . . . 198 6.16 Cas o` u z n?est pas plein. . . . . . . . . . . . . . . . . . . . . . . . . 198 6.17 Cas o` u z est plein. . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 6.18 Insertion d?un nouvel ´ el´ ement-phase 1. . . . . . . . . . . . . . . . . . 199 6.19 Insertion d?un nouvel ´ el´ ement-phase 2. . . . . . . . . . . . . . . . . . 200 6.20 Suppression d?un ´ el´ ement-phase 1. . . . . . . . . . . . . . . . . . . . 200 6.21 Comparaison des deux m´ ethodes. . . . . . . . . . . . . . . . . . . . 201 6.22 Transformation d?un arbre 2?4 en arbre bicolore. . . . . . . . . . . . 204 6.23 Les quatre double-rotations. . . . . . . . . . . . . . . . . . . . . . . 205 6.24 Effet de l?op´ eration Evaser(a, A). . . . . . . . . . . . . . . . . . . . 205 6.25 Arbres binomiaux. . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 6.26 Deux files binomiales, . . . . . . . . . . . . . . . . . . . . . . . . . . 208 6.27 . . . et leur union. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Graphes valu´ es 1.1 Un graphe valu´ e. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 1.2 Cycle et cocycle candidats. . . . . . . . . . . . . . . . . . . . . . . . 213 1.3 Arbre couvrant de co? ut minimum. . . . . . . . . . . . . . . . . . . . 216 1.4 Arbre couvrant de co? ut minimum. . . . . . . . . . . . . . . . . . . . 218 2.1 Un graphe valu´ e. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 2.2 Un circuit absorbant. . . . . . . . . . . . . . . . . . . . . . . . . . . 221 2.3 Construction d?une arborescence des chemins minimaux. . . . . . . . 222 2.4 L?it´ eration de Ford. . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 2.5 Le graphe des ´ etats d?un sommet. . . . . . . . . . . . . . . . . . . . 225 2.6 Graphe initial et premi` ere it´ eration. . . . . . . . . . . . . . . . . . . 228 2.7 Les deux it´ erations suivantes. . . . . . . . . . . . . . . . . . . . . . 228 2.8 Un graphe valu´ e et la fonction h. . . . . . . . . . . . . . . . . . . . 230 2.9 Les ´ evaluations de l?algorithme paps. . . . . . . . . . . . . . . . . . 233 2.10 L?algorithme paps avec un circuit absorbant. . . . . . . . . . . . . . 234 Flots 1.1 Cha? ?ne et cycle ´ el´ ementaires. . . . . . . . . . . . . . . . . . . . . . . 241 2.1 Am´ elioration de la compatibilit´ e d?un flot. . . . . . . . . . . . . . . . 243 2.2 Probl` eme de transport et r´ eseau valu´ e ´ equivalent. . . . . . . . . . . . 245 2.3 Un flot entier positif. . . . . . . . . . . . . . . . . . . . . . . . . . . 247 2.4 L?application ?A,B. . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 2.5 Matrice d?incidence d?un arbre orient´ e. . . . . . . . . . . . . . . . . 251 3.1 Un probl` eme de flot maximum et l?un de ses flots. . . . . . . . . . . 253 3.2 Un graphe d?´ ecart. . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 3.3 Une coupe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 3.4 Un probl` eme de flot maximum. . . . . . . . . . . . . . . . . . . . . 257 3.5 Mise ` a jour de la distance estim´ ee . . . . . . . . . . . . . . . . . . . 259 3.6 Initialisation et premi` ere augmentation de distance. . . . . . . . . . . 261 3.7 Seconde augmentation de distance. . . . . . . . . . . . . . . . . . . 262 3.8 Premier graphe d?´ ecart d?un flot maximum. . . . . . . . . . . . . . . 262 3.9 Graphe d?´ ecart du pr´ eflot initial. . . . . . . . . . . . . . . . . . . . . 266 Version 6 f´ evrier 2005 LISTE DES FIGURES XI 3.10 La valeur maximum est atteinte. . . . . . . . . . . . . . . . . . . . . 266 3.11 Le dernier graphe d?´ ecart. . . . . . . . . . . . . . . . . . . . . . . . 267 4.1 Les r´ eseaux R et R . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 4.2 Premi` ere phase. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 4.3 Seconde phase. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 Automates 2.1 Automate reconnaissant le langage abA?. . . . . . . . . . . . . . . . 296 2.2 Automate reconnaissant le langage A?aba. . . . . . . . . . . . . . . . 296 2.3 Automate reconnaissant les mots contenant au moins un b. . . . . . . 296 2.4 Automate reconnaissant les mots contenant un nombre impair de a. . 297 2.5 Tous les mots sont reconnus. . . . . . . . . . . . . . . . . . . . . . . 297 2.6 Automates reconnaissant (i) le mot vide et (ii) tous les mots sauf le mot vide. . . . . . 297 2.7 Un automate reconnaissant le langage A?ab. . . . . . . . . . . . . . . 299 2.8 L?automate d´ eterminis´ e. . . . . . . . . . . . . . . . . . . . . . . . . 299 2.9 L?automate d´ eterministe et ´ emond´ e. . . . . . . . . . . . . . . . . . . 300 2.10 Un automate ` a n + 1 ´ etats. . . . . . . . . . . . . . . . . . . . . . . . 300 3.1 Un automate asynchrone. . . . . . . . . . . . . . . . . . . . . . . . 302 3.2 L?automate pr´ ec´ edent synchronis´ e . . . . . . . . . . . . . . . . . . 302 4.1 Automate reconnaissant exactement le mot w = a1a2 · · · an. . . . . . 305 4.2 Quel est le langage reconnu par cet automate? . . . . . . . . . . . . 306 4.3 L?expression rationnelle a(a + a · b)?b. . . . . . . . . . . . . . . . . . 309 5.1 Un automate reconnaissant X = b?a{a, b}?. . . . . . . . . . . . . . . 313 5.2 Automate minimal pour X = b?a{a, b}? . . . . . . . . . . . . . . . . 314 5.3 Un automate qui n?est pas minimal. . . . . . . . . . . . . . . . . . . 316 5.4 Un automate quotient. . . . . . . . . . . . . . . . . . . . . . . . . . 317 6.1 Un exemple illustrant l?op´ eration ?. . . . . . . . . . . . . . . . . . . 320 6.2 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 6.3 Automate minimal obtenu ` a partir de celui de la figure 6.2. . . . . . 325 6.4 Un exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 6.5 Deux automates non d´ eterministes reconnaissant le m? eme langage. . 334 Motifs 1.1 Le motif glissant sur le texte. . . . . . . . . . . . . . . . . . . . . . 339 1.2 Echec ` a la i-i` eme lettre du motif. . . . . . . . . . . . . . . . . . . . 341 1.3 D´ ecalage d?une position. . . . . . . . . . . . . . . . . . . . . . . . . 342 1.4 D´ ecalages successifs du motif. . . . . . . . . . . . . . . . . . . . . . 344 1.5 Lorsque b = a, le d´ ecalage est inutile si c = a. . . . . . . . . . . . . . 346 1.6 D´ ecalages successifs du motif. . . . . . . . . . . . . . . . . . . . . . 349 1.7 Les graphes des deux fonctions de suppl´ eance. . . . . . . . . . . . . . 350 1.8 Automate reconnaissant le langage A?abcababcac. . . . . . . . . . . . 351 1.9 Automate d´ eterministe A(abcababcac). . . . . . . . . . . . . . . . . 352 1.10 Automate A(abcababcac), sans ses fl` eches passives. . . . . . . . . . . 354 1.11 Impl´ ementation de l?automate A(abcababcac). . . . . . . . . . . . . . 356 2.1 Algorithme de Horspool. . . . . . . . . . . . . . . . . . . . . . . . . 358 2.2 Algorithme de Boyer-Moore simplifi´ e. . . . . . . . . . . . . . . . . . 361 2.3 Co¨ ?ncidence partielle du motif et du texte. . . . . . . . . . . . . . . 362 Version 6 f´ evrier 2005 XII LISTE DES FIGURES 2.4 D´ ecalage : premier cas. . . . . . . . . . . . . . . . . . . . . . . . . . 362 2.5 D´ ecalage : deuxi` eme cas. . . . . . . . . . . . . . . . . . . . . . . . . 362 2.6 Algorithme de Boyer-Moore complet. . . . . . . . . . . . . . . . . . 364 3.1 Automate pour l?ensemble X. . . . . . . . . . . . . . . . . . . . . . 368 4.1 Automates normaliss . . . . . . . . . . . . . . . . . . . . . . . . 371 4.2 Automate pour l?union. . . . . . . . . . . . . . . . . . . . . . . . . . 371 4.3 Automate pour le produit. . . . . . . . . . . . . . . . . . . . . . . . 371 4.4 Automate pour l?´ etoile. . . . . . . . . . . . . . . . . . . . . . . . . . 372 4.5 Un automate pour l?expression (a + b)?b(1 + a)(1 + a)?. . . . . . . . 372 4.6 L?automate de Boyer et Moore pour aba. . . . . . . . . . . . . . . . 377 G´ eom´ etrie algorithmique 1.1 Lignes polygonales. . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 1.2 Le contour positif du polygone est ((A, B, C, D, E)). . . . . . . . . . 381 1.3 Ordre polaire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 1.4 p1 ?O p2, p2 ?O p3, p3 ?O p1 . . . . . . . . . . . . . . . . . . . . . 383 1.5 Un secteur angulaire. . . . . . . . . . . . . . . . . . . . . . . . . . . 384 1.6 Insertion entre p3 et p4 . . . . . . . . . . . . . . . . . . . . . . . . . 386 2.1 C? one enveloppant. . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 2.2 Adjonction d?un point n?appartenant pas ` a l?enveloppe convexe. . . . 388 2.3 Marche de Jarvis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 2.4 Circuit polaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391 2.5 Algorithme de Graham. . . . . . . . . . . . . . . . . . . . . . . . . 392 2.6 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 2.7 Cas o` u p est ext´ erieur ` a P2. . . . . . . . . . . . . . . . . . . . . . . 394 2.8 Si p est supprim´ e, a, b et c apparaissent. . . . . . . . . . . . . . . . . 395 2.9 Enveloppes convexes sup´ erieure et inf´ erieure. . . . . . . . . . . . . . 396 2.10 Calcul de Inf(v) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 2.11 Les fonctions p1, p2 et G. . . . . . . . . . . . . . . . . . . . . . . . . 397 2.12 Les 3 r´ egions I, II, III auxquelles v peut appartenir. . . . . . . . . . . 398 2.13 Les 9 cas du lemme. . . . . . . . . . . . . . . . . . . . . . . . . . . 399 2.14 Insertion d?un nouveau point m. . . . . . . . . . . . . . . . . . . . . 399 2.15 Rotation droite. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 2.16 Structure de l?arbre avant insertion du point p13. . . . . . . . . . . . 402 2.17 Insertion du point p13. . . . . . . . . . . . . . . . . . . . . . . . . . 402 3.1 Principe de l?algorithme. . . . . . . . . . . . . . . . . . . . . . . . . 404 3.2 Le d´ ecompte des intersections. . . . . . . . . . . . . . . . . . . . . . 405 3.3 Cas d?un polygone convexe. . . . . . . . . . . . . . . . . . . . . . . 405 3.4 Une subdivision planaire. . . . . . . . . . . . . . . . . . . . . . . . . 407 3.5 Une subdivision planaire g´ en´ eralis´ ee. . . . . . . . . . . . . . . . . . . 407 4.1 Diagramme de Vorono¨ ? : les sites sont pleins. . . . . . . . . . . . . . 409 4.2 Tout point suffisamment loin sur D est plus proche de b que de a. . . 410 4.3 La partie gris´ ee est dans R(a). . . . . . . . . . . . . . . . . . . . . . 410 4.4 Demi-c? one associ´ e au site a. . . . . . . . . . . . . . . . . . . . . . . 412 4.5 Le plan de balayage. . . . . . . . . . . . . . . . . . . . . . . . . . . 413 4.6 Le front parabolique au temps t. . . . . . . . . . . . . . . . . . . . . 414 4.7 Tout point du diagramme de Vorono¨ ? est point anguleux. . . . . . . . 415 Version 6 f´ evrier 2005 LISTE DES FIGURES XIII 4.8 Apparition d?un nouvel arc ?. . . . . . . . . . . . . . . . . . . . . . 415 4.9 Apparition de l?arc ? : deuxi` eme cas impossible. . . . . . . . . . . . 416 4.10 Un ´ ev´ enement de type site : cas g´ en´ eral . . . . . . . . . . . . . . . 420 4.11 Disparition de ? et cr´ eation du sommet s. . . . . . . . . . . . . . . . 420 4.12 Ev´ enement site avec cr´ eation d?un sommet. . . . . . . . . . . . . . . 421 4.13 Un ensemble de 4 segments ouverts et 6 points. . . . . . . . . . . . . 423 4.14 Diagramme de Vorono¨ ? form´ e de 4 demi-droites et d?un arc de parabole. 424 4.15 Le diagramme d´ efini par deux segments. . . . . . . . . . . . . . . . . 425 4.16 Un diagramme de Vorono¨ ?. . . . . . . . . . . . . . . . . . . . . . . . 426 4.17 Exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 4.18 Principe de l?algorithme. . . . . . . . . . . . . . . . . . . . . . . . . 429 Planification de trajectoires 0.1 La translation t(x, y) . . . . . . . . . . . . . . . . . . . . . . . . . 432 0.2 p1 est libre, p2 et p3 sont semi-libres, p4 et p5 ne le sont pas. . . . . . 433 1.1 P et ? caract´ erisent p. . . . . . . . . . . . . . . . . . . . . . . . . . 434 1.2 Partitionnement de l?espace libre en cellules. . . . . . . . . . . . . . 435 1.3 Le graphe G?/2 associ´ e ` a l?exemple de la figure pr´ ec´ edente. . . . . . . 435 1.4 Emondage des cellules. . . . . . . . . . . . . . . . . . . . . . . . . . 436 1.5 Le graphe G?/2(l) obtenu apr` es ´ emondage. . . . . . . . . . . . . . . 436 1.6 Choix du segment Sup(p) selon la position de p. . . . . . . . . . . . . 437 1.7 Les cellules de L?/2. . . . . . . . . . . . . . . . . . . . . . . . . . . 438 1.8 Une cellule. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 1.9 Ev´ enements (a) simples ou (b) double. . . . . . . . . . . . . . . . . . 440 1.10 D´ ebuts, milieu et fins. . . . . . . . . . . . . . . . . . . . . . . . . . 441 1.11 Segments trait´ es, actifs, non trait´ es. . . . . . . . . . . . . . . . . . . 441 1.12 L?´ ev´ enement en cours est une fin. . . . . . . . . . . . . . . . . . . . 443 1.13 L?´ ev´ enement en cours est un milieu. . . . . . . . . . . . . . . . . . . 443 1.14 L?´ ev´ enement en cours est un d´ ebut. . . . . . . . . . . . . . . . . . . 444 1.15 g+(C) est calcul´ e au cours de l?insertion de s . . . . . . . . . . . . . 446 2.1 Exemple d?obstacles. . . . . . . . . . . . . . . . . . . . . . . . . . . 447 2.2 Une r´ egion R(s), et la r´ egion R (s) associ´ ee (en gras). . . . . . . . . 448 2.3 Scission d?un arc de parabole. . . . . . . . . . . . . . . . . . . . . . 451 2.4 ?(e) lorsque e est un arc de parabole. . . . . . . . . . . . . . . . . . 452 2.5 Un exemple de mouvement utilisant cet algorithme. . . . . . . . . . 454 2.6 Composantes connexes des d´ eplacements libres. . . . . . . . . . . . . 455 2.7 Un mauvais d´ eplacement . . . . . . . . . . . . . . . . . . . . . . . 456 Version 6 f´ evrier 2005 XIV Avant-propos Avant-propos Encore un livre d?algorithmique! Les ouvrages consacr´ es ` a l?algorithmique et aux structures de donn´ ees paraissent, depuis quelque temps, ` a un rythme soutenu et r´ egulier. Aussi devons-nous expliquer pourquoi un livre suppl´ ementaire sur ce sujet nous a paru utile. Le pr´ esent livre se distingue d?autres trait´ es d?algorithmique par deux aspects : d?une part, un accent particulier est mis sur les nouvelles structures d?arbres ap- parues ces derni` eres ann´ ees (arbres bicolores, arbres persistants); d?autre part, nous d´ eveloppons plus en d´ etail trois applications de l?algorithmique : l?optimi- sation combinatoire, la recherche de motifs dans un texte, et la g´ eom´ etrie al- gorithmique. Outre leur int´ er? et propre et leur importance intrins` eque, ces trois applications illustrent de fa¸ con exemplaire l?usage que l?on peut faire de struc- tures de donn´ ees sophistiqu´ ees, et les gains en temps et en place qui r´ esultent de leur emploi judicieux. Pour chacun de ces trois th` emes, nous mettons en place les bases n´ ecessaires, tant algorithmiques que th´ eoriques. Puis, nous pr´ esentons, ` a l?aide de probl` emes ty- piques, un ´ echantillon des algorithmes les plus efficaces, employant des structures de donn´ ees int´ eressantes. Parmi les algorithmes et les structures de donn´ ees qui m´ eritent d?? etre mentionn´ es plus sp´ ecialement, citons : ? le co? ut amorti des op´ erations de r´ e´ equilibrage dans les arbres 2?4 (cha- pitre 6); ? les algorithmes de manipulation des arbres bicolores (ibid.); ? les arbres persistants (ibid.); ? les algorithmes de Goldberg?Tarjan et d?Ahuja?Orlin pour les flots (cha- pitre 8); ? l?algorithme de Hopcroft de minimisation d?un automate fini (chapitre 9); ? les algorithmes de Simon, et de Boyer et Moore pour la recherche de motifs dans un texte (chapitre 10); ? la gestion dynamique de l?enveloppe convexe d?un ensemble fini de points (chapitre 11); ? l?algorithme de balayage de calcul d?une subdivision planaire ` a l?aide d?ar- bres persistants (ibid.); ? l?algorithme de Fortune de calcul du diagramme de Vorono¨ ? (ibid.); ? deux algorithmes de planification de trajectoires (chapitre 12). Version 6 f´ evrier 2005 Avant-propos XV A qui s?adresse ce livre ? Ce livre est issu de cours donn´ es par les auteurs en licence et ma? ?trise d?infor- matique et de math´ ematiques dans les universit´ es Paris VI et Paris VII, en magi- st` ere, et pour partie dans divers DEA et DESS. Dans sa forme pr´ esente, il s?adresse principalement aux ´ etudiants en licence et en ma? ?trise d?informatique et de math´ ematiques, et aux ´ etudiants des ´ ecoles d?ing´ enieurs. Nous ne supposons chez le lecteur qu?une connaissance rudimen- taire de l?informatique. Les premiers chapitres d´ ecrivent les bases algorithmiques sur lesquelles s?appuieront les chapitres suivants. Le niveau d?exposition est, ` a de rares exceptions pr` es, celui des ´ etudiants en licence d?informatique. Organisation du livre Ce livre s?organise en deux parties. La premi` ere partie, constitu´ ee des chapi- tres 1 ` a 5, contient un expos´ e des bases algorithmiques et math´ ematiques, avec notamment un chapitre sur les techniques d?´ evaluation de co? uts d?algorithmes, un bref chapitre sur les structures de donn´ ees usuelles, un chapitre plus long sur la th´ eorie des graphes et un chapitre assez succinct sur les algorithmes de tri par comparaison. Les trois premiers chapitres, et en partie les deux chapitres sui- vants, peuvent ? etre consid´ er´ es comme des chapitres de r´ ef´ erence, auxquels on se reportera si n´ ecessaire. La deuxi` eme partie, consacr´ ee ` a des th` emes plus avanc´ es, d´ ebute par un long chapitre sur les arbres de recherche. Les deux chapitres suivants sont consacr´ es ` a l?optimisation combinatoire. Puis viennent deux chapitres sur la recherche de motifs dans un texte, et enfin deux chapitres sur la g´ eom´ etrie algorithmique et la planification de trajectoires. Pr´ esentation des algorithmes Les algorithmes sont pr´ esent´ es dans un langage proche de Pascal; assez rarement, et principalement dans le chapitre 3 (Structures de donn´ ees), des r´ ef´ erences ex- plicites ` a Pascal sont faites, avec des programmes complets, pr? ets ` a cuire. Nous nous effor¸ cons de pr´ esenter les algorithmes avec suffisamment de d´ etails pour que l?´ ecriture de programmes soit facile; en particulier, nous d´ ecrivons soigneusement les structures de donn´ ees ` a employer. Contenu du livre Le premier chapitre contient la d´ efinition des diverses mesures du co? ut d?un al- gorithme : co? ut dans le cas le plus d´ efavorable, co? ut moyen, co? ut amorti; il se termine par une borne inf´ erieure sur la complexit´ e du tri par comparaison. La premi` ere section du deuxi` eme chapitre contient la d´ efinition des notations dites de Landau, ainsi que des exemples de manipulation. Dans la deuxi` eme section, nous abordons la r´ esolution de divers types d?´ equations de r´ ecurrence auxquelles conduit l?analyse d?un algorithme. Nous d´ ecrivons notamment la r´ esolution des r´ ecurrences lin´ eaires et des r´ ecurrences de partition. Version 6 f´ evrier 2005 XVI Avant-propos Dans le chapitre 3, nous passons en revue les structures de donn´ ees ´ el´ ementaires, ` a savoir les piles, files, listes, ainsi que les arbres binaires et les arbres binaires de recherche. Nous d´ ecrivons ensuite les files de priorit´ e et leur impl´ ementation au moyen de tas. Nous terminons par un algorithme de gestion de partitions. Le chapitre 4 est consacr´ e aux bases de la th´ eorie des graphes. Apr` es les d´ efi- nitions, nous exposons l?algorithme de Roy-Warshall et d?autres probl` emes d?ac- cessibilit´ e. Les parcours classiques d?un graphe (parcours en profondeur, en lar- geur) sont d´ ecrits. Puis, nous pr´ esentons en d´ etail l?algorithme de Tarjan de calcul des composantes fortement connexes d?un graphe, qui est lin´ eaire en fonction du nombre d?arcs du graphe. Le chapitre 5 pr´ esente trois algorithmes de tri interne ´ eprouv´ es et efficaces : le tri rapide, le tri fusion et le tri par tas. Nous en donnons l?analyse des co? uts en moyenne et dans le pire des cas. Le chapitre se termine par un algorithme de tri externe, le tri polyphas´ e qui est fond´ e sur les suites de Fibonacci. Le chapitre 6 contient la description de plusieurs familles d?arbres binaires de recherche ´ equilibr´ es. Nous d´ ecrivons les arbres AVL, puis les arbres a?b, avec notamment des op´ erations plus ´ elabor´ ees comme la concat´ enation et la scission, et ´ evaluons le co? ut amorti d?une suite d?op´ erations. Ensuite, nous pr´ esentons les arbres bicolores, et enfin une r´ ealisation de structures persistantes sur ces arbres. Le chapitre 7 traite deux probl` emes fondamentaux d?optimisation combinatoire : la recherche d?un arbre couvrant de co? ut minimum et la recherche des chemins de co? ut minimum issus d?un sommet dans un graphe orient´ e valu´ e. Pour le pre- mier probl` eme, nous pr´ esentons une impl´ ementation efficace des algorithmes de Kruskal et de Prim. Quant ` a la recherche des chemins de co? ut minimum, nous ex- posons l?it´ eration fondamentale de Ford, l?algorithme de Dijkstra pour des co? uts positifs et sa variante A?, l?algorithme de Bellman pour un graphe sans circuits et enfin l?algorithme Paps. Le chapitre 8 traite des probl` emes de flots optimaux dans les graphes. Nous prouvons d?abord le th´ eor` eme d?Hoffman sur l?existence d?un flot compatible, puis ´ etudions les d´ ecompositions d?un flot. Apr` es avoir ´ etabli le th´ eor` eme de Ford et Fulkerson, nous analysons les algorithmes les plus performants pour le calcul du flot maximum, ` a savoir l?algorithme primal des distances estim´ ees au puits (algorithme d?Ahuja et Orlin) et deux variantes efficaces de l?algorithme dual du pr´ eflot, l?algorithme de Karzanov et l?algorithme des exc` es ´ echelonn´ es. Nous consid´ erons ensuite le probl` eme du flot de co? ut minimum et pr´ esentons un algorithme d? u ` a Goldberg et Tarjan. Nous terminons par l?algorithme d?Edmonds et Karp pour la recherche d?un plan de transport de co? ut minimum. Dans le chapitre 9, pr´ eliminaire au chapitre suivant, nous pr´ esentons les bases de la th´ eorie des automates finis. Apr` es avoir d´ emontr´ e l?´ equivalence entre les automates finis et les automates finis d´ eterministes, nous ´ etablissons le th´ eor` eme de Kleene qui montre que les langages reconnaissables et les langages rationnels sont une seule et m? eme famille de langages. Nous prouvons l?existence et l?unicit´ e Version 6 f´ evrier 2005 Avant-propos XVII d?un automate d´ eterministe minimal reconnaissant un langage donn´ e. Pour la construction de cet automate, nous pr´ esentons l?algorithme de Hopcroft de mini- misation. Dans le chapitre 10, nous consid´ erons d?abord le probl` eme de la recherche d?une ou de toutes les occurrences d?un mot dans un texte. Nous pr´ esentons l?algorithme na¨ ?f, l?algorithme de Morris et Pratt, et sa variante due ` a Knuth, Morris et Pratt, l?impl´ ementation par automate fini et l?algorithme de Simon, et pour finir l?algo- rithme de Boyer et Moore, dans sa version de Horspool et dans la version com- pl` ete. Ensuite, nous consid´ erons la recherche d?une occurrence de plusieurs mo- tifs, et d´ ecrivons l?algorithme de Aho et Corasick. Dans la derni` ere section, nous ´ etudions la recherche d?occurrences de mots d´ ecrits par une expression rationnelle. La premi` ere section du chapitre 11 contient un rappel de quelques notations clas- siques en g´ eom´ etrie euclidienne, ainsi que la mise en place d?outils qui seront utiles dans les sections suivantes. La deuxi` eme section est consacr´ ee aux algorithmes de calcul de l?enveloppe convexe d?un ensemble fini de points du plan. Nous termi- nons par un algorithme plus sophistiqu´ e de gestion dynamique d?enveloppes con- vexes. Quelques probl` emes de localisation d?un point dans le plan divis´ e en r´ egions sont ´ etudi´ es dans la troisi` eme section; on y utilise des structures de donn´ ees assez complexes, en particulier les ensembles ordonn´ es persistants. La derni` ere section est consacr´ ee aux diagrammes de Vorono¨ ? de points et de segments. Dans le chapitre 12, nous ´ etudions un probl` eme de planification de trajectoires, aussi appel´ e le probl` eme du d´ em´ enageur de piano . Nous donnons des algo- rithmes performants dans deux cas particuliers typiques : l?algorithme de trans- lation d?un segment dans un environnement polygonal d? u ` a Schwartz et Sharir, et celui du d´ eplacement d?un disque d? u ` a ´ O?D´ unlaing et Yap. Ce dernier utilise les diagrammes de Vorono¨ ? de segments. Exercices et notes Les chapitres sont en g´ en´ eral suivis de notes et d?exercices. Les notes biblio- graphiques sont volontairement succinctes. Leur but n?est pas de retracer la pa- ternit´ e des r´ esultats ou des algorithmes pr´ esent´ es, mais de conseiller des lectures compl´ ementaires. On y trouvera notamment des renvois nombreux au Hand- book of Theoretical Computer Science qui contient, lui, d?abondantes listes de r´ ef´ erences bibliographiques. Remerciements Nous avons b´ en´ efici´ e, durant la pr´ eparation de ce livre, de commentaires, dis- cussions et remarques de nombreux coll` egues. Nous remercions en particulier Paul Blanchard, Luc Boasson, Maxime Crochemore, Clara Daquin, Christiane Frougny, Marie-Paule Gascuel, Ir` ene Guessarian, Michelle Morcrette, Dominique Perrin, Michel Pocchiola, Andreas Podelski, Imre Simon, Mich` ele Soria, Volker Strehl, Anne Verroust, Mariette Yvinec. Version 6 f´ evrier 2005 1 Chapitre 1 Pr´ eliminaires Dans ce chapitre pr´ eliminaire, nous donnons d?abord une classification des pro- bl` emes du point de vue de leur complexit´ e algorithmique, nous discutons ensuite les mesures de complexit´ e, puis nous donnons une borne inf´ erieure sur la com- plexit´ e du tri par comparaison. 1.1 Les algorithmes et leur co? ut 1.1.1 Algorithmes Un algorithme est un ensemble d?op´ erations de calcul ´ el´ ementaires, organis´ e selon des r` egles pr´ ecises dans le but de r´ esoudre un probl` eme donn´ e. Pour chaque donn´ ee du probl` eme, l?algorithme retourne une r´ eponse apr` es un nombre fini d?op´ erations. Les op´ erations ´ el´ ementaires sont par exemple les op´ erations arith- m´ etiques usuelles, les transferts de donn´ ees, les comparaisons entre donn´ ees, etc. Selon le niveau d?abstraction o` u l?on se place, les op´ erations arithm´ etiques et les objets sur lesquels elles portent peuvent ? etre plus ou moins compliqu´ ees. Il peut s?agir simplement d?additionner des entiers naturels, ou de multiplier des polyn? omes, ou encore de calculer les valeurs propres d?une matrice. Pour un syst` eme de calcul formel, il s?agit l` a d?op´ erations ´ el´ ementaires, parce qu?elles ont ´ et´ e programm´ ees et sont disponibles dans des biblioth` eques, plus ou moins transparentes ` a l?utilisateur; dans un langage comme Pascal, ces op´ erations ne sont pas disponibles. Il appara? ?t utile de ne consid´ erer comme v´ eritablement ´ el´ ementaires que les op´ e- rations dont le temps de calcul est constant, c?est-` a-dire ne d´ epend pas de la taille des op´ erandes. Par exemple, l?addition d?entiers de taille born´ ee a priori (les integer en Pascal) est une op´ eration ´ el´ ementaire; l?addition d?entiers de taille quelconque ne l?est pas. De m? eme, le test d?appartenance d?un ´ el´ ement ` a un ensemble n?est pas une op´ eration ´ el´ ementaire en ce sens, parce que son Version 6 f´ evrier 2005 2 Chapitre 1. Pr´ eliminaires temps d?ex´ ecution d´ epend de la taille de l?ensemble, et ceci m? eme si dans certains langages de programmation, il existe des instructions de base qui permettent de r´ ealiser cette op´ eration. L?organisation des calculs, dans un algorithme, est souvent appel´ ee sa structure de contr? ole. Cette structure d´ etermine l?ordre dans lequel il convient de tester des conditions, de r´ ep´ eter des op´ erations, de recommencer tout ou partie des calculs sur un sous-ensemble de donn´ ees, etc. L` a aussi, des conventions existent sur la fa¸ con de mesurer le co? ut des op´ erations; la richesse des structures de contr? ole d´ epend fortement des langages de programmation. Le langage Pascal est peut- ? etre l?un des plus pauvres dans ce domaine parmi les langages modernes. En g´ en´ eral, le co? ut des structures de contr? ole peut ? etre n´ eglig´ e, parce qu?il est pris en compte, asymptotiquement, par les op´ erations ´ el´ ementaires. En fait, le surco? ut provenant par exemple d?une programmation r´ ecursive n?est vraiment sensible que lorsqu?elle entra? ?ne des recopies massives de donn´ ees. 1.1.2 Probl` emes intraitables Contrairement ` a une id´ ee largement r´ epandue, tout probl` eme ne peut ? etre r´ esolu par un algorithme. Ce n?est pas une question de taille des donn´ ees, mais une impossibilit´ e fondamentale. On doit la preuve de ce fait aux logiciens des ann´ ees 30 et 40. Pour en donner une d´ emonstration rigoureuse, il convient ´ evidemment de formuler tr` es pr´ ecis´ ement la notion d?algorithme. Il appara? ?t que les possibilit´ es des ordinateurs et des langages de programmation sont parfaitement couvertes par la d´ efinition math´ ematique de ce qui est r´ esoluble algorithmiquement. On est donc en pr´ esence d?une premi` ere dichotomie, entre probl` emes insolubles al- gorithmiquement et les autres. Parmi les probl` emes qui sont algorithmiquement solubles, on peut encore distinguer une hi´ erarchie en fonction de la complexit´ e des algorithmes, complexit´ e mesur´ ee en temps de calcul, c?est-` a-dire en nombre d?op´ erations ´ el´ ementaires, et exprim´ ee en fonction de la taille du probl` eme. La taille elle-m? eme est un param` etre qui mesure le nombre de caract` eres n´ ecessaires pour d´ ecrire une donn´ ee du probl` eme. Pour une matrice carr´ ee ` a coefficients born´ es par exemple, son ordre est un bon param` etre de la taille; pour un poly- n? ome, le degr´ e peut ? etre une indication de la taille, sauf si l?on sait par exemple que le polyn? ome n?a que tr` es peu de coefficients non nuls, auquel cas le nombre de coefficients non nuls est un meilleur indicateur. Le temps de calcul d?un al- gorithme cro? ?t en g´ en´ eral en fonction de la taille des donn´ ees, et la vitesse de la croissance est une mesure de la complexit´ e du probl` eme. Une croissance expo- nentielle ou plus rend un probl` eme intraitable pour des donn´ ees de grande taille. M? eme une croissance polynomiale, disons comme une puissance cinqui` eme de la taille des donn´ ees, rend la r´ esolution pratiquement impossible pour des donn´ ees d?une certaine taille. Evidemment, il existe de tr` es nombreux probl` emes pour lesquels tout algorithme a une croissance au moins exponentielle. Dans cette cat´ egorie, on trouve les algo- Version 6 f´ evrier 2005 1.1. Les algorithmes et leur co? ut 3 rithmes dont le r´ esultat lui-m? eme est constitu´ e d?un nombre exponentiel ou plus de donn´ ees. Par exemple, la g´ en´ eration de toutes les permutations de n ´ el´ ements prend un temps plus qu?exponentiel, simplement parce qu?il y a n! permutations. Il existe toute une classe de probl` emes, qui sont des probl` emes d?optimisation com- binatoire, o` u l?on cherche une solution optimale parmi un nombre exponentiel de solutions r´ ealisables. Une bonne strat´ egie, si elle existe, permet de trouver une so- lution optimale sans ´ enum´ erer l?ensemble des solutions r´ ealisables; on peut alors r´ esoudre le probl` eme en temps disons polynomial. Bien entendu, on ne conna? ?t pas toujours une telle strat´ egie; mais on ne sait pas ` a l?heure actuelle si, pour tout probl` eme de ce type, il existe un algorithme polynomial. La conjecture la plus problable est qu?un tr` es grand nombre de probl` emes de ce type ne puissent pas ? etre r´ esolus par un algorithme polynomial. On aurait ainsi une deuxi` eme division des probl` emes, entre ceux qui sont solubles, mais intraitables, et les autres, pour lesquels il existe des algorithmes efficaces. L?un des objectifs de l?algorithmique est l?´ etude de ces probl` emes, pour lesquels on cherche les algorithmes les plus efficaces, tant du point de vue du temps de calcul que des besoins en place. 1.1.3 Sur la pr´ esentation d?algorithmes Pour pr´ esenter les algorithmes de mani` ere formelle, nous utilisons dans ce livre un langage proche de Pascal. Toutefois, en vue de ne pas alourdir inutilement la lecture, nous n?en suivons pas strictement la syntaxe; de plus, nous introduisons quelques ellipses, et quelques variantes sur les structures de contr? ole. La plupart parlent d?elles-m? emes. Ainsi, pour ´ economiser l?´ ecriture de parenth` eses (d´ ebut,fin), nous utilisons les mots finsi, finpour, et fintantque comme d´ elimiteurs de port´ ee, lorsqu?un tel d´ eli- miteur est utile. Nous ´ ecrivons donc : si test alors suite d?instructions sinon suite d?instructions finsi tantque test faire suite d?instructions fintantque pour · · · faire suite d?instructions finpour D?autres variantes concernent la structure de contr? ole. Ainsi, retourner, et plus rarement exit provoque (comme en C) la sortie de la proc´ edure ou fonction courante, et le retour vers la proc´ edure appelante. Enfin, nous utilisons largement la version s´ equentielle des op´ erateurs bool´ eens et et ou (comme en Modula), baptis´ es etalors et oualors. Dans l?´ evaluation d?une expression de la forme a etalors b, on ´ evalue d?abord a, et on n?´ evalue b que si a est vrai. Le m? eme m´ ecanisme vaut mutatis mutandis pour oualors. On ´ economise ainsi beaucoup de programmation confuse. Version 6 f´ evrier 2005 4 Chapitre 1. Pr´ eliminaires 1.2 Mesures du co? ut Consid´ erons un probl` eme donn´ e, et un algorithme pour le r´ esoudre. Sur une donn´ ee x de taille n, l?algorithme requiert un certain temps, mesur´ e en nom- bre d?op´ erations ´ el´ ementaires, soit c(x). Le co? ut en temps varie ´ evidemment avec la taille de la donn´ ee, mais peut aussi varier sur les diff´ erentes donn´ ees de m? eme taille n. Par exemple, consid´ erons l?algorithme de tri qui, partant d?une suite (a1, . . . , an) de nombres r´ eels distincts ` a trier en ordre croissant, cherche la premi` ere descente, c?est-` a-dire le plus petit entier i tel que ai > ai+1, ´ echange ces deux ´ el´ ements, et recommence sur la suite obtenue. Si l?on compte le nombre d?inversions ainsi r´ ealis´ ees, il varie de 0 pour une suite tri´ ee ` a n(n?1)/2 pour une suite d´ ecroissante. Notre but est d?´ evaluer le co? ut d?un algorithme, selon certains crit` eres, et en fonction de la taille n des donn´ ees. 1.2.1 Co? ut dans le cas le plus d´ efavorable Le co? ut C(n) d?un algorithme dans le cas le plus d´ efavorableou dans le cas le pire ( worst-case en anglais) est par d´ efinition le maximum des co? uts, sur toutes les donn´ ees de taille n : C(n) = max |x|=n c(x) (on note |x| la taille de x.) Dans l?algorithme ci-dessus, ce co? ut est n(n ? 1)/2. Cette mesure du co? ut est r´ ealiste parce qu?elle prend en compte toutes les possi- bilit´ es. 1.2.2 Co? ut moyen Dans des situations o` u l?on pense que le cas le plus d´ efavorable ne se pr´ esente que rarement, on est plut? ot int´ eress´ e par le co? ut moyen de l?algorithme. Une formulation correcte de ce co? ut moyen suppose que l?on connaisse une distribution de probabilit´ es sur les donn´ ees de taille n. Si p(x) est la probabilit´ e de la donn´ ee x, le co? ut moyen ?(n) d?un algorithme sur les donn´ ees de taille n est par d´ efinition ?(n) = |x|=n p(x)c(x) Le plus souvent, on suppose que la distribution est uniforme, c?est-` a-dire que p(x) = 1/T(n), o` u T(n) est le nombre de donn´ ees de taille n. Alors, l?expression du co? ut moyen prend la forme ?(n) = 1 T(n) |x|=n c(x) (2.1) Version 6 f´ evrier 2005 1.2. Mesures du co? ut 5 Continuons notre exemple du tri par transposition. Le nombre de donn´ ees de taille n, c?est-` a-dire de suites de n nombres r´ eels distincts, est infini. Or, seul l?ordre relatif des ´ el´ ements d?un suite intervient dans l?algorithme. Une donn´ ee de taille n peut donc ? etre assimil´ ee ` a une permutation de l?ensemble {1, . . . , n}. On a alors T(n) = n!. Le co? ut c(x) d?une permutation x est le nombre de transpositions d?´ el´ ements adjacents n´ ecessaires pour transformer x en la permutation identique; ce nombre est le nombre d?inversions de x, qui est par d´ efinition le nombre b1 + · · ·+bn, o` u bj est le nombre d?entiers 1 ? i < j tels que xi > xj. On peut montrer que le nombre moyen d?inversions est n(n ? 1)/4, de sorte que le co? ut moyen de l?algorithme, pour la distribution uniforme, est n(n ? 1)/4. Comme le montre cet exemple, l?´ evaluation du co? ut moyen est en g´ en´ eral bien plus compliqu´ ee que l?´ evaluation du co? ut dans le cas le plus d´ efavorable. Consid´ erons un autre exemple, ` a savoir la g´ en´ eration de toutes les parties d?un ensemble E ` a n ´ el´ ements, disons de {1, . . . , n}. Chaque partie X est repr´ esent´ ee par son vecteur caract´ eristique x, avec x[i] = 1 si i ? X 0 sinon Concr` etement, on utilise un type suite pour repr´ esenter ces vecteurs. Le calcul du premier sous-ensemble, la partie vide de E, revient ` a initialiser la suite x ` a (0, . . . , 0). Les parties suivantes s?obtiennent en proc´ edant de droite ` a gauche dans le vecteur courant x. On remplace tous les 1 par 0 jusqu?` a rencontrer un 0. Celui-ci est remplac´ e par 1 (c?est tr` es exactement l?algorithme d?incr´ ementation, en binaire). Voici une r´ ealisation : PROCEDURE Suivante (VAR x:suite; n:integer; VAR d:boolean); VAR i: integer; BEGIN i := n; WHILE (i > 0) AND (x[i] = 1) DO BEGIN x[i] := 0; i := i - 1 END; d := i = 0; IF NOT d THEN x[i] := 1 END; Dans la boucle WHILE, l?op´ erateur AND est s´ equentiel. La variable bool´ eenne d rep` ere si la suite donn´ ee en argument repr´ esente la derni` ere partie de l?ensemble E, ` a savoir E lui-m? eme. Analysons le co? ut d?un appel de la proc´ edure Suivante, sur le tableau x, mesur´ e par le nombre de comparaisons x[i] = 1. Le co? ut est n lorsque les x[i] valent 1 pour 1 ? i ? n, c?est-` a-dire lorsque l?on a atteint la derni` ere partie. Le co? ut est aussi n lorsque x[1] = 0 et les autres ´ el´ ements de x valent 1. Quel est le co? ut moyen de la proc´ edure, sur tous les appels? Pour l?´ evaluer, nous reprenons l?´ equation (2.1) Version 6 f´ evrier 2005 6 Chapitre 1. Pr´ eliminaires et l?´ ecrivons sous la forme ?(n) = 1 T(n) n i=1 ici o` u ci est le nombre de donn´ ees x pour lequelles le co? ut est i, c?est-` a-dire telles que c(x) = i. Pour 1 ? i < n, le nombre de comparaisons est i, si x se termine par un ´ el´ ement 0 suivi par i ? 1 ´ el´ ements ´ egaux ` a 1. Le nombre de suites de cette forme est 2n?i . Enfin, on a cn = 2, de sorte que ?(n) = 1 2n 2n + n?1 i=1 i2n?i Le nombre entre parenth` eses est ´ egal ` a 2n+1 ? 2, et on a ?(n) = 2n+1 ? 2 2n donc le co? ut moyen du calcul de la partie suivante est approximativement 2. Comme ces exemples l?indiquent, l?estimation du co? ut moyen d?un algorithme est en g´ en´ eral plus d´ elicate que l?estimation du co? ut dans le cas le plus d´ efavorable, et n´ ecessite une bonne dose de connaissances combinatoires sur les objets trait´ es. 1.2.3 Co? ut amorti Lorsqu?une suite d?op´ erations est effectu´ ee sur une structure, le co? ut total est ´ egal ` a la somme des co? uts des op´ erations individuelles. Connaissant des estimations du co? ut (dans le cas le plus d´ efavorable) des op´ erations individuelles, on obtient une estimation du co? ut total en sommant ces majorations du co? ut des op´ erations individuelles. Or tr` es souvent, cette majoration du co? ut total qui, ` a chaque ´ etape, proc` ede par une ´ evaluation pessimiste, est trop grossi` ere. On observe en effet que le cas le plus d´ efavorable ne se r´ ep` ete pas . Plus pr´ ecis´ ement, dans de nombreux algorithmes, le cas le plus d´ efavorable provient d?un d´ es´ equilibre exceptionnel qui ne peut pas se produire plusieurs fois de suite, car le traitement de ce cas d´ efavorable r´ etablit l?´ equilibre. Il y a alors un ph´ enom` ene de compensation entre op´ erations cons´ ecutives, d?amortissement des co? uts, que nous explicitons dans cette section. Commen¸ cons par un exemple. Exemple. Consid´ erons une pile (voir chapitre 3), et d´ efinissons une op´ eration comme ´ etant une suite (´ eventuellement vide) de d´ epilements suivie d?un empile- ment (ce genre d?op´ erations se rencontre par exemple en analyse syntaxique). Le co? ut d?une op´ eration o est c(o) = 1 + d, o` u d est le nombre de d´ epilements pr´ ec´ edant l?empilement. Partant de la pile vide P0, on effectue une suite o1, . . . , on d?op´ erations : P0 o1 ?? P1 ?? . . . on ?? Pn Version 6 f´ evrier 2005 1.2. Mesures du co? ut 7 o` u Pk est la pile apr` es la k-i` eme op´ eration, et l?on veut estimer le co? ut total cn = c(o1) + · · · + c(on) Une m´ ethode simple consiste ` a majorer le co? ut de chaque op´ eration ok par k. En effet, dans le cas le plus d´ efavorable, l?op´ eration ok vide compl` etement la pile Pk?1 avant de proc´ eder ` a l?empilement, et Pk?1 contient au plus k ? 1 ´ el´ ements. On a donc c(ok) ? k, d?o` u c(n) = O(n2 ). Mais, comme d´ ej` a dit plus haut, le cas le plus d´ efavorable (ici : la pile Pk?1 contient k ? 1 ´ el´ ements) ne se produit pas deux fois de suite. En d?autres termes, notre analyse n?a pas pris en compte une contrainte globale qui, dans le cas d?une pile, exprime que l?on ne peut pas d´ epiler des ´ el´ ements avant de les avoir empil´ es. Plus pr´ ecis´ ement, notons dk le nombre de d´ epilements de la k-i` eme op´ eration, de sorte que c(ok) = 1 + dk Alors cn = n + d avec d = d1 + · · · + dn. Or n est le nombre total d?empilements et d est le nombre total de d´ epilements. Comme on ne peut d´ epiler plus que l?on a empil´ e, on a d ? n et donc cn ? 2n. Cet argument s?explicite par ce que l?on nomme la technique du potentiel : ` a chaque pile Pk, on associe un nombre hk (son potentiel ) qui est toujours positif ou nul; le co? ut de l?op´ eration ok s?exprime ` a l?aide d?une variation du potentiel. Dans notre cas, prenons pour hk la hauteur de la pile Pk. On a h0 = 0, hk = hk?1 ? dk + 1 (k ? 1) et bien s? ur hk ? 0 pour k = 1, . . . , n. Comme dk = hk?1 ? hk + 1, le co? ut de l?op´ eration ok est c(ok) = 2 + hk?1 ? hk Il en r´ esulte bien entendu que cn = c(o1)+· · ·+c(on) = 2n+h0?hn = 2n?hn ? 2n. On appelle co? ut amorti de l?op´ eration o (relativement au potentiel h) la valeur a(o) = c(o) + h ? h o` u h est le potentiel de la pile avant l?op´ eration, et h est le potentiel de la pile apr` es l?op´ eration o. Dans notre cas, le co? ut amorti est ´ egal ` a 2. On obtient a(o1) + · · · + a(on) = c(o1) + · · · + c(on) + hn ? h0 et comme hn ? 0, h0 = 0, on a c(o1) + · · · + c(on) ? a(o1) + · · · + a(on) donc le co? ut amorti de la suite des op´ erations est une majoration du co? ut total. On peut voir ce proc´ ed´ e de comptage d?une autre mani` ere, plus ludique. Sup- posons que l?ordinateur qui doit ex´ ecuter la suite d?op´ erations travaille avec des Version 6 f´ evrier 2005 8 Chapitre 1. Pr´ eliminaires jetons, comme une vulgaire machine ` a sous ( coin-operated computer , disent les Am´ ericains). Chaque fois que l?on ins` ere un jeton, l?ordinateur est dispos´ e ` a travailler pendant une dur´ ee fixe, puis il s?arr? ete et attend le jeton suivant. Si une op´ eration se termine avant ´ epuisement du temps achet´ e, ce temps de calcul est disponible pour l?op´ eration suivante. Le co? ut total d?une suite d?op´ erations est alors proportionnel au nombre de jetons qu?il faut introduire, et l?avoir est ´ egal ` a la valeur du potentiel. Le co? ut amorti correspond au nombre de jetons ` a introduire par op´ eration (ici 2) pour pouvoir effectuer les op´ erations. Plus formellement, on consid` ere une famille de structures sujettes ` a des op´ e- rations qui les transforment. De plus, on suppose d´ efini un potentiel, c?est-` a-dire une fonction h qui ` a chaque structure associe un nombre r´ eel positif ou nul. En particulier, on demande que le potentiel de la structure vide soit nul. Par d´ efinition, le co? ut amorti d?une op´ eration o qui, appliqu´ ee ` a la structure S, donne la structure S = o(S), relativement au potentiel h, est a(o) = c(o) + h(S ) ? h(S) Le co? ut amorti d?une suite d?op´ erations o1, . . . , on est la somme des co? uts amortis des op´ erations individuelles. Proposition 2.1. Soit h un potentiel, et soit o1, . . . , on une suite d?op´ erations appliqu´ ee ` a une structure de potentiel nul. La somme des co? uts de la suite d?op´ era- tions est major´ ee par son co? ut amorti relativement ` a h : c(o1) + · · · + c(on) ? a(o1) + · · · + a(on) Preuve. Soit S0 la structure de d´ epart initialement vide, et soit Sk la structure obtenue apr` es la k-i` eme op´ eration : S0 o1 ?? S1 o2 ?? . . . on ?? Sn On a a(ok) = c(ok)+h(Sk)?h(Sk?1). Comme les valeurs du potentiel s?´ eliminent deux ` a deux, on obtient a(o1) + · · · + a(on) = c(o1) + · · · c(on) + h(Sn) ? h(S0) Or h(S0) = 0 et h(Sn) ? 0, ce qui ´ etablit l?in´ egalit´ e. Dans la pratique, on essaie de trouver, en utilisant son intuition, un potentiel qui fournit une majoration ais´ ee du co? ut amorti des op´ erations, ce qui donne ensuite une majoration du co? ut total. Exemple. Revenons sur l?exemple de la g´ en´ eration des parties d?un ensemble ` a n ´ el´ ements. Notons ok le k-i` eme appel de la proc´ edure Suivante. Le co? ut total cN du calcul des N premiers sous-ensembles est cN = c(o1) + · · · c(oN ). D´ efinissons un potentiel h sur le tableau x par : h(x) = le nombre d?´ el´ ements ´ egaux ` a 1 dans Version 6 f´ evrier 2005 1.3. Une borne inf´ erieure 9 x. Le co? ut de l?op´ eration ok qui transforme le k ? 1-i` eme tableau x(k?1) en le k-i` eme tableau x(k) est alors c(ok) = 2 + h(x(k?1) ) ? h(x(k) ) et le co? ut amorti est a(ok) = c(ok) + h(x(k) ) ? h(x(k?1) ) = 2 La somme des co? uts amortis est 2N, et en vertu de la proposition pr´ ec´ edente, ceci majore le co? ut total. Ce r´ esultat est d?une autre nature que l?´ evaluation en moyenne donn´ ee plus haut, dans la mesure o` u il ne fait appel ` a aucune hypoth` ese probabiliste. 1.3 Une borne inf´ erieure Apr` es avoir trouv´ e et analys´ e un algorithme qui r´ esout un probl` eme donn´ e, il est naturel de se demander si cet algorithme est le meilleur possible. Il existe plusieurs fa¸ cons d?am´ eliorer, parfois substantiellement, un algorithme, ou un pro- gramme, en organisant mieux les donn´ ees, en ´ economisant des calculs d?indices, en regroupant certaines op´ erations. Ces optimisations peuvent prendre en compte les caract´ eristiques d?un langage de programmation sp´ ecifique, voire les par- ticularit´ es d?un compilateur. La question de l?optimalit´ e d?un algorithme, vue ind´ ependamment d?une impl´ ementation particuli` ere, se pose diff´ eremment : on se demande s?il existe un algorithme qui n´ ecessite moins d?op´ erations ´ el´ ementaires. Pour cela, on estime le nombre d?op´ erations requises par tout algorithme qui r´ esout le probl` eme donn´ e. L` a encore, la formulation du probl` eme et de la r´ eponse se fait en fonction de la taille des donn´ ees. On cherche le nombre d?op´ erations n´ ecessaires pour r´ esoudre le probl` eme dans le cas le plus d´ efavorable pour les donn´ ees de taille n. Pour apporter une r´ eponse ` a cette question, il faut d?abord d´ efinir pr´ ecis´ ement la classe d?algorithmes et les op´ erations ´ el´ ementaires. Nous d´ ecrivons ci-dessous le mod` ele des arbres de d´ ecisionqui permet de prouver que tout algorithme de tri qui op` ere par comparaisons n´ ecessite au moins n ln n ? n comparaisons pour trier des suites de n ´ el´ ements. Cette borne inf´ erieure vaut pour le cas le plus d´ efavorable : pour tout algorithme, et pour tout n, il existe une suite dont le tri exige au moins n ln n ? n comparaisons. Dans un algorithme de tri par comparaisons, on utilise uniquement des com- paraisons pour obtenir des informations sur la suite (a1, . . . , an) de donn´ ees. En d?autres termes, ´ etant donn´ es ai et aj, on effectue l?un des test ai < aj, ai ? aj, ai = aj pour d´ eterminer leur position relative. Aucune autre information n?est accessible sur ces ´ el´ ements. Pour prouver le r´ esultat annonc´ e, il suffit de se res- treindre aux suites dont les ´ el´ ements sont distincts; nous pouvons donc nous contenter du test ai ? aj. Version 6 f´ evrier 2005 10 Chapitre 1. Pr´ eliminaires Le comportement d?un algorithme de tri, sur des suites de longueur n, peut ? etre repr´ esent´ e par un arbre binaire (voir chapitre 4), appel´ e arbre de d´ ecision. Dans un arbre de d´ ecision, chaque n?ud est ´ etiquet´ e par une comparaison, not´ ee ai : aj, pour des entiers 1 ? i, j ? n, et chaque feuille est ´ etiquet´ ee par une permutation (?(1), . . . , ?(n)) (voir figure 3.1). 3 a a1 : a1 3 a : 2 a 3 a : 2 a 3 a : < > 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 < > < > < > < > a1 2 a : Figure 3.1: L?arbre de d´ ecision d?un algorithme de tri. L?ex´ ecution de l?algorithme de tri sur une suite (a1, . . . , an) correspond ` a un chemin dans l?arbre, menant de la racine ` a une feuille. A chaque n?ud, une comparaison ai < aj est faite, et le r´ esultat de la comparaison indique si les comparaisons suivantes se font dans le sous-arbre gauche ou le sous-arbre droit. Lorsque une feuille est atteinte, l?algorithme de tri a ´ etabli que l?ordre est a?(1) < a?(2) < · · · < a?(n). Chacune des n! permutations doit appara? ?tre comme ´ etiquette d?une feuille, pour que l?algorithme puisse proprement s´ eparer tous les cas de fi- gure. La longueur du chemin de la racine ` a une feuille donne le nombre de compa- raisons effectu´ ees, et dans le cas le plus d´ efavorable, le nombre de comparaisons n´ ecessaires est donc ´ egal ` a la hauteur de l?arbre. Une minoration de la hauteur d?un arbre de d´ ecision fournit donc une borne inf´ erieure sur le nombre de com- paraisons. Lemme 3.1. Soit A un arbre binaire. Si A a n! feuilles, alors la hauteur de A est au moins n ln n ? n. Preuve. Soit h la hauteur de A. Alors n! ? 2h , donc ln n! ? h ln 2 ? h. Or ln n! ? n ln n ? n (voir chapitre 2), d?o` u le r´ esultat. Corollaire 3.2. Tout algorithme de tri par comparaisons n´ ecessite, dans le cas le plus d´ efavorable, au moins n ln n ? n comparaisons pour trier des suites de longueur n. Il est important de noter que ce r´ esultat ne porte que sur une famille bien pr´ ecise d?algorithmes de tri, ` a savoir les tris par comparaisons. Il existe d?autres tech- niques de tris qui peuvent s?appliquer lorsque l?on a des informations sur la nature Version 6 f´ evrier 2005 1.3. Une borne inf´ erieure 11 des cl´ es. Le tri par champs par exemple ( bucket sort en anglais) est un tri en temps lin´ eaire qui s?emploie lorsque les cl´ es sont des cha? ?nes de caract` eres. La borne inf´ erieure sur les algorithmes de tri est g´ en´ erique en ce sens que, pour de nombreux probl` emes apparemment compl` etement diff´ erents, on obtient ´ egalement une borne inf´ erieure en n ln n, en se ramenant au probl` eme du tri. Il en est ainsi par exemple pour le calcul de l?enveloppe convexe d?un ensemble de points dans le plan (chapitre 11, section 2). La d´ emarche est la suivante : on con- sid` ere un algorithme A pour le probl` eme donn´ e, et on montre que cet algorithme peut aussi ? etre utilis´ e, parfois apr` es quelques transformations, comme algorithme de tri par comparaisons. En vue du corollaire ci-dessus, le nombre d?op´ erations de l?algorithme A est minor´ e. Comme l?argument vaut pour n?importe quel algo- rithme A, on obtient la borne inf´ erieure recherch´ ee. Version 6 f´ evrier 2005 12 Chapitre 1. Pr´ eliminaires Version 6 f´ evrier 2005 13 Chapitre 2 Evaluations La premi` ere section de ce chapitre contient la d´ efinition des notations dites de Landau, ` a savoir O, ?, et ?, ainsi que des exemples de manipulation. Dans la deuxi` eme section, nous abordons la r´ esolution de divers types de r´ ecurrences. En effet, l?analyse d?un algorithme conduit le plus souvent ` a des ´ equations de r´ ecurrence. Dans certains cas, on peut les r´ esoudre compl` etement et donner une forme close pour les fonctions qu?elles d´ efinissent; plus nombreux sont les cas o` u l?on doit se contenter d?une ´ evaluation asymptotique; on ne donne alors qu?un ordre de grandeur. Introduction L?efficacit´ e en temps d?un algorithme se mesure en fonction d?un param` etre, g´ en´ eralement la taille du probl` eme. Ce n?est ´ evidemment pas le temps physique, exprim´ e en millisecondes ou en heures qui importe. Ce temps d´ epend trop de toutes sortes de contingences mat´ erielles, comme l?´ equipement dont on dispose, le langage de programmation et la version du compilateur employ´ es, etc. On mesure le temps requis par un algorithme en comptant le nombre d?op´ erations ´ el´ ementaires effectu´ ees, o` u une op´ eration est ´ el´ ementaire lorsqu?elle prend un temps constant. Si l?on veut ? etre tr` es pr´ ecis, on doit aller plus loin, et classer les op´ erations ´ el´ ementaires selon leur nature, comme des incr´ ements de compteurs, des op´ erations arithm´ etiques, des op´ erations logiques, etc. Il est apparu qu?une telle pr´ ecision n?apportait pas d?information substantielle, et il est aujourd?hui commun´ ement admis que m? eme le d´ ecompte exact du nombre d?op´ erations n?est utile que dans une phase ultime de la r´ ealisation d?un algorithme par un pro- gramme : dans les autres situations, on se contente d?un ordre de grandeur. Version 6 f´ evrier 2005 14 Chapitre 2. Evaluations 2.1 Notations de Landau On ´ evalue l?efficacit´ e d?un algorithme en donnant l?ordre de grandeur du nombre d?op´ erations qu?il effectue lorsque la taille du probl` eme qu?il r´ esout augmente. On parle ainsi d?algorithme lin´ eaire, quadratique, logarithmique, etc. Les notations de Landau sont un moyen commode d?exprimer cet ordre de grandeur. Trois situa- tions sont d´ ecrites par ces notations. La plus fr´ equente, la notation O introduite ci-dessous, donne une majoration de l?ordre de grandeur; la notation ? en donne une minoration, et la notation ? deux bornes sur l?ordre de grandeur. La force des notations de Landau r´ eside dans leur concision. En contre-partie, leur emploi demande de la vigilance et un certain entra? ?nement. 2.1.1 Notation O On consid` ere une fonction g : R ? R. Etant donn´ e un point x0 ? R?{??, +?}, on d´ esigne par O(g) l?ensemble des fonctions f pour lesquelles il existe un voisi- nageV de x0 et une constante k > 0 tels que |f(x)| ? k |g(x)| (x ? V ) Dans le cas des fonctions d´ efinies sur R, un voisinage d?un point x0 est une partie de R contenant un intervalle ouvert contenant le point x0. On peut donc, dans la d´ efinition ci-dessus, remplacer le terme voisinage par intervalle ouvert . Si la fonction g ne s?annule pas, il revient au m? eme de dire que le rapport f(x) g(x) est born´ e pour x ? V . Exemple. Au voisinage de 0, on a x2 ? O(x), ln(1 + x) ? O(x) Par commodit´ e, on ´ ecrit x2 ` a la place de la fonction qui ` a x associe x2 ; nous utiliserons par la suite cette abus d?´ ecriture. Pour l?´ evaluation de la complexit´ e des algorithmes, nous nous int´ eressons ` a la comparaison de fonctions au voisinage de +? . Ce cas est couvert, dans la d´ efinition pr´ ec´ edente, si l?on prend x0 = +?; un voisinage est alors un ensemble contenant un intervalle (ouvert) de la forme ]a, +?[. Par cons´ equent, on a f ? O(g) au voisinage de +? s?il existe deux nombres k, a > 0 tels que |f(x)| ? k |g(x)| pour tout x > a Exemple. Au voisinage de l?infini, on a x ? O(x2 ), ln x x ? O(1), x + 1 ? O(x) Version 6 f´ evrier 2005 2.1. Notations de Landau 15 Exemple. Pour tout polyn? ome P(x) = a0xk + a1xk?1 + · · · + ak, on a P(x) ? O(xk ) au voisinage de l?infini. En effet, pour x ? 1, |P(x)| ? |a0| xk + |a1| xk?1 + · · · + |ak| ? (|a0| + · · · + |ak|) xk Souvent, les fonctions ` a comparer sont elles-m? emes ` a valeurs positives. Dans ce cas, on peut omettre les valeurs absolues. Lors de l?´ etude de fonctions mesurant les performances d?algorithmes, l?argument est en g´ en´ eral entier (taille du probl` eme) et on se place au voisinage de l?infini, ce qui signifie que l?on consid` ere les performances de l?algorithme pour des tailles importantes du probl` eme; dans ce cas, les m? emes consid´ erations restent valables lorsque le domaine des fonctions est restreint ` a l?ensemble N des entiers naturels. Une des difficult´ es dans la familiarisation avec ces concepts provient de la con- vention de notation (justement de Landau ) qui veut que l?on ´ ecrive f = O(g), ou encore f(x) = O(g(x)) au lieu de f ? O(g) De mani` ere analogue, on ´ ecrit O(f) = O(g) lorsque O(f) ? O(g) Notons tout de suite que la relation f = O(g) n?implique pas n´ ecessairement que g = O(f). Exemple. Les formules x2 + 5x = O(x2 ) = O(x3 ) d´ enotent en fait les relations x2 + 5x ? O(x2 ) ? O(x3 ) La notation de Landau permet l?´ ecriture usuelle de certaines op´ erations arith- m´ etiques; en d´ efinissant f + O(g) = {f + h | h ? O(g)} fO(g) = {fh | h ? O(g)} on a par exemple h = f + O(g) si et seulement si h ? f ? O(g). Les formules suivantes sont faciles ` a v´ erifier et fort utiles (ici c est une constante; sans la notation de Landau, il faudrait utiliser un signe d?appartenance au lieu de l?´ egalit´ e dans la premi` ere formule, et un signe d?inclusion dans les autres). f = O(f) O(?f) = O(f) cO(f) = O(f) O(f) + O(f) = O(f) O(f)O(g) = O(fg) fO(g) = O(fg) Si f et g sont ` a valeurs positives, alors Version 6 f´ evrier 2005 16 Chapitre 2. Evaluations O(f) + O(g) = O(f + g) V´ erifions par exemple la derni` ere formule. Si h ? O(f)+O(g), alors il existe deux constantes k, k > 0 et a > 0 telles que |h(x)| ? kf(x) + k g(x) pour x ? a. Soit K le plus grand des nombres k et k . Alors on a |h(x)| ? K(f(x) + g(x)) parce que f et g sont ` a valeurs positives. La formule est fausse si l?on prend g = ?f par exemple. Exemple. On a 2n+1 = O(2n ) mais en revanche 3n / ? O(2n ) et de m? eme (n + 1)! / ? O(n!) (puisque (n + 1)!/n! tend vers +? avec n). Observons aussi que f(n) = O(n) implique f(n)2 = O(n2 ), mais n?implique pas que 2f(n) = O(2n ). 2.1.2 Notations ? et ? Deux notations semblables ` a la notation O sont couramment employ´ ees pour la description de la complexit´ e des algorithmes.On d´ esigne par ?(g) l?ensemble des fonctions f pour lesquelles il existe deux nombres k, a > 0 tels que |f(x)| ? k|g(x)| pour tout x > a En d?autres termes, on a f ? ?(g) ?? g ? O(f) Exemple. Le nombre de comparaisons de tout algorithme de tri de suites de longueur n est ?(n ln n), d?apr` es le chapitre pr´ ec´ edent. Enfin, on d´ esigne par ?(g) l?ensemble des fonctions f pour lesquelles il existe des nombres k1, k2, a > 0 tels que k1 |g(x)| ? |f(x)| ? k2 |g(x)| pour tout x > a. En d?autres termes, on a ?(g) = O(g) ? ?(g) Ceci signifie donc que f et g croissent de fa¸ con comparable . Plus pr´ ecis´ ement, si g ne s?annule pas, alors pour tout x > a k1 ? |f(x)| |g(x)| ? k2 Exemple. Pour tout a, b > 1, on a loga n = ?(logb n) Version 6 f´ evrier 2005 2.1. Notations de Landau 17 puisque loga n = loga b logb n. Cet exemple ne doit pas faire croire que si f = ?(g), alors le quotient |f(x)/g(x)| tend vers une limite non nulle, c?est-` a-dire |f| ? c|g| pour une constante c > 0 (rappelons que f ? g signifie que le quotient f(x)/g(x) tend vers la limite 1). En revanche, si |f| ? c|g|, alors f = ?(g). Exemple. Soit f(x) = x(2 + sin x). On a x ? f(x) ? 3x pour tout x > 0, donc f(x) = ?(x). En revanche, le quotient f(x)/x ne tend pas vers une limite lorsque x tend vers +?. 2.1.3 Exemples Suivant l?usage dans l?analyse d?algorithmes, on entendra d´ esormais que toutes les estimations de fonctions se font au voisinage de l?infini. Proposition 1.1. Pour tout k ? 1, on a n i=1 ik = ?(nk+1 ) (1.1) log n! = ?(n log n) n i=1 1 i = ?(log n) La preuve de ces formules est l?occasion d?introduire une technique ´ eprouv´ ee d?´ evaluation de sommes utilisant des int´ egrales. Les in´ egalit´ es requises sont ´ enon- c´ ees dans le lemme ´ el´ ementaire suivant. Lemme 1.2. Soient a ? b deux entiers, et soit f : [a, b] ? R une fonction croissante et continue. Alors b?1 i=a f(i) ? b a f(x) dx ? b i=a+1 f(i) Bien entendu, des in´ egalit´ es analogues s?obtiennent pour des fonctions d´ ecrois- santes. Preuve de la proposition. Commen¸ cons par (1.1). Il est clair que n i=1 ik = O(nk+1 ) : il suffit pour cela de majorer chaque terme de la somme par nk . Il est clair aussi que n i=1 ik = ?(nk ) : il suffit pour cela de n´ egliger tous les termes sauf le dernier. La difficult´ e est donc de remplacer la minoration grossi` ere ?(nk ) par la minoration plus pr´ ecise ?(nk+1 ). Pour ce faire, nous utilisons le lemme Version 6 f´ evrier 2005 18 Chapitre 2. Evaluations pr´ ec´ edent. La fonction x ? xk est croissante et continue sur l?intervalle [0, n]. On a donc n i=1 ik ? n 0 xk dx = nk+1 k + 1 ce qui prouve que la somme est dans ?(nk+1 ). Prouvons la deuxi` eme formule. On a clairement log n! = O(n log n). D?autre part, la fonction x ? ln x est croissante et continue sur l?intervalle [1, n]. Par le lemme, on a donc ln n! = n i=2 ln i ? n 1 ln x dx = [x ln x ? x]n 1 donc ln n! ? n ln n ? n + 1 ? n ln n 2 d` es que ln n ? 2. Ceci montre que ln n! ? ?(n ln n). Comme ln n = ?(log n), la m? eme formule vaut pour log. Consid´ erons enfin la troisi` eme formule. La fonction x ? 1/x est d´ ecroissante et continue sur l?intervalle [1, n + 1]. On a donc par le lemme n i=1 1 i ? n+1 1 1 x dx = ln(n + 1) De m? eme, n i=2 1 i ? n 1 1 x dx = ln n d?o` u ln(n + 1) ? n i=1 1 i ? 1 + ln n. Remarquons que, pour les trois formules de la proposition, on dispose en fait d?expressions plus pr´ ecises dont l?´ etablissement d´ epasse le cadre de ce livre. On a n i=1 ik = Bn+1(n + 1) ? Bn+1 k + 1 o` u Bn(x) est le n-i` eme polyn? ome de Bernoulli et Bn = Bn(0) est le n-i` eme nombre de Bernoulli. La formule de Stirling n! ? nn e?n ? 2?n 1 + 1 12n + 23 288n2 + · · · permet de retrouver l?´ evaluation asymptotique de log n!. Enfin, les nombres har- moniques Hn = 1 + 1 2 + · · · + 1 n satisfont Hn = ln n + ? + 1 2n + · · · Version 6 f´ evrier 2005 2.1. Notations de Landau 19 o` u ? est la constante d?Euler. Exemple. Consid´ erons un exemple plus substantiel. Il a pour but de d´ evelopper une estimation de la croissance asymptotique d?une fonction d´ efinie implicite- ment, en employant une m´ ethode d?affinages successifs appel´ ee en anglais boots- trapping . Soit la fonction f donn´ ee par l?´ equation f(t)ef(t) = t On veut l?´ etudier lorsque t tend vers +?. On constate d?abord que, pour t > 0, on a f(t) > 0. On peut donc passer au logarithme, et on obtient ln f(t) + f(t) = ln t et l?expression f(t) = ln t ? ln f(t) (1.2) L?´ equation de d´ efinition de f(t) montre que pour t ? e, on a f(t) ? 1. Par cons´ equent, ln f(t) ? 0, et l?´ equation (1.2) montre que f(t) ? ln t et donc f(t) = O(ln t) Ceci amorce la pompe . Il r´ esulte ensuite de cette relation que ln f(t) = ln O(ln t) = O(ln ln t) et par cons´ equent on peut affiner l?´ equation (1.2) en f(t) = ln t + O(ln ln t) On reporte ceci ` a nouveau dans l?´ equation (1.2), et on obtient f(t) = ln t ? ln(ln t + O(ln ln t)) = ln t ? ln(ln t (1 + O(ln ln t)/ln t)) = ln t ? ln ln t ? ln (1 + O(ln ln t)/ln t) = ln t ? ln ln t + O(ln ln t/ln t) Cette derni` ere expression donne une description d´ ej` a fort pr´ ecise du comporte- ment asymptotique de la fonction f. Exemple. On veut donner une expression asymptotique, lorsque n tend vers +?, de n ? n et de n n ? n ? 1 Pour cela, on se rappelle qu?au voisinage de 0, la fonction ex admet le d´ evelop- pement limit´ e ex = 1 + x + O(x2 ) Comme n ? n = eln n/n , et que ln n/n est voisin de 0 lorsque n est voisin de ?, on a n ? n = eln n/n = 1 + ln n/n + O (ln n/n)2 Cela montre ´ egalement que n n ? n ? 1 = ln n + O ln2 n/n . Version 6 f´ evrier 2005 20 Chapitre 2. Evaluations 2.2 R´ ecurrences L?analyse des performances d?un algorithme donne en g´ en´ eral des ´ equations im- plicites, o` u le temps de calcul, pour une taille des donn´ ees, est exprim´ e en fonction du temps de calcul pour des donn´ ees plus petites. R´ esoudre ces ´ equations n?est pas toujours possible, et l?on se contente de donner des ´ equivalents qui d´ ecrivent, de mani` ere satisfaisante, le comportement des algorithmes. Dans cette section, on passe en revue certaines techniques permettant d?obtenir des expressions ex- plicites exactes ou approch´ ees pour des fonctions donn´ ees par des relations de r´ ecurrence. 2.2.1 R´ ecurrences lin´ eaires ` a coefficients constants Nous consid´ erons ici les relations de r´ ecurrence lin´ eaires ` a coefficients constants. Des relations plus g´ en´ erales sont d´ ecrites dans la section suivante. Relations de r´ ecurrence homog` enes Une suite r´ ecurrente lin´ eaire est une suite (un)n?0 de nombres (r´ eels) qui v´ erifie une relation du type suivant : un+h = ah?1un+h?1 + · · · + a0un, n = 0, 1, 2, . . . a0 = 0 (2.1) o` u h est un entier strictement positif et ah?1, . . . , a0 sont des nombres fix´ es. Une telle suite est enti` erement d´ etermin´ ee par ses h premi` eres valeurs u0, . . . , uh?1. On dit que la suite est d?ordre h. Le polyn? ome associ´ e ou caract´ eristiquede l?´ equation (2.1) est par d´ efinition G(X) = Xh ? ah?1Xh?1 ? · · · ? a1X ? a0 On note ses racines ?1, . . . , ?r, la multiplicit´ e de ?i ´ etant not´ ee ni pour i = 1, . . . , r. Consid´ erons la s´ erie g´ en´ eratrice (formelle) de la suite (un) : u(X) = ? n=0 unXn (2.2) et soit B(X) = Xh G(1/X) le polyn? ome r´ eciproque de G(X), c?est-` a-dire B(X) = 1 ? ah?1X ? · · · ? a0Xh Posons A(X) = B(X)u(X). En vertu de la formule (2.1), il vient A(X) = h?1 j=0 uj ? j i=1 ah?1?iuj?i Xj Version 6 f´ evrier 2005 2.2. R´ ecurrences 21 Ainsi A(X) est un polyn? ome de degr´ e au plus h ? 1, et la formule u(X) = A(X) B(X) (2.3) montre que la s´ erie formelle est une s´ erie rationnelle. En d´ ecomposant la fraction rationnelle (2.3) en ´ el´ ements simples, on obtient une expression du type u(X) = r i=1 ni j=1 ?i,j (1 ? ?iX)j (rappelons que ni est la multiplicit´ e de la racine ?i). Comme 1 (1 ? ?X)j = ? n=0 n + j ? 1 j ? 1 ?n Xn le terme g´ en´ eral de la suite (un) est donn´ e par une expression de la forme un = r i=1 Pi(n)?n i (2.4) o` u Pi(X) = ni j=1 ?i,j X + j ? 1 j ? 1 (2.5) est un polyn? ome de degr´ e au plus ni ? 1 pour i = 1, . . . , r. La formule (2.4) est tr` es utile; c?est elle qui donne la forme close de un ; c?est aussi elle qui permet d?obtenir une estimation asymptotique lorsque la racine de plus grand module est unique et r´ eelle positive par exemple. Une expression (2.4) est appel´ ee un polyn? ome exponentiel. R´ eciproquement, tout polyn? ome Pi(X) de degr´ e ni s?´ ecrit sous la forme (2.5) parce que les polyn? omes X + j j = 1 j! (X + 1) · · ·(X + j) j ? 0 forment une base de l?espace des polyn? omes. Si le terme g´ en´ eral de la suite (un) est donn´ e par (2.4), on obtient donc une expression (2.3) puis une relation (2.1) pour la suite. Nous avons donc montr´ e qu?une suite r´ ecurrente a trois repr´ esentations ´ equivalentes : la relation de r´ ecurrence, l?expression comme fraction rationnelle de sa s´ erie g´ en´ eratrice, et l?expression close de ses termes sous forme de polyn? ome exponentiel. Exemple. Consid´ erons la suite tn = 3tn?1 + 4tn?2 n ? 2 t0 = 0, t1 = 1 Version 6 f´ evrier 2005 22 Chapitre 2. Evaluations Elle est d?ordre 2, son polyn? ome caract´ eristique est X2 ? 3X ? 4, et ses racines sont ?1 et 4. On obtient u(X) = X 1 ? 3X ? 4X2 = 1 5 1 1 ? 4X ? 1 1 + X d?o` u l?expression tn = 4n ? (?1)n 5 n ? 0 Exemple. La suite tn+3 = 5tn+2 ? 8tn+1 + 4tn n ? 0 t0 = 0, t1 = 1, t2 = 2 est d?ordre 3, et son polyn? ome caract´ eristique X3 ? 5X2 + 8X ? 4 a la racine simple 1 et la racine double 2. On obtient u(X) = X ? 3X2 1 ? 5X + 8X2 ? 4X3 = ? 2 1 ? X + 5/2 1 ? 2X ? 1/2 (1 ? 2X)2 En d´ eveloppant, ceci donne tn = 2n+1 ? n2n?1 ? 2 n ? 0 Notons que la m? eme relation de r´ ecurrence, avec les conditions initiales t0 = 1, t1 = 3, et t2 = 7, conduit ` a l?expression tn = 2n+1 ? 1. Ceci est d? u au fait que la fraction u(X) = 1 ? 2X 1 ? 5X + 8X2 ? 4X3 se simplifie, et que la suite (tn) est, dans ce cas, aussi solution d?une relation d?ordre 2. Exemple. L?exemple le plus populaire et sans doute aussi le plus ancien (il date de 1202) est la suite (Fn) de Fibonacci d´ efinie par Fn+2 = Fn+1 + Fn n ? 0 F0 = 0, F1 = 1 Le polyn? ome caract´ eristique X2 ? X ? 1 a les deux racines ? = 1 + ? 5 2 et ¯ ? = 1 ? ? 5 2 et sa s´ erie g´ en´ eratrice u(X) = X 1 ? X ? X2 = 1 ? 5 1 1 ? ?X ? 1 1 ? ¯ ?X Version 6 f´ evrier 2005 2.2. R´ ecurrences 23 donne l?expression Fn = 1 ? 5 (?n ? ¯ ?n ) n ? 0 Asymptotiquement, on a Fn ? 1 ? 5 ?n Comme exemple d?application, consid´ erons l?algorithme d?Euclidede calcul du pgcd de deux entiers positifs, non tous les deux nuls, par divisions successives : fonction pgcd(x, y); si y = 0 alors pgcd:= x sinon pgcd:=pgcd(y, x mod y) finsi. Notons n(x, y) le nombre de divisions avec reste effectu´ ees par l?algorithme. Alors n(x, y) = si y = 0 alors 0 sinon 1 + n(y, x mod y) Nous allons prouver que pour x > y ? 0, n(x, y) = k ? x ? Fk+2 (2.6) Pour k = 0, on a x ? 1 = F2, et pour k = 1, on a x ? 2 = F3. Supposons donc k ? 2, et consid´ erons les divisions euclidiennes x = qy + z, 0 ? z < y y = q z + u, 0 ? u < z On a n(y, z) = k ? 1, donc y ? Fk+1, et de m? eme z ? Fk, par cons´ equent x ? Fk+1 + Fk = Fk+2. Ceci prouve (2.6). Comme Fn ? 1 ? 5 (?n ? 1), on a ? 5x + 1 ? ?k+2 , donc pour x > y ? 0, n(x, y) ? log?(5x + 1) ? 2 Ce r´ esultat est le th´ eor` eme de Lam´ e. En particulier, n(x, y) = O(log x). Relations de r´ ecurrence ` a second membre Nous consid´ erons maintenant des suites (un)n?0 de nombres qui v´ erifient une relation du type suivant : un+h = ah?1un+h?1 + · · · + a0un + vn, n = 0, 1, 2, . . . a0 = 0 (2.7) Version 6 f´ evrier 2005 24 Chapitre 2. Evaluations o` u h est un entier positif et ah?1, . . . , a0 sont des nombres fix´ es, et o` u vn est une fonction de n. On peut r´ e´ ecrire (2.7) en un+h ? ah?1un+h?1 ? · · · ? a0un = vn, n ? 0, a0 = 0 ce qui explique le terme de relation de r´ ecurrence avec second membre. Comme dans le cas trait´ e plus haut, une telle suite est enti` erement d´ etermin´ ee par ses h premi` eres valeurs u0, . . . , uh?1. On dit que la suite est d?ordre h. Consid´ erons les s´ eries g´ en´ eratrices (formelles) des suites (un) et (vn) : u(X) = ? n=0 unXn v(X) = ? n=0 vnXn Les calculs faits pour les r´ ecurrences homog` enes conduisent cette fois-ci ` a l?ex- pression u(X) = A(X) + Xh v(X) B(X) (2.8) o` u comme plus haut B(X) = 1 ? ah?1X ? · · · ? a0Xh et A(X) = h?1 j=0 uj ? j i=1 ah?1?iuj?i Xj Calculer les polyn? omes A(X) et B(X) revient ` a r´ esoudre l?´ equation sans second membre, qui est ensuite corrig´ ee par la s´ erie v(X). Nous nous int´ eressons au cas particulier o` u la suite (vn) v´ erifie elle-m? eme une re- lation de r´ ecurrence. Dans ce cas, la s´ erie g´ en´ eratrice v est elle-m? eme une fraction rationnelle : v(X) = P(X) Q(X) pour des polyn? omes P et Q. L?´ equation (2.8) prend alors la forme u(X) = A(X)Q(X) + Xh P(X) B(X)Q(X) (2.9) ce qui montre que la s´ erie u est encore rationnelle. Exemple. Consid´ erons la suite (tn) d´ efinie par tn = 2tn?1 + 1 n ? 1 t0 = 0 La suite associ´ ee ` a l?´ equation homog` ene tn = 2tn?1, avec t0 = 0 est nulle. Donc A(X) = 0, B(X) = 1 ? 2X. Par ailleurs, v(X) = 1/(1 ? X), et u(X) = X (1 ? 2X)(1 ? X) Version 6 f´ evrier 2005 2.2. R´ ecurrences 25 En particulier, la suite (tn) v´ erifie la relation de r´ ecurrence tn+2 = 3tn+1 ? 2tn, et bien entendu tn = 2n ? 1. Une autre fa¸ con de r´ esoudre (2.7) lorsque la suite vn est une suite r´ ecurrente lin´ eaire, est de substituer cette relation de r´ ecurrence. Si vn+k = b1vn+k?1 + · · · + bkvn n ? 0 alors pour n ? 0 un+h+k = h i=1 aiun+h+k?i + k j=1 bj un+h+j ? h i=1 aiun+h?i+k?j ce qui, apr` es r´ earrangement, donne une relation de r´ ecurrence explicite pour (un). Exemple. Consid´ erons la suite tn+1 ? 2tn = n + 2n n ? 1 t0 = 0 La suite vn = n + 2n v´ erifie la relation vn+3 = 4vn+2 ? 5vn+1 + 2vn, d?o` u tn+4 ? 2tn+3 = 4(tn+3 ? 2tn+2) ? 5(tn+2 ? 2tn+1) + 2(tn+1 ? 2tn) et finalement tn+4 = 6tn+3 ? 7tn+2 ? 2tn Exemple. La fonction r´ ecursive de calcul des nombres de Fibonacci est souvent utilis´ ee pour tester l?efficacit´ e de compilateurs ou d?interpr` etes. Elle s?´ ecrit : fonction Fibonacci(n); si n = 0 ou n = 1 alors Fibonacci := n sinon Fibonacci := Fibonacci(n ? 1)+Fibonacci(n ? 2) finsi. Notons rn le nombre d?appels de Fibonacci pour le calcul du nombre Fn. On a rn = 1 + rn?1 + rn?2 n ? 2 r0 = r1 = 1 On trouve sans peine que rn = 2Fn+1 ? 1 = ?(?n ) Version 6 f´ evrier 2005 26 Chapitre 2. Evaluations donc que le temps d?ex´ ecution est proportionnel ` a la valeur calcul´ ee. Ceci n?est pas ´ etonnant puisque la proc´ edure forme le r´ esultat en additionnant des 0 et des 1. Exemple. Parfois, on peut se ramener ` a des r´ ecurrences lin´ eaires par un change- ment de variables, ou un changement de valeurs (remplacer une fonction par son logarithme par exemple). Consid´ erons la fonction t d´ efinie sur les entiers qui sont des puissances de 2 par t(1) = 6 t(n) = n(t(n/2))2 n > 1 puissance de 2 On peut v´ erifier directement que t(n) = 23n?2 3n /n; pour trouver cette formule, on fait d?abord un changement de variable en posant s(k) = t(2k ) pour k ? 0, d?o` u la relation s(0) = 6 s(k) = 2k (s(k ? 1))2 Ensuite, on pose uk = log2 s(k), et on obtient la relation de r´ ecurrence lin´ eaire u0 = log 6 uk = k + 2uk?1 Cette derni` ere se r´ esout par les m´ ethodes indiqu´ ees ci-dessus, et donne uk = 2k u0 + 2k+1 ? k ? 2 d?o` u en reportant : s(k) = 2uk = 62k 22k+1 2?k?2 et le r´ esultat, et posant n = 2k . 2.2.2 R´ ecurrences diverses Voici quelques techniques permettant de r´ esoudre certaines relations de r´ ecur- rences qui ne sont pas de la forme pr´ ec´ edente. M´ ethode des facteurs sommants La m´ ethode des facteurs sommants permet de traiter des suites (un) d´ efinies par une relation de r´ ecurrence lin´ eaire d?ordre 1, de la forme anun = bnun?1 + cn n ? 1 o` u an, bn, cn sont des fonctions de n. On pose alors fn = a1 · · · an?1 b1 · · · bn n ? 1 Version 6 f´ evrier 2005 2.2. R´ ecurrences 27 avec f1 = 1/b1. On a fnan = fn+1bn+1. En posant yn = fnanun la relation se r´ e´ ecrit yn = yn?1 + fncn Cette relation se r´ esout imm´ ediatement en yn = y0 + n i=1 fici et on obtient, pour un, l?expression un = u0 + n i=1 fici anfn Exemple. Consid´ erons la suite (un) d´ efinie par u0 = a un = bnk + nun?1 n > 1 o` u a et b sont des r´ eels, et k ? N. Les formules pr´ ec´ edentes s?appliquent avec cn = bnk , an = 1, bn = n, d?o` u fn = 1/n! et un = n! a + b n i=1 ik i! Maintenant, la s´ erie de terme g´ en´ eral ik /i! converge, et le nombre Bk = 1 e ? i=1 ik i! est le k-i` eme nombre de Bell. On a donc un ? n!(a + beBk) Changement de valeurs Dans certaines situations, on peut remplacer la fonction ` a ´ evaluer par son loga- rithme, et obtenir une expression plus simple pour la relation de r´ ecurrence. Exemple. Le nombre de fonctions bool´ eennes ` a n variables bool´ eennes est donn´ e par t(1) = 4 t(n) = (t(n ? 1))2 n > 1 Version 6 f´ evrier 2005 28 Chapitre 2. Evaluations Posons un = log t(n). On a alors u1 = 2 un = 2un?1 n > 1 d?o` u un = 2n et t(n) = 22n . Voici un exemple o` u le m? eme proc´ ed´ e est appliqu´ e, mais o` u les calculs sont beau- coup plus compliqu´ es. Exemple. Le nombre d?arbres binaires de hauteur strictement inf´ erieure ` a n est donn´ e par x0 = 1 xn+1 = x2 n + 1 n ? 0 L?arbre vide est de hauteur ?1. Nous allons montrer qu?il existe une constante Figure 2.1: Les arbres binaires de hauteur ?1 ? h ? 2. k telle que xn = k2n . Posons pour cela yn = ln xn. On a yn+1 = 2yn + ?n avec ?n = ln 1 + 1 x2 n On en d´ eduit l?expression yn = 2n ?0 2 + · · · + ?n?1 2n Posons Yn = 2n ? i=0 ?i 2i+1 , rn = Yn ? yn Version 6 f´ evrier 2005 2.2. R´ ecurrences 29 Comme la suite (xn) est croissante, et donc la suite (?n) est d´ ecroissante, on a l?estimation suivante pour rn : rn = Yn ? yn = 2n ? i=n ?i 2i+1 ? ?n ? i=0 1 2i+1 ? ?n Si l?on d´ efinit le nombre k par k = exp ? i=0 ?i 2i+1 on a Yn = 2n ln k, donc xn = eyn = eYn?rn = k2n e?rn et il ne reste plus qu?` a utiliser la majoration pour rn : xn ? k2n = xnern ? xne?n = xn 1 + 1 x2 n = xn + 1 xn < xn + 1 pour n > 1, d?o` u xn = k2n Evidemment, l?expression de k n?est pas facile ` a ´ evaluer... 2.2.3 R´ ecurrences de partitions Les relations de r´ ecurrence que nous consid´ erons maintenant sont de la forme : t(n0) = d t(n) = at(n/b) + f(n) n > n0 On les rencontre naturellement lorsque l?on cherche un algorithme r´ ecursif pour r´ esoudre un probl` eme de taille n par la m´ ethode des sous-probl` emes ( diviser pour r´ egner ) : on remplace le probl` eme par a sous-probl` emes, chacun de taille n/b. Si t(n) est le co? ut de l?algorithme pour la taille n, il se compose donc de at(n/b) plus le temps f(n) pour recomposer les solutions des probl` emes partiels en une solution du probl` eme total. Dans de nombreux cas, les ´ equations ci-dessus sont en fait des in´ equations. Le co? ut ?(n) v´ erifie ?(n0) = d ?(n) ? a?(n/b) + f(n) n > n0 Il en r´ esulte que ?(n) ? t(n) pour tout n, et donc que la fonction t constitue une majoration du co? ut de l?algorithme. Avant de continuer, un exemple. Exemple. Soit ` a calculer le produit de deux entiers u, v v´ erifiant 0 ? u, v < 22n pour un entier n. On peut donc ´ ecrire u et v en binaire sur 2n bits. Posons u = 2n U1 + U0, v = 2n V1 + V0 Version 6 f´ evrier 2005 30 Chapitre 2. Evaluations avec 0 ? U0, U1, V0, V1 < 2n . Ainsi U1 est form´ e des n bits de plus fort poids de u, etc. On a uv = (22n + 2n )U1V1 + 2n (U1 ? U0)(V0 ? V1) + (2n + 1)U0V0 Cette formule montre que l?on peut d´ ecomposer le probl` eme de la multiplication de deux nombres ` a 2n bits en 3 multiplications de nombres ` a n bits, ` a savoir U1V1, (U1 ? U0)(V0 ? V1), U0V0, et quelques additions et d´ ecalages. On a donc ramen´ e un probl` eme de taille 2n en 3 sous-probl` emes de taille n (a = 3, b = 2 dans les formules ci-dessus). Soit t(n) le temps requis pour multiplier deux nombres ` a n bits par cette m´ ethode. Alors t(2n) = 3t(n) + cn, t(1) = 1 pour une constante c, puisque les d´ ecalages et l?addition prennent un temps lin´ eaire en n. Il r´ esulte de la proposition ci-dessous que t(n) = ?(nlog2 3 ). Un grand nombre de situations rencontr´ ees dans l?analyse d?algorithmes sont couvertes par l?´ enonc´ e que voici : Proposition 2.1. Soit t : N ? R+ une fonction croissante au sens large ` a partir d?un certain rang, telle qu?il existe des entiers n0 ? 1, b ? 2 et des r´ eels k ? 0, a > 0, c > 0 et d > 0 pour lesquels t(n0) = d t(n) = at(n/b) + cnk n > n0, n/n0 puissance de b (2.10) Alors on a t(n) = ? ? ? ?(nk ) si a < bk ?(nk logb n) si a = bk ?(nlogb a ) si a > bk (2.11) Preuve. Soit d?abord n = n0bp pour un entier p. Alors t(n) = dap p?1 i=0 cai n/bi k = ?(n) + cnk ?(n) avec ?(n) = dap = ?(nlogb a ) et ?(n) = p?1 i=0 a/bk i parce que ap = nlogb a /alogb n0 . Or ?(n) ? 1 1 ? a/bk si a/bk < 1 ?(n) = p ? logb n si a/bk = 1 ?(n) ? ? ap bkp si a/bk > 1 Version 6 f´ evrier 2005 2.2. R´ ecurrences 31 avec ? = 1/(a/bk ? 1). Les deux premi` eres formules s?en d´ eduisent. Si a > bk , on a cnk ?(n) ? ?cnk 0ap = ?(nlogb a ) D?o` u le r´ esultat. Soit maintenant n assez grand, et soit p tel que n0bp < n ? n0bp+1 . Posons n? = n0bp et n+ = n0bp+1 = bn?. Comme t(n?) ? t(n) ? t(n+), et que f(bn) = ?(f(n)) pour chacune des trois fonctions f intervenant au second membre de (2.11), on a t(n) = ?(f(n)). Voici quelques applications de ces formules dans le cas le plus fr´ equent, o` u b = 2 et n0 = 1 : Exemple. Soit t une fonction croissante qui v´ erifie t(1) = 1. Si pour n > 1, puissance de 2, on a t(n) = t(n/2) + c alors t(n) = ?(log n) (a = 1, k = 0) t(n) = 2t(n/2) + cn alors t(n) = ?(n log n) (a = 2, k = 1) t(n) = 2t(n/2) + cn2 alors t(n) = ?(n2 ) (a = 2, k = 2) t(n) = 4t(n/2) + cn2 alors t(n) = ?(n2 log n) (a = 4, k = 2) t(n) = 7t(n/2) + cn2 alors t(n) = ?(nlog 7 ) (a = 7, k = 2) Remarque. Parfois, l?analyse d?un algorithme ne permet pas d?obtenir une information aussi pr´ ecise que celle de l?´ equation (2.10). Si, dans cette ´ equation, on remplace le terme cnk par O(nk ), la m? eme conclusion reste vraie, en rempla¸ cant dans (2.11) les ? par des O. Exemple. Soit t une fonction croissante au sens large et v´ erifiant t(1) = 1 t(n) = 2t(n/2) + log n n > 1 et puissance de 2 Comme log n = O(n), on a t(n) = O(n log n). En fait, on peut montrer que t(n) = ?(n) (voir ci-dessous). Proposition 2.2. Soit t : N ? R+ une fonction croissante au sens large ` a partir d?un certain rang, telle qu?il existe des entiers n0 ? 1, b ? 2 et des r´ eels a > 0, et d > 0 et une fonction f : N ? R+pour lesquels t(n0) = d t(n) = at(n/b) + f(n) n > n0, n/n0 une puissance de b Supposons de plus que f(n) = cnk (logb n)q Version 6 f´ evrier 2005 32 Chapitre 2. Evaluations pour des r´ eels c > 0, k ? 0 et q. Alors t(n) = ? ? ? ? ? ? ? ? ? ? ? ?(nk ) si a < bk et q = 0 ?(nk (logb n)1+q ) si a = bk et q > ?1 ?(nk log logb n) si a = bk et q = ?1 ?(nlogb a ) si a = bk et q < ?1 ?(nlogb a ) si a > bk Preuve. Proc´ edons comme dans la d´ emonstration du r´ esultat pr´ ec´ edent. Soit d?abord n = n0bp pour un entier p. Alors t(n) = dap + p?1 i=0 ai f(n/bi ) = dap + p?1 i=0 ai f(n0bp?i ) = dap + p i=1 ap?i f(n0bi ) = dap + c p i=1 ap?i (n0bi )k (logb n0bi )q = dap + cnk 0ap p i=1 bk /a i (logb n0 + i)q et comme ap = ?(nlogb a ), on a t(n) = ?(nlogb a ?(n)), o` u ?(n) = p i=1 hi (r + i)q avec h = bk /a et r = logb n0. Si h = 1, alors ?(n) = p i=1 (r + i)q = ? ? ? ?(p1+q ) = ?(logb n1+q ) si q > ?1 ?(logb p) = ?(logb logb n) si q = ?1 ?(1) si q < ?1 Si h < 1, alors ?(n) = ?(1). Enfin, si h > 1 et q = 0, alors ?(n) = ?(nk /nlogb a ). D?o` u le r´ esultat. Exemple. Si la fonction t v´ erifie, pour tout n puissance de 2, t(n) = 2t(n/2) + log n alors t(n) = ?(n) (h = 1/2, k = 0, q = 1) t(n) = 3t(n/2) + n log n alors t(n) = ?(nlog 3 ) (h = 2/3, k = q = 1) t(n) = 2t(n/2) + n log n alors t(n) = ?(n log2 n) (h = 1, k = q = 1) t(n) = 5t(n/2) + (n log n)2 alors t(n) = ?(nlog 5 ) (h = 4/5, k = q = 2) Exemple. Soit t une fonction v´ erifiant t(1) = a t(n) = t( n/2 ) + t( n/2 ) + bn n > 1 Version 6 f´ evrier 2005 2.2. R´ ecurrences 33 Clairement, t est croissante, et comme t(n) = 2t(n/2) + bn lorsque n est une puissance de 2, on a t(n) = ?(n log n). Certaines d´ efinitions r´ ecurrentes de ce type peuvent ? etre r´ esolues de mani` ere compl` ete (voir exercices). Proposition 2.3. Soient ?1, · · · , ?k des fonctions de N dans lui-m? eme telles qu?il existe un nombre r´ eel 0 < K < 1 avec ?1(n) + · · · + ?k(n) ? Kn (n > n0) Si une fonction t v´ erifie t(n) = a0 n ? n0 t(?1(n)) + · · · + t(?k(n)) + bn n > n0 alors t(n) = O(n). Preuve. Nous allons montrer que t(n) ? Dn + a0 avec D = (b + (k ? 1)a0)/(1 ? K) Cette in´ egalit´ e est ´ evidemment v´ erifi´ ee pour n ? n0. Si n > n0, alors t(n) = t(?1(n)) + · · · + t(?k(n)) + bn ? ka0 + D(?1(n) + · · · + ?k(n)) + bn ? ka0 + DKn + bn Or ka0 + DKn + bn ? Dn + a0 si, et seulement si (k ? 1)a0 + bn ? D(1 ? K)n, et cette derni` ere in´ egalit´ e est satisfaite par l?expression donn´ ee pour D. Exemple. Consid´ erons la fonction d´ efinie par t(n) = a n ? n0 t( n/5 ) + t( 7n/10 ) + bn n > n0 On a ici ?1(n) = n/5 et ?2(n) = 7n/10 , et ?1(n) + ?2(n) ? 9n/10 Donc t(n) = O(n). 2.2.4 R´ ecurrences compl` etes Il s?agit de suites (un) d´ efinies par des relations de r´ ecurrences portant sur toute la suite, plus pr´ ecis´ ement o` u un est d´ efini en fonction de tous les uk, pour k < n. Exemple. Les relations de r´ ecurrence tn = cn + 2 n n?1 k=0 tk ou tn = n + max 1?k<n k?1 i=1 tn?i + n?1 i=k ti Version 6 f´ evrier 2005 34 Chapitre 2. Evaluations sont des relations de r´ ecurrence compl` etes. Consid´ erons la suite (tn) v´ erifiant la relation de r´ ecurrence tn = hn + 2 n n?1 k=0 tk pour n ? 1, et t0 = 0. Dans une premi` ere ´ etape, nous allons remplacer cette relation de r´ ecurrence par une relation plus simple. Pour cela, observons que n(tn ? hn) = 2 n?1 k=0 tk On soustrait de cette ´ equation la m? eme ´ equation pour n ? 1, ce qui donne n(tn ? hn) ? (n ? 1)(tn?1 ? hn?1) = 2tn?1 ou encore ntn = (n + 1)tn?1 + gn en posant gn = nhn ? (n ? 1)hn?1. Dans une deuxi` eme ´ etape, on applique la m´ ethode des facteurs sommants. On a tn = 1 nfn t0 + n k=1 fkgk avec fn = (n ? 1)! (n + 1)! = 1 n(n + 1) d?o` u tn = (n + 1) n k=1 gk k(k + 1) Consid´ erons maintenant le cas particulier, qui intervient dans l?analyse du tri rapide (voir chapitre 5), o` u h0 = h1 = 0 hk = k + 1 (k ? 2) On a alors g0 = 0, g1 = 6 gk = 2k (k ? 2) et par cons´ equent n k=1 gk k(k + 1) = 1 + n k=3 2k k(k + 1) = 1 + 2 n k=4 1 k = 1 + 2(Hn+1 ? 1 ? 1 2 ? 1 3 ) = 2(Hn+1 ? 4 3 ) o` u Hn est le n-i` eme nombre harmonique. Il en r´ esulte que tn = 2(n + 1)(Hn+1 ? 4 3 ) Version 6 f´ evrier 2005 Notes 35 Notes L?analyse d?algorithmes fait fr´ equemment appel ` a des outils math´ ematiques bien plus sophistiqu´ es que ceux pr´ esent´ es ici. En plus du trait´ e de Knuth D. E. Knuth, The Art of Computer Programming, Vol I?III, Addison-Wesley, 1968?1973, on peut consulter, pour un bonne introduction et des compl´ ements, R. Graham, D. E. Knuth, O. Patashnik, Concrete Mathematics, Addison-Wesley, 1989, D. H. Greene, D. E. Knuth, Mathematics for the Analysis of Algorithms, Birk- h¨ auser, 1982. Nous avons adopt´ e la terminologie de C. Froidevaux, M. C. Gaudel, M. Soria, Types de donn´ ees et algorithmes, Mc- Graw-Hill, 1990. Exercices 2.1. Donner une expression simple pour la fonction t d´ efinie sur les entiers de la forme n = 22k par t(2) = 1 t(n) = 2t( ? n) + log n n ? 4 2.2. Montrer que, quels que soient les entiers positifs n et d, on a d k=0 2k log(n/2k ) = 2d+1 log n 2d?1 ? 2 ? log n En d´ eduire que n i=1 log(n/i) ? 5n 2.3. Montrer que la fonction t d´ efinie par t(1) = 0 t(n) = t( n/2 ) + t( n/2 ) + n n > 2 est t(n) = n log n + 2n ? 21+ log n . 2.4. Montrer que la fonction t d´ efinie par t(1) = 0 t(n) = t( n/2 ) + t( n/2 ) + n ? 1 n > 2 Version 6 f´ evrier 2005 36 Chapitre 2. Evaluations est t(n) = n log n + 1 ? 2 log n . 2.5. Montrer que n i=1 log i = 2 + (n + 1) log n ? 21+ log n 2.6. Donner l?expression exacte de la fonction t d´ efinie par t(1) = 0, t(2) = 2 t(n) = t( n/2 ? 1) + t( n/2 ) + t(1 + n/2 ) + n n > 2 2.7. Montrer que pour t(1) = a t(n) = t( n/2 ) + t( n/2 ) + t(1 + n/2 ) + bn n > 1 on a t(n) = ?(nlog 3 ). 2.8. Donner une expression pour la fonction t d´ efinie sur les entiers naturels par t(n) = 0 n = 0 1 + t(n ? 1) n impair 1 + t(n/2) n pair 2.9. Montrer que la suite (tn) d´ efinie par t1 = 1 et tn = n + max 1?k<n k?1 i=1 tn?i + n?1 i=k ti v´ erifie tn ? 4n. 2.10. On consid` ere la suite (tn) d´ efinie par t0 = 1/4 tn = 1 4 ? tn?1 n > 0 Montrer que tn = un/un+1, o` u (un) est une suite r´ ecurrente lin´ eaire d?ordre 2; donner son expression close. Quelle est la limite de tn lorsque n tend vers l?infini? 2.11. Montrer que la suite d´ efinie par t(n + 2) = 1 + t(n + 1) t(n) n ? 2 t(0) = a, t(1) = b est p´ eriodique. Version 6 f´ evrier 2005 37 Chapitre 3 Structures de donn´ ees Dans ce chapitre, nous passons en revue les structures de donn´ ees ´ el´ ementaires, ` a savoir les piles, les files, les listes, ainsi que les arbres binaires et les arbres binaires de recherche. Nous d´ ecrivons ensuite les files de priorit´ e et leur impl´ ementation au moyen de tas. La derni` ere section traite du probl` eme de la gestion efficace d?une partition. 3.1 Types de donn´ ees et structures de donn´ ees Dans un langage de programmation comme Pascal, les objets sont d´ eclar´ es avec leur type. Les types constituent une description du format de repr´ esentation in- terne des donn´ ees en machine, et ils sont par l` a-m? eme un outil d?abstraction, puisqu?ils lib` erent le programmeur du souci de la repr´ esentation physique des donn´ ees. Ainsi, il n?est pas n´ ecessaire de savoir comment est repr´ esent´ ee une variable de type char ou boolean, voire string, du moment que l?on sait la manipuler de la mani` ere convenue. Les types pr´ ed´ efinis sont peu nombreux. C?est pourquoi des constructeurs de types permettent de d´ efinir des types plus complexes, et donc des structures de donn´ ees moins ´ el´ ementaires. L` a encore, l?impl´ ementation pr´ ecise d?un array of char par exemple importe peu au programmeur (est-il rang´ e par ligne, par colonne?), aussi longtemps que sa manipulation satisfait ` a des r` egles pr´ ecises. En revanche, lorsque l?on veut r´ ealiser une pile ? disons de caract` eres ? , les probl` emes se posent autrement, puisqu?il n?existe pas, en Pascal par exemple, de constructeur permet- tant de d´ efinir des stack of char : il est n´ ecessaire de recourir ` a une structure de donn´ ees. Une structure de donn´ ees est l?impl´ ementation explicite d?un ensemble organis´ e d?objets, avec la r´ ealisation des op´ erations d?acc` es, de construction et de modifi- cation aff´ erentes. Version 6 f´ evrier 2005 38 Chapitre 3. Structures de donn´ ees Un type de donn´ ees abstrait est la description d?un ensemble organis´ e d?objets et des op´ erations de manipulation sur cet ensemble. Ces op´ erations comprennent les moyens d?acc´ eder aux ´ el´ ements de l?ensemble, et aussi, lorsque l?objet est dynamique, les possibilit´ es de le modifier. Plus formellement, on peut donner une d´ efinition math´ ematique d?un type abstrait : c?est une structure alg´ ebrique, form´ ee d?un ou de plusieurs ensembles, munis d?op´ erations v´ erifiant un ensemble d?axiomes. Avec ces d´ efinitions, une structure de donn´ ees est la r´ ealisation, l?impl´ ementation explicite d?un type de donn´ ees. D´ ecrire un type de donn´ ees, le sp´ ecifier comme on dit, c?est d´ ecrire les op´ erations possibles et licites, et leur effet. D´ ecrire une struc- ture de donn´ ees, c?est expliciter comment les objets sont repr´ esent´ es et comment les op´ erations sont impl´ ement´ ees. Pour l?´ evaluation d?algorithmes, il importe de plus de conna? ?tre leur co? ut en temps et en place. Du point de vue des op´ erations, un type abstrait est ` a un type de base d?un langage de programmation ce que l?en-t? ete de proc´ edure est ` a un op´ erateur. La proc´ edure r´ ealise une op´ eration qui n?est pas ´ el´ ementaire au sens du langage de programmation; de la m? eme mani` ere, un type de donn´ ees abstrait propose une organisation qui n?est pas offerte par le langage. Une r´ ealisation du type abstrait, c?est-` a-dire une impl´ ementation par une structure de donn´ ees, correspond alors ` a l?´ ecriture du corps d?une proc´ edure. Le concept de type abstrait ne d´ epend pas du langage de programmation con- sid´ er´ e, et on peut se livrer ` a l?exercice (un peu st´ erile) de d´ efinir abstraitement les bool´ eens, les r´ eels, etc. En revanche, l?´ eventail des types concrets varie d?un lan- gage de programmation ` a un autre. Ainsi, les piles existent dans certains langages de programmations, les tableaux ou les cha? ?nes de caract` eres dans d?autres. On peut ´ egalement consid´ erer un type abstrait comme une bo? ?te noire qui r´ ealise certaines op´ erations selon des conventions explicites. Cette vision correspond ` a un style de programmation que l?on pourrait appeler la programmation disciplin´ ee. Le programmeur convient d?acc´ eder ` a la r´ ealisation d?un type de donn´ ees unique- ment ` a travers un ensemble limit´ e de proc´ edures et de fonctions, et s?interdit notamment tout acc` es direct ` a la structure qui serait rendue possible par une connaissance pr´ ecise de l?impl´ ementation particuli` ere. De nombreux langages de programmation facilitent ce comportement par la possibilit´ e de cr´ eer des modules ou unit´ es s´ epar´ es. Lorsqu?un type de donn´ ees est impl´ ement´ e, on peut se servir de ses op´ erations comme op´ erations ´ el´ ementaires, et en particulier les utiliser dans l?impl´ ementation de types de donn´ ees plus complexes. Ceci conduit ` a une hi´ erarchie de types, o` u l?on trouve, tout en bas de l?´ echelle, des types ´ el´ ementaires comme les bool´ eens, entiers, r´ eels, tableaux, ` a un deuxi` eme niveau les piles, files, listes, arbres, puis les files de priorit´ es, dictionnaires, graphes. La r´ ealisation efficace de types de donn´ ees par des structures de donn´ ees qui impl´ ementent les op´ erations de mani` ere optimale en temps et en place constitue Version 6 f´ evrier 2005 3.2. Les structures lin´ eaires 39 l?une des pr´ eoccupations de l?algorithmique. Le temps requis par une op´ eration de manipulation d?un type s?exprime en fonction du temps requis par les op´ erations intervenant dans sa r´ ealisation. Ces op´ erations elles-m? emes sont peut-? etre com- plexes, et impl´ ement´ ees dans une autre structure de donn´ ees. En descendant la hi´ erarchie, on arrive ` a des op´ erations ´ el´ ementaires (op´ erations arithm´ etiques ou tests sur des types ´ el´ ementaires, affectation de scalaires) dont le temps d?ex´ ecution est consid´ er´ e, par convention, comme constant, et ceci quel que soit le langage de programmation utilis´ e. Pour les types de donn´ ees abstraits les plus simples, plusieurs r´ ealisations efficaces sont faciles ` a obtenir et ` a d´ ecrire. Il en est ainsi des piles, des files, des listes, et dans une moindre mesure des dictionnaires et des files de priorit´ es, qui sont des ensembles munis de fonctions d?acc` es sp´ ecifiques. La r´ ealisation d?arbres ayant de bons comportements (arbres 2?4, bicolores, persistants, voir chapitre 6) requiert en revanche un soin certain. 3.2 Les structures lin´ eaires Une liste lin´ eairesur un ensemble E est une suite finie (e1, . . . , en) d?´ el´ ements de E. La liste est vide si n = 0. Les ´ el´ ements de la suite sont soit accessibles directement, par leur indice, soit indirectement, quand la liste est repr´ esent´ ee par une suite d?objets cha? ?n´ es. Dans les impl´ ementations, un indice est repr´ esent´ e par une place, et on acc` ede ` a l?´ el´ ement de E qui figure ` a cette place par une fonction particuli` ere appel´ ee contenu (ou parfois cl´ e) (voir figure 2.1). Cette repr´ esentation e p e e e 1 2 p n Figure 2.1: Une liste et une place. s´ epare proprement la position d?un ´ el´ ement dans la liste de l?´ el´ ement lui-m? eme. De plus, elle permet de d´ efinir, sur une place, d?autres fonctions, comme la fonction successeur qui donne la place suivante. On consid` ere dans cette section plusieurs variantes des listes lin´ eaires et quel- ques impl´ ementations usuelles. Dans une liste, on distingue deux c? ot´ es, le d´ ebut et la fin, et les op´ erations de manipulation peuvent se faire de chacun des deux c? ot´ es. Selon la nature des op´ erations autoris´ ees, on d´ efinit des listes plus ou moins contraintes. Les piles sont des listes o` u l?insertion et la suppression ne se font que d?un seul et m? eme c? ot´ e. Les files permettent l?insertion d?un c? ot´ e, et la suppression de l?autre. Les files bilat` eres permettent les insertions et suppressions des deux c? ot´ es; enfin, les listes ou listes point´ ees autorisent des insertions et suppressions Version 6 f´ evrier 2005 40 Chapitre 3. Structures de donn´ ees aussi ` a l? int´ erieur de la liste et pas seulement aux extr´ emit´ es. De mani` ere tr` es parlante, une pile est appel´ ee dans la terminologie anglo-saxonne une structure LIFO ( last-in first-out ) et une file une structure FIFO ( first-in first-out ). 3.2.1 Piles Une pile est une liste lin´ eaire o` u les insertions et suppressions se font toutes du m? eme c? ot´ e. Les noms sp´ ecifiques pour ces op´ erations sont empiler pour ins´ erer et d´ epiler pour supprimer. Si la pile n?est pas vide, l?´ el´ ement accessible est le sommet de la pile. La propri´ et´ e fondamentale d?une pile est que la suppression annule l?effet d?une insertion : si on empile un ´ el´ ement, puis on d´ epile, on retrouve la pile dans l?´ etat de d´ epart. Les op´ erations sur une pile dont les ´ el´ ements sont de type ´ el´ ement sont les suivantes : pilevide(p : pile); Cr´ ee une pile vide p. sommet(p : pile) : ´ el´ ement; Renvoie l?´ el´ ement au sommet de la pile p; bien s? ur, p doit ? etre non vide. empiler(x : ´ el´ ement; p : pile); Ins` ere x au sommet de la pile p. d´ epiler(p : pile); Supprime l?´ el´ ement au sommet de la pile p; la pile doit ? etre non vide. est-pilevide(p : pile) : bool´ een; Teste si la pile p est vide. Avant de discuter les impl´ ementations, donnons un exemple d?utilisation de ce type. Exemple. Le tri par insertion d?une suite (x1, . . . , xn) fonctionne comme suit : si n = 0, la suite est tri´ ee; sinon, on trie (x1, . . . , xn?1) en une suite croissante, puis on ins` ere xn dans cette suite en le comparant successivement aux ´ el´ ements de la suite. Plus pr´ ecis´ ement, l?insertion de x dans une suite L = (y1, . . . , ym) se fait par comparaison : ? si L est vide, le r´ esultat est (x); sinon ? si x < y1, le r´ esultat est (x, y1, . . . , ym); sinon ? le r´ esultat est compos´ e de y1 et du r´ esultat de l?insertion de x dans (y2, . . . , ym). En repr´ esentant une suite tri´ ee par une pile, voici comment r´ ealiser le tri par insertion : Version 6 f´ evrier 2005 3.2. Les structures lin´ eaires 41 proc´ edure Tri-par-insertion(n, L); pilevide(L); pour i de 1 ` a n faire Ins´ erer(xi, L); pour i de 1 ` a n faire xi :=sommet(L); d´ epiler(L) finpour. avec proc´ edure Ins´ erer(x, L); si est-pilevide(L) oualors x <sommet(L) alors empiler(x, L) sinon y :=sommet(L); d´ epiler(L); Ins´ erer(x, L); empiler(y, L) finsi; retourner(L). (L?op´ erateur oualors est un ou s´ equentiel : la deuxi` eme partie du test n?est ´ evalu´ ee que si la premi` ere rend la valeur faux. Voir aussi chapitre 1.) La proc´ edure d?insertion demande un nombre d?op´ erations proportionnel ` a la longueur de L, et la r´ ealisation du tri par insertion est donc en O(n2 ) op´ erations. L?impl´ ementation la plus r´ epandue d?une pile utilise un tableau p et un indice sp (indice de sommet de pile). L?indice indique l?emplacement du sommet de pile (une variante consiste ` a d´ esigner le premier emplacement vide). Avec ces structures, l?impl´ ementation des op´ erations est la suivante : ? pilevide(p) se r´ ealise par sp := 0; ? sommet(p) est : p[sp]; ? empiler(x, p) se r´ ealise par sp := sp + 1; p[sp] := x; ? d´ epiler(p) se r´ ealise par sp := sp ? 1; ? est-pilevide(p) est : sp = 0?. En toute rigueur, un test de d´ ebordement est n´ ecessaire dans la proc´ edure em- piler, pour ´ eviter de d´ epasser les bornes du tableau p. e1 e2 en Figure 2.2: Un pile repr´ esent´ ee par une liste cha? ?n´ ee. Version 6 f´ evrier 2005 42 Chapitre 3. Structures de donn´ ees L?impl´ ementation par liste simplement cha? ?n´ ee est s´ eduisante parce qu?elle permet une grande souplesse. Une pile est alors r´ ealis´ ee par un pointeur vers un couple form´ e de l?´ el´ ement au sommet de pile, et d?un pointeur vers le couple suivant (voir figure 2.2). En Lisp par exemple, les op´ erations s?impl´ ementent comme suit : ? pilevide(p) se r´ ealise par (setq p nil); ? sommet(p) est (car p); ? empiler(x, p) se r´ ealise par (setq p (cons x p)); ? d´ epiler(p) se r´ ealise par (setq p (cdr p)); ? est-pilevide(p) est (equal p nil). Chacune de ces op´ erations demande un temps constant. 3.2.2 Files Une file est une liste lin´ eaire o` u les insertions se font toutes d?un m? eme c? ot´ e et les suppressions toutes de l?autre c? ot´ e. Les noms sp´ ecifiques pour ces op´ erations sont enfiler pour ins´ erer et d´ efiler pour supprimer. Les op´ erations sur les files sont syntaxiquement les m? emes que sur les piles; c?est par leur effet qu?elles diff` erent : l?´ el´ ement supprim´ e est le premier arriv´ e dans la file. Ainsi, une file se comporte donc comme une file d?attente; on dit aussi queue, en anglais first- in first-out (FIFO). Les op´ erations sur une file dont les ´ el´ ements sont de type ´ el´ ement sont les suivantes : filevide(f : file); Cr´ ee une file vide f. t? ete(f : file) : ´ el´ ement; Renvoie l?´ el´ ement en t? ete de la file f ; bien s? ur, f doit ? etre non vide. enfiler(x : ´ el´ ement; f : file); Ins` ere x ` a la fin de la file f. d´ efiler(f : file); Supprime l?´ el´ ement en t? ete de la file f ; la file doit ? etre non vide. est-filevide(f : file) : bool´ een; Teste si la file f est vide. Deux impl´ ementations des files sont courantes : l?une par un tableau avec deux variables d?indices, repr´ esentant respectivement le d´ ebut et la fin de la file, l?autre par une liste circulaire. L?impl´ ementation par tableau est simple, et utile quand on sait borner a priori le nombre d?insertions, comme cela se pr´ esente souvent dans des algorithmes sur les graphes. L?impl´ ementation par liste circulaire est plus souple, mais un peu plus complexe (voir figure 2.3). Dans cette impl´ ementation, une file est rep´ er´ ee par un pointeur sur sa derni` ere place (si la file est vide, le pointeur vaut nil). La t? ete de la file est donc l?´ el´ ement suivant, et peut ? etre facilement supprim´ ee; de m? eme, l?insertion en fin de file se fait facilement. Version 6 f´ evrier 2005 3.2. Les structures lin´ eaires 43 c a b c e a b d a c e d tête pointeur Figure 2.3: La file (c, a, b, c, c, a, b, d, a, c, c, d). Dans la r´ ealisation ci-dessous, on utilise les types suivants : TYPE file = ^bloc; bloc = RECORD cont: element; suiv: file END; Le type ´ el´ ement est suppos´ e connu. Les en-t? etes de proc´ edure sont : PROCEDURE filevide (VAR f : file); FUNCTION est filevide (f : file): boolean; PROCEDURE enfiler (x: element; VAR f : file); PROCEDURE defiler (VAR f : file); FUNCTION tete (f : file): element; La r´ ealisation fait en plus appel ` a une fonction faireplace qui cr´ ee un bloc suppl´ ementaire lorsque cela est n´ ecessaire. PROCEDURE filevide (VAR f: file); BEGIN f := NIL END; FUNCTION est filevide (f : file): boolean; BEGIN est filevide := f = NIL END; FUNCTION faireplace (x: element): file; VAR Version 6 f´ evrier 2005 44 Chapitre 3. Structures de donn´ ees q: file; BEGIN new(q); q^.cont := x; q^.suiv := NIL ; faireplace := q END; PROCEDURE enfiler (x: element; VAR f : file); VAR q: file; BEGIN IF est filevide(f) THEN BEGIN f := faireplace(x); f ^.suiv := f END ELSE BEGIN q := faireplace(x); q ^.suiv := f ^.suiv; f ^.suiv := q; f := q END END; PROCEDURE defiler (VAR f : file); VAR q: file; BEGIN q := f ^.suiv; IF f = f ^.suiv THEN f := NIL ELSE f ^.suiv := f ^.suiv^.suiv; dispose(q) END; FUNCTION tete (f : file): element; BEGIN tete := f ^.suiv^.cont END; 3.2.3 Listes Une liste est une liste lin´ eaire o` u les insertions et suppressions se font non seule- ment aux extr´ emit´ es, mais aussi ` a l?int´ erieur de la liste. Les listes constituent un type de donn´ ees tr` es souple et efficace. Ainsi, on peut parcourir des listes (on ne parcourt ni les files ni les piles) sans les d´ etruire, on peut rechercher un ´ el´ ement donn´ e, on peut concat´ ener des listes, les scinder, etc. Dans la manipulation des listes, la distinction entre les places et leur contenu est importante. Une place est propre ` a une liste, c?est-` a-dire ne peut pas ? etre partag´ ee entre plusieurs listes; en revanche, un ´ el´ ement peut figurer dans plusieurs listes, ou plusieurs fois dans une m? eme liste. Version 6 f´ evrier 2005 3.2. Les structures lin´ eaires 45 Nous commen¸ cons par d´ ecrire les op´ erations de base sur les listes, et exprimons en- suite d?autres op´ erations ` a l?aide des op´ erations de base. Les 5 op´ erations d?acc` es sont les suivantes : est-listevide(L : liste) : bool´ een; Teste si la liste L est vide. contenu(p : place; L : liste) : ´ el´ ement; Donne l?´ el´ ement contenu dans la place p; bien s? ur, p doit ? etre une place de L. premier(L : liste) : place; Donne la premi` ere place dans L; ind´ efini si L est la liste vide. suivant(p : place; L : liste) : place; Donne la place suivante; ind´ efini si p est la derni` ere place de la liste. est-dernier(p : place; L : liste) : bool´ een; Teste si la place p est la derni` ere de la liste L. Les 4 op´ erations de construction et de modification sont : listevide(L : liste); Cr´ ee une liste vide L, de longueur 0. ins´ ererapr` es(x : ´ el´ ement; p : place; L : liste); Cr´ ee une place contenant x et l?ins` ere ` a la place suivant p dans L. ins´ ererent? ete(x : ´ el´ ement; L : liste); Cr´ ee une place contenant x et l?ins` ere comme premier ´ el´ ement de L. supprimer(p : place; L : liste); Supprime l?´ el´ ement qui se trouve ` a la place p dans la liste L : si avant la suppression la liste est (e1, . . . , ep, . . . , en), alors apr` es suppression, la liste est (e1, . . . , ep?1, ep, . . . , en?1), avec ej = ej+1 pour j = p, . . . , n ? 1. Au moyen de ces 9 op´ erations primitives, on peut en r´ ealiser d?autres; ainsi, t? ete(L) =contenu(premier(L), L) donne le premier ´ el´ ement d?une liste L. En voici d?autres : chercher(x : ´ el´ ement; L : liste) : bool´ een; Teste si x figure dans la liste L. trouver(x : ´ el´ ement; p : place; L : liste) : bool´ een; Teste si x figure dans la liste L. Dans l?affirmative, p contient la premi` ere place dont le contenu est x. Cette fonction s?´ ecrit comme suit : Version 6 f´ evrier 2005 46 Chapitre 3. Structures de donn´ ees fonction trouver(x : ´ el´ ement; p : place; L : liste) : bool´ een; si est-listevide(L) alors retourner (faux) sinon p :=premier(L); tantque x =contenu(p) faire si est-dernier(p) alors retourner (faux) sinon p :=suivant(p) fintantque finsi; retourner (vrai). On programme la fonction chercher de la m? eme mani` ere. Plusieurs impl´ ementations des listes sont possibles; le choix de l?impl´ ementation d´ epend des op´ erations effectivement utilis´ ees. Si seules les op´ erations de base sont utilis´ ees, on peut employer une impl´ ementation simple; pour plus de souplesse, on utilisera une impl´ ementation par liste doublement cha? ?n´ ee. C?est elle qui permet notamment de concat´ ener deux listes, ou de scinder une liste en temps constant. L?impl´ ementation par un tableau est simple : une place correspond ` a un indice, et la liste est conserv´ ee dans les premiers emplacements du tableau. Une variable suppl´ ementaire tient ` a jour la longueur de la liste. Certaines des fonctions sont particuli` erement simples ` a r´ ealiser, comme suivant ou contenu. L?insertion et la suppression prennent un temps lin´ eaire en fonction de la taille de la liste, puisqu?il faut d´ eplacer toute la partie de la liste ` a droite de la position consid´ er´ ee. Dans les arbres par exemple, la liste des fils d?un sommet peut ? etre rang´ ee dans un tableau, si l?on conna? ?t une majoration de leur nombre, comme c?est le cas pour les arbres a?b (voir chapitre 6). L?impl´ ementation par une liste cha? ?n´ ee est plus souple. Une place est un pointeur vers un couple form´ e de l?´ el´ ement et d?un pointeur vers le couple suivant. Une liste est un pointeur vers un premier couple. Cette structure permet la r´ ealisation de chacune des 9 op´ erations de base en un temps constant. En revanche, d?autres op´ erations, comme la concat´ enation de deux listes, prennent un temps non cons- tant. L?impl´ ementation par une liste doublement cha? ?n´ ee circulaire est la plus souple, et permet aussi la r´ ealisation efficace d?op´ erations suppl´ ementaires sur les listes. D´ etaillons cette structure. Une place est un pointeur vers un triplet form´ e de l?´ el´ ement et de deux pointeurs, l?un vers la place pr´ ec´ edente, l?autre vers la place suivante. La liste est circulaire, de sorte que la premi` ere place est la place qui suit la derni` ere. Une liste est un pointeur vers le premier ´ el´ ement de la liste. Il a la valeur nil quand la liste est vide. En Pascal, les d´ eclarations de type sont : TYPE place = ^bloc; bloc = RECORD cont: element; Version 6 f´ evrier 2005 3.2. Les structures lin´ eaires 47 suiv, prec: place END; liste = place; o` u ´ el´ ement est un type d´ efini par ailleurs. Les en-t? etes de proc´ edures et fonctions se d´ eclarent comme suit : (* fonctions d?acces *) FUNCTION est listevide (L: liste): boolean; FUNCTION contenu (p: place; L: liste): element; FUNCTION premier (L: liste): place; FUNCTION suivant (p: place; L: liste): place; FUNCTION est dernier (p: place; L: liste): boolean; (* constructeurs *) PROCEDURE listevide (VAR L: liste); PROCEDURE insererapres (x: element; p: place; L: liste); PROCEDURE insererentete (x: element; VAR L: liste); PROCEDURE supprimer (VAR p: place; VAR L: liste); Voici l?impl´ ementation des cinq fonctions d?acc` es : IMPLEMENTATION (* des fonctions d?acces *) FUNCTION est listevide (L: liste): boolean; BEGIN est listevide := L = NIL END; FUNCTION contenu (p: place; L: liste): element; BEGIN contenu := p^.cont END; FUNCTION premier (L: liste): place; BEGIN premier := L END; FUNCTION suivant (p: place; L: liste): place; BEGIN suivant := p^.suiv END; FUNCTION est dernier (p: place; L: liste): boolean; BEGIN est dernier := p^.suiv = L END; Pour l?impl´ ementation des fonctions de construction, nous utilisons quelques proc´ edures auxiliaires. PROCEDURE chainer (p, q: place); BEGIN Version 6 f´ evrier 2005 48 Chapitre 3. Structures de donn´ ees q^.prec := p; p^.suiv := q END; Cette proc´ edure lie deux places (figure 2.4). Elle est utilis´ ee pour cr´ eer, ins´ erer et supprimer une place. p q p q Figure 2.4: Effet de chainer(p,q). La proc´ edure dechainer (figure 2.5) d´ elie une place. q  ?   ?   ?  ? ? ? ??? ??? ??? ??? ??? ? ? q Figure 2.5: Effet de dechainer(q). FUNCTION faireplace (x: element): place; VAR q: place; BEGIN new(q); faireplace := q; q^.cont := x; chainer(q, q) END; PROCEDURE enchainer (p, q: place); BEGIN chainer(q, p^.suiv); chainer(p, q) END; PROCEDURE dechainer (q: place); BEGIN chainer(q^.prec, q^.suiv); dispose(q) END; Les constructeurs s?´ ecrivent : IMPLEMENTATION (* des constructeurs *) PROCEDURE listevide (VAR L: liste); BEGIN L := NIL END; Version 6 f´ evrier 2005 3.2. Les structures lin´ eaires 49 PROCEDURE insererapres (x: element; p: place; L: liste); VAR q: place; BEGIN q := faireplace(x); enchainer(p, q) END; PROCEDURE insererentete (x: element; VAR L: liste); VAR q: place; BEGIN IF est listevide(L) THEN L := faireplace(x) ELSE BEGIN q := faireplace(x); enchainer(L^.prec, q); L := q END END; PROCEDURE supprimer (VAR p: place; VAR L: liste); VAR q: place; BEGIN q := p; p := p^.suiv; IF p = q THEN L := NIL ELSE BEGIN IF q = L THEN L := p; dechainer(q) END; dispose(q) END; Voici quelques fonctions ou op´ erations sur les listes qui sont faciles ` a r´ ealiser avec les listes doublement cha? ?n´ ees : dernier(L : liste) : place; Donne la derni` ere place dans L; ind´ efini si L est la liste vide. suivant-cyclique(L : liste) : place; Donne la place suivante dans L, et la premi` ere place de L si p est la derni` ere; ind´ efini si L est la liste vide. pr´ ec´ edent(p : place; L : liste) : place; Donne la place pr´ ec´ edente; ind´ efini si p est la premi` ere place de L. ins´ erer-dirig´ e(x : ´ el´ ement; p : place; L : liste; d : direction); Ins` ere x apr` es la place p dans L si d =apr` es, et avant p si d =avant. ins´ erer-en-queue(x : ´ el´ ement; L : liste); Ins` ere x en fin de liste. Version 6 f´ evrier 2005 50 Chapitre 3. Structures de donn´ ees concat´ ener(L1, L2 : liste); Accroche la liste L2 ` a la fin de la liste L1 : Si L1 = (e1, . . . , en) et L2 = (e1, . . . , em), alors la proc´ edure retourne L1 = (e1, . . . , en, e1, . . . , em). scinder(L : liste; p : place; L1, L2 : liste); Coupe la liste L en deux listes L1 et L2 telles que p soit la derni` ere place de L1. La liste L est suppos´ ee non vide. Voici une impl´ ementation, en temps constant, des deux derni` eres op´ erations : PROCEDURE concatener (VAR L1: liste; L2: liste); VAR q1, q2: place; BEGIN IF L1 = NIL THEN L1 := L2 ELSE IF L2 = NIL THEN ELSE BEGIN q1 := dernier(L1); q2 := dernier(L2); chainer(q1, L2); chainer(q2, L1) END END; PROCEDURE scinder (L: liste; p: place; VAR L1, L2: liste); VAR q: place; BEGIN L1 := L; IF est dernier(p, L) THEN L2 := NIL ELSE BEGIN L2 := p^.suiv; q := dernier(L); chainer(p, L1); chainer(q, L2) END END; Le parcours d?une liste doublement cha? ?n´ ee, avec l?ex´ ecution d?une instruction not´ ee I pour chaque place, se fait en temps lin´ eaire, par : si non est-listevide(L) alors p :=premier(L); r´ ep´ eter I ; p :=suivant-cyclique(p) jusqu?` a p =premier(L) finsi. Remarquons que, dans l?impl´ ementation par une liste simplement cha? ?n´ ee, chaque place pointe en fait sur une liste, ` a savoir sur le reste de la liste commen¸ cant ` a cette Version 6 f´ evrier 2005 3.3. Arbres 51 place. Naturellement, la place suivant la derni` ere est alors la liste vide, en g´ en´ eral repr´ esent´ ee par nil. On peut donc parcourir une telle liste par l?instruction tantque p = nil faire I ; p :=suivant(p) fintantque. Proposition 2.1. Les op´ erations de liste premier, dernier, suivant, con- cat´ ener, scinder se r´ ealisent en temps O(1). Les op´ erations chercher, trou- ver, supprimer et le parcours d?une liste se r´ ealisent en temps O(n), o` u n est la longueur de la liste. 3.3 Arbres On consid` ere d?abord l?impl´ ementation des arbres binaires, puis des arbres plus g´ en´ eraux. Au chapitre suivant, nous ´ etudions plus en d´ etail ces familles d?arbres, et nous nous bornons ici aux structures de donn´ ees. 3.3.1 Arbres binaires La repr´ esentation la plus naturelle des arbres binaires s?appuie sur leur d´ efinition r´ ecursive : un arbre binaire est soit l?arbre vide, soit form´ e d?une racine et de deux arbres binaires disjoints, appel´ es sous-arbres gauche et droit (voir section 4.3.4). Lorsque l?arbre est ´ etiquet´ e, ce qui est le cas notamment pour les arbres binaires de recherche, un sommet comporte un champ suppl´ ementaire, qui est son contenu ou sa cl´ e. Nous commen¸ cons par d´ ecrire les op´ erations de base sur les arbres binaires ´ etiquet´ es, et exprimons ensuite d?autres op´ erations ` a l?aide de ces op´ erations de base. Les 5 op´ erations d?acc` es sont les suivantes : est-arbrevide(a : arbre) : bool´ een; Teste si l?arbre a est vide. contenu(s : sommet) : ´ el´ ement; Donne l?´ el´ ement contenu dans le sommet s. racine(a : arbre) : sommet; Donne le sommet qui est la racine de a; ind´ efini si a est l?arbre vide. sous-arbre-gauche(a : arbre) : arbre; Donne le sous-arbre gauche; ind´ efini si a est l?arbre vide. sous-arbre-droit(a : arbre) : arbre; Donne le sous-arbre droit; ind´ efini si a est l?arbre vide. Les op´ erations de construction et de modification sont : arbrevide(a : arbre); Cr´ ee un arbre vide a. faire-arbre(x : ´ el´ ement; g, d : arbre) : arbre; Version 6 f´ evrier 2005 52 Chapitre 3. Structures de donn´ ees Cr´ ee un sommet qui contient x, et retourne l?arbre ayant ce sommet pour racine, et g et d comme sous-arbres gauche et droit. fixer-cl´ e(x : ´ el´ ement; a : arbre); Le contenu de la racine de a devient x. Ind´ efini si a est l?arbre vide. fixer-gauche(g : arbre; a : arbre); Remplace le sous-arbre gauche de a par g. Ind´ efini si a est l?arbre vide. fixer-droit(d : arbre; a : arbre); Remplace le sous-arbre droit de a par d. Ind´ efini si a est l?arbre vide. Les trois derni` eres op´ erations peuvent ? etre r´ ealis´ ees ` a l?aide de faire-arbre : par exemple, fixer-cl´ e(x, a) est ´ equivalent ` a faire-arbre(x, G(a), D(a)). Pour faciliter l?´ ecriture et la lecture, nous abr´ egeons sous-arbre-gauche en G et sous-arbre-droit en D. Si nous les introduisons explicitement, c?est par souci d?efficacit´ e dans les impl´ ementations : il n?y a pas lieu de cr´ eer un nouveau sommet si l?on veut simplement changer son contenu. A l?aide de ces op´ erations de base, on peut d´ efinir de nombreuses autres op´ erations. Il est par exemple commode de disposer de l?abr´ eviation : cl´ e(a : arbre) : ´ el´ ement; Donne le contenu de la racine de a, ind´ efini si a est vide. ainsi que d?op´ erations sur les feuilles, comme : est-feuille(a : arbre) : bool´ een; Teste si la racine de l?arbre a est une feuille; ind´ efini si a est vide. faire-feuille(x : ´ el´ ement) : arbre; Cr´ ee un arbre r´ eduit ` a un seul sommet qui contient x. Bien entendu, faire-feuille(x) s?obtient par arbrevide(g), arbrevide(d), suivi de faire-arbre(x, g, d), et est-feuille(a) est ´ egal ` a la conjonction de est-arbrevide(G(a)) et est-arbrevide(D(a)) Dans certains cas, il est commode de disposer de fils-gauche et de fils-droit, proc´ edures qui rendent la racine du sous-arbre gauche, respectivement droit. 3.3.2 Dictionnaires et arbres binaires de recherche Un dictionnaire est un type de donn´ ees op´ erant sur les ´ el´ ements d?un ensemble totalement ordonn´ e, appel´ es les cl´ es et dot´ e des op´ erations suivantes : dicovide(d : dictionnaire); Cr´ ee un dictionnaire d vide. Version 6 f´ evrier 2005 3.3. Arbres 53 est-dicovide(d : dictionnaire) : bool´ een; Teste si le dictionnaire d est vide. chercher(x : cl´ e; d : dictionnaire) : bool´ een; Teste si la cl´ e x figure dans le dictionnaire d. ins´ erer(x : cl´ e; d : dictionnaire); Ins` ere x dans le dictionnaire d. supprimer(x : cl´ e; d : dictionnaire); Supprime x dans le dictionnaire d. Les arbres binaires de recherche se pr? etent particuli` erement bien ` a l?impl´ emen- tation des dictionnaires. On les verra en d´ etail au chapitre 6. Il suffit ici de savoir qu?un arbre binaire de recherche est un arbre binaire dont chaque sommet est muni d?une cl´ e prise dans un ensemble totalement ordonn´ e. De plus, pour chaque sommet de l?arbre, les cl´ es contenues dans son sous-arbre gauche sont strictement inf´ erieures ` a la cl´ e du sommet consid´ er´ e et cette cl´ e est elle-m? eme strictement inf´ erieure aux cl´ es contenues dans le sous-arbre droit. En d?autres termes, un parcours sym´ etrique de l?arbre, comme d´ ecrit au chapitre 4, donne une liste des cl´ es en ordre croissant. Donnons d?abord les en-t? etes des op´ erations, qui sont les m? emes que dans un arbre : chercher(x : cl´ e; a : arbre) : bool´ een; Teste si x figure dans l?arbre a. ins´ erer(x : cl´ e; a : arbre ); Ins` ere x dans l?arbre a selon l?algorithme expos´ e ci-dessous; on suppose que x ne figure pas dans a, et on cr´ ee donc un sommet dont la cl´ e est x. supprimer(x : cl´ e; a : arbre); Supprime la cl´ e x et un sommet de l?arbre a selon l?algorithme expos´ e ci-dessous; on suppose que x figure dans a. Voici la r´ ealisation de la recherche dans un arbre : fonction chercher(x : cl´ e; a : arbre) : bool´ een; si est-arbrevide(a) alors retourner (faux) sinon si x=cl´ e(a) alors retourner (vrai) sinon si x <cl´ e(a) alors retourner chercher(x, G(a)) sinon retourner chercher(x, D(a)). Pour l?insertion, on proc` ede de mani` ere similaire : Version 6 f´ evrier 2005 54 Chapitre 3. Structures de donn´ ees proc´ edure ins´ erer(x : cl´ e; a : arbre); si est-arbrevide(a) alors a :=faire-feuille(x) sinon si x <cl´ e(a) alors ins´ erer(x, G(a)) sinon ins´ erer(x, D(a)). (La r´ ealisation, en Pascal par exemple, de cette proc´ edure pose quelques probl` e- mes techniques car on ne peut transmettre en r´ ef´ erence le r´ esultat de l?´ evaluation d?une fonction...) La suppression est plus difficile ` a r´ ealiser parce qu?il faut con- server l?ordre sur l?arbre r´ esultat. Soit x la cl´ e ` a supprimer, et soit s le sommet dont x est le contenu. Si s est une feuille, il suffit de la supprimer. Si s n?a qu?un seul fils, on le remplace par son fils unique. Si s a deux fils, on cherche son des- cendant t dont le contenu le pr´ ec` ede dans l?ordre infixe : c?est le sommet le plus ` a droite dans son sous-arbre gauche. On supprime ce sommet (qui n?a pas de fils droit), apr` es avoir remplac´ e le contenu de s par le contenu de t. (On pourrait aussi bien, sym´ etriquement, remplacer le contenu de s par celui du sommet qui lui succ` ede dans l?ordre infixe.) Voici une r´ ealisation de cet algorithme : proc´ edure supprimer(x : cl´ e; a : arbre ); si x <cl´ e(a) alors supprimer(x, G(a)) sinon si x >cl´ e(a) alors supprimer(x, D(a)) sinon si est-arbrevide(G(a)) alors a := D(a) sinon si est-arbrevide(D(a)) alors a := G(a) sinon fixer-cl´ e(supprimer-max(G(a)), a). L?appel ` a la fonction supprimer-max se fait donc dans le cas o` u l?arbre a deux sous-arbres non vides, et o` u le contenu de la racine de a est ` a supprimer. La fonc- tion supprimer-max r´ ealise ` a la fois la suppression du sommet de plus grande cl´ e parmi les descendants, et retourne le contenu de ce sommet. fonction supprimer-max(a : arbre ) : cl´ e; si est-arbrevide(D(a)) alors supprimer-max :=cle(a); arbrevide(a) sinon supprimer-max :=supprimer-max(D(a)). Plusieurs impl´ ementations des arbres sont possibles; la plus souple utilise des pointeurs. A chaque sommet on associe deux pointeurs, l?un vers le sous-arbre Version 6 f´ evrier 2005 3.3. Arbres 55 gauche, l?autre vers le sous-arbre droit. Un arbre est donn´ e par un pointeur vers sa racine. Un sommet comporte en plus un champ qui contient la cl´ e associ´ ee. On est donc conduit ` a d´ efinir les types suivants : TYPE arbre = ^sommet; sommet = RECORD val: element; g, d: arbre END; 3.3.3 Arborescences Une arborescence ordonn´ ee s?impl´ emente en associant, ` a chaque sommet, la liste lin´ eaire de ses fils. Lorsque le nombre de fils est born´ e a priori, comme c?est le cas par exemple pour les arbres a?b (voir chapitre 6), on utilisera un tableau pour repr´ esenter cette liste, sinon une liste cha? ?n´ ee. Ainsi, ` a chaque sommet est associ´ e un couple (premier fils, fr` ere droit). Cette fa¸ con d?impl´ ementer les arborescences ordonn´ ees revient en fait ` a se ramener aux arbres binaires. Plus formellement, on associe ` a chaque sommet s d?une arborescence ordonn´ ee un sommet ?(s) d?un arbre binaire dont le fils gauche est l?image, par ?, du premier fils de s, et le fils droit l?image du fr` ere suivant de s si s a un fr` ere, l?arbre vide sinon. La figure 3.1 explique la construction. 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 Figure 3.1: Une arborescence repr´ esent´ ee comme arbre binaire. Les autres types d?arbres ou d?arborescences s?impl´ ementent comme des arbores- cences ordonn´ ees. Version 6 f´ evrier 2005 56 Chapitre 3. Structures de donn´ ees 3.4 Files de priorit´ e Les files de priorit´ e constituent un type de donn´ ees int´ eressant, et qui illustre bien comment une hi´ erarchie de structures peut permettre d?impl´ ementer un type de donn´ ees. Une file de priorit´ e est un type de donn´ ees op´ erant sur des cl´ es, donc sur les ´ el´ ements d?un ensemble totalement ordonn´ e, et muni des op´ erations suivantes : filePvide(f : fileP); Cr´ ee une file de priorit´ e f vide. est-filePvide(f : fileP) : bool´ een; Teste si la file de priorit´ e f est vide. minimum(f : fileP) : cl´ e; Donne la plus petite cl´ e contenue dans f. supprimer-min(f : fileP); Supprime la plus petite cl´ e de f ; ind´ efini si f est vide. ins´ erer(x : cl´ e; f : fileP); Ins` ere x dans la file de priorit´ e f. Il est commode de disposer de la combinaison de minimum et de supprimer-min sous la forme : extraire-min(f : fileP) : cl´ e; Donne la plus petite cl´ e de f, et la supprime de f ; ind´ efini si f est vide. Fr´ equemment, et notamment dans les algorithmes de tri, on convient qu?une m? eme cl´ e peut figurer plusieurs fois dans une file. Si les cl´ es sont toutes distinctes, on peut r´ ealiser une file de priorit´ e ` a l?aide d?un arbre binaire de recherche. L?efficacit´ e des op´ erations d´ epend alors de l?efficacit´ e de l?insertion et de la suppression de la plus petite cl´ e dans un arbre binaire de recherche. On verra au chapitre 6 comment ces op´ erations peuvent ? etre r´ ealis´ ees en temps logarithmique, moyennant un r´ e´ equilibrage de l?arbre binaire. Nous pr´ esentons ici une autre impl´ ementation, au moyen d?un tas. Un tas est un arbre tournoi parfait, d´ efini ci-dessous. On verra comment impl´ e- menter un tas tr` es simplement ` a l?aide d?un tableau. Figure 4.1: Les arbres parfaits ` a 6, 7, et 8 sommets. Un arbre parfait est un arbre binaire dont toutes les feuilles sont situ´ ees sur deux niveaux au plus, l?avant-dernier niveau est complet, et les feuilles du dernier Version 6 f´ evrier 2005 3.4. Files de priorit´ e 57 niveau sont regroup´ ees le plus ` a gauche possible. La figure 4.1 donne des exemples d?arbres parfaits. Notons qu?il n?y a qu?un seul arbre parfait ` a n sommets, pour chaque entier n. Un arbre tournoi est un arbre binaire dont les sommets sont munis d?une cl´ e, et tel que pour tout sommet autre que la racine, la cl´ e du sommet est plus grande que celle de son p` ere. En d?autres termes, les cl´ es sur un chemin croissent de la racine vers une feuille. 1 3 4 6 9 5 8 7 Figure 4.2: Un arbre tournoi. La figure 4.2 montre un arbre tournoi, et la figure 4.3 un tas (arbre tournoi parfait). 1 3 6 8 7 9 2 5 4 Figure 4.3: Un tas (tournoi parfait). Sur les arbres parfaits, on utilise certaines des op´ erations sur les arbres binaires : est-arbrevide, arbrevide, racine, p` ere, fils-gauche, fils-droit. Par ailleurs, on d´ efinit les op´ erations sp´ ecifiques suivantes : est-feuille, qui teste si le sommet en argument est une feuille; derni` ere-feuille, qui donne la feuille la plus ` a droite du dernier niveau de l?arbre; cr´ eer-feuille, qui cr´ ee une feuille au dernier niveau de l?arbre, ou en- tame un niveau suppl´ ementaire si le dernier niveau est plein. supprimer-feuille, qui supprime cette feuille. Ces op´ erations conservent donc la perfection d?un arbre. Pour les arbres tournoi, la fonction contenu donne le contenu (la cl´ e) d?un sommet, et on fait appel ` a une proc´ edure suppl´ ementaire, ´ echanger-contenu(p, q) qui ´ echange les cl´ es des sommets p et q. Etudions comment on impl´ emente les op´ erations des files de priorit´ es au moyen des op´ erations des tas. La d´ etermination du minimum est ´ evidente : c?est le contenu de la racine du tas. Elle se fait donc en temps constant. Version 6 f´ evrier 2005 58 Chapitre 3. Structures de donn´ ees Pour l?insertion d?une cl´ e x, on cr´ ee d?abord une feuille contenant cet ´ el´ ement (et qui est donc ajout´ ee au dernier niveau du tas); ensuite on compare son contenu ` a celui de son p` ere; s?il est plus petit, on l?´ echange, et on continue en progressant vers la racine du tas. Voici comment cette proc´ edure se r´ ealise : proc´ edure ins´ erertas(x : cl´ e; a : tas); q :=cr´ eer-feuille(x, a); tantque q =racine(a) etalors contenu(p` ere(q)) >contenu(q) faire ´ echanger-contenu(q,p` ere(q)); q :=pere(q) fintantque. L?extraction de la plus petite cl´ e se fait sur un canevas similaire : fonction extrairemin(a : tas); extrairemin :=contenu(racine(a)); ´ echanger-contenu(racine(a),derni` ere-feuille(a)); supprimer-feuille(a); si est-arbrevide(a) est faux alors p :=racine(a); tantque non est-feuille(p) faire f :=fils-min(p, a); si contenu(f) <contenu(p) alors ´ echanger-contenu(f, p) sinon exit; p := f fintantque finsi. On remplace donc le contenu de la racine par le contenu de la derni` ere feuille. Cette feuille est supprim´ ee. Puis, on descend de la racine vers les feuilles pour mettre la cl´ e ` a une place convenable si elle ne l?est pas, c?est ` a dire si elle est plus grande que l?une des cl´ es des fils. Si le sommet en question a deux fils, on ´ echange la cl´ e du p` ere avec la plus petite des cl´ es de ses fils. On obtient ainsi une correction locale; on poursuit l?op´ eration tant que n´ ecessaire. Revenons ` a l?exemple de la figure 4.3. La suppression de la cl´ e 1 am` ene la cl´ e 7 ` a la racine. La descente qui s?ensuit est illustr´ ee sur la figure 4.4. La fonction fils-min(p, a) retourne le fils de p dont le contenu est le plus petit. Elle s?´ ecrit : Version 6 f´ evrier 2005 3.4. Files de priorit´ e 59 3 6 8 7 9 2 5 4 3 6 8 7 9 2 5 4 3 6 8 7 9 2 5 4 Figure 4.4: Mise en place de la cl´ e 7 par comparaison aux fils. fonction fils-min(p : sommet; a : tas) : sommet; g :=fils-gauche(p); si g =derni` ere-feuille(a) alors fils-min:= g sinon d :=fils-droit(p); si contenu(g) <contenu(d) alors fils-min:= g sinon fils-min:= d finsi. Il est clair que la hauteur d?un tas est logarithmique en fonction du nombre de ses sommets, donc que l?insertion et l?extraction d?une cl´ e prennent un temps logarithmique, sous r´ eserve que les op´ erations ´ el´ ementaires s?impl´ ementent en temps constant. Comme nous l?avons annonc´ e plus haut, il existe une impl´ ementation tr` es efficace des tas ` a l?aide d?un couple form´ e d?un tableau a et d?un entier n donnant le nombre de cl´ es pr´ esents dans le tas. Les sommets du tas ´ etant num´ erot´ es niveau par niveau de la gauche vers la droite, chaque sommet est repr´ esent´ e par l?indice d?une cl´ e d?un tableau a. Le contenu d?un sommet p est rang´ e dans a[p], et est donc accessible en temps constant. Passons en revue les op´ erations; en face de leur nom, nous indiquons leur r´ ealisation : est-arbrevide n = 0? arbrevide n := 0 racine 1 p` ere(p) p/2 fils-gauche(p) 2p fils-droit(p) 2p + 1 Les autres op´ erations se r´ ealisent aussi simplement : est-feuille(p) p > n/2 ? derni` ere-feuille n cr´ eer-feuille(x, a) n := n + 1; a[n] := x supprimer-feuille n := n ? 1 contenu(p) a[p] Version 6 f´ evrier 2005 60 Chapitre 3. Structures de donn´ ees Seule la proc´ edure ´ echanger-contenu(p, q) qui ´ echange les cl´ es des sommets p et q, demande trois instructions. L?efficacit´ e pratique de la r´ ealisation des files de priorit´ es est ´ evidemment am´ elior´ ee si l?on travaille directement sur le tableau, et si l?on remplace les appels de proc´ edures par les instructions correspondantes. Voici une impl´ ementation concr` ete. On d´ efinit les types : TYPE sommet = 1..taillemax; tas = RECORD n: integer; a: ARRAY[sommet] OF cle END; o` u taillemax et cle sont pr´ ed´ efinis. La traduction des proc´ edures ci-dessus se fait litt´ eralement, comme suit : PROCEDURE inserertas (x: cle; VAR t: tas); VAR q: sommet; BEGIN WITH t DO BEGIN n := n + 1; a[n] := x; q := n; WHILE (q <> 1) AND (a[q DIV 2] > a[q]) DO BEGIN echanger(a[q], a[q DIV 2]); q := q DIV 2 END END; END; FUNCTION extrairemin (VAR t: tas): cle; VAR p, f: sommet; FUNCTION fils min (q: sommet): sommet; VAR g: sommet; BEGIN WITH t DO BEGIN g := 2 * q; fils min := g; IF (g < n) AND (a[g] > a[g + 1]) THEN fils min := g + 1 END END; (* de "fils min" *) BEGIN WITH t DO BEGIN extrairemin := a[1]; echanger(a[1], a[n]); n := n - 1; Version 6 f´ evrier 2005 3.5. Gestion des partitions 61 IF n > 0 THEN BEGIN p := 1; WHILE 2 * p <= n DO BEGIN f := fils min(p); IF a[f] < a[p] THEN echanger(a[f], a[p]) ELSE exit(extrairemin); p := f END; END END END; (* de "extrairemin" *) Bien entendu, echanger est une proc´ edure d?´ echange de deux cl´ es. 3.5 Gestion des partitions 3.5.1 Le probl` eme union-find Dans cette section, nous consid´ erons le probl` eme de la gestion efficace d?une partition d?un ensemble U = {1, . . . , N}. Les op´ erations consid´ er´ ees sont trouver(x) Donne le nom de la classe ` a laquelle appartient l?´ el´ ement x de U. unir(A, B, C) Donne une nouvelle classe, de nom C, qui est la r´ eunion des classes de noms A et B. Ce probl` eme est appel´ e le probl` eme de l?union et recherche ( union-find problem en anglais); il appara? ?t dans de nombreuses situations, et notamment dans la recherche d?un arbre couvrant minimum consid´ er´ e plus loin. Dans la suite, nous supposerons que la partition initiale est la partition la plus fine, dont les classes sont compos´ ees d?un seul ´ el´ ement. Les noms des classes sont des entiers dans {1, . . . , N}, et au d´ ebut, le nom de la classe {i} est i. Une solution simple du probl` eme est de repr´ esenter la partition par un tableau classe de taille N qui, pour un ´ el´ ement x ? U contient le nom classe[x] de la classe contenant x. L?op´ eration trouver se r´ eduit au calcul de classe[x]. L?op´ eration unir(A, B, C) est simple mais plus longue : on parcourt le tableau classe et on remplace tous les A et B par C. La solution que nous consid´ erons maintenant en d´ etail utilise une structure plus ´ elabor´ ee. Chaque classe est repr´ esent´ ee par une arborescence, et la partition est repr´ esent´ ee par une for? et. Le nom d?une classe est la racine de son arborescence (voir figure 5.1). Version 6 f´ evrier 2005 62 Chapitre 3. Structures de donn´ ees 1 3 8 4 2 6 10 9 5 7 Figure 5.1: Partition en trois classes, de noms 1, 3, et 7. La for? et est rang´ ee dans un tableau qui, pour chaque ´ el´ ement x autre qu?une racine, donne le p` ere de x. Le p` ere d?une racine est par exemple le nombre 0. Avec cette repr´ esentation, on a : trouver(x) Donne le nom de la racine de l?arborescence contenant x. unir(x, y, z) Prend les arborescences de racines x et y, et en fait une arborescence de racine z; z est soit ´ egal ` a x, soit ´ egal ` a y. 3.5.2 Union pond´ er´ ee et compression des chemins Clairement, unir(x, y, z) se r´ ealise en temps constant. Le temps d?ex´ ecution d?un trouver(x) est proportionnel ` a la profondeur de x. Si au total n unions sont ex´ ecut´ ees, ce temps est au plus O(n). On peut r´ eduire consid´ erablement ce temps si l?on parvient ` a ´ eviter la formation d?arborescences trop filiformes . Pour cela, il convient de r´ ealiser l?union de mani` ere plus soign´ ee. On utilise ` a cet effet la r` egle dite de l?union pond´ er´ ee. Lors de l?ex´ ecution de unir(x, y, z), la racine de la plus petite des deux arborescences est accroch´ ee comme fils ` a la racine de la plus grande. Appelons taille de x le nombre de sommets de l?arborescence de racine x. Alors l?union pond´ er´ ee se r´ ealise en temps constant par la proc´ edure que voici : proc´ edure union-pond´ er´ ee(x, y, z); si taille[x] <taille[y] alors z := y; p` ere[x] := y sinon z := x; p` ere[y] := x finsi; taille[z] :=taille[x]+taille[y]. Nous allons voir que cette r` egle est tr` es efficace. Notons ti(x) et hi(x) la taille et la hauteur du sommet x apr` es la i-i` eme op´ eration d?union pond´ er´ ee. On a t0(x) = 1, Version 6 f´ evrier 2005 3.5. Gestion des partitions 63 h0(x) = 0. Si la i-i` eme union pond´ er´ ee est unir(x, y, z), et si ti?1(x) < ti?1(y), alors z = y, et on a ti(x) = ti?1(x), ti(y) = ti?1(x) + ti?1(y) hi(x) = hi?1(x), hi(y) = max(1 + hi?1(x), hi?1(y)) Lemme 5.1. Si l?on utilise la r` egle de l?union pond´ er´ ee, alors ti(x) ? 2hi(x) pour tout x ? U. En particulier, apr` es n unions, on a hn(x) ? log(n + 1). Preuve. Si hi(x) = 0, alors ti(x) = 1. Supposons donc hi(x) ? 1. Alors x a un fils y avec hi(y) = hi(x)?1. Consid´ erons l?op´ eration d?union pond´ er´ ee qui a fait de y un fils de x. Si cette op´ eration est la j-i` eme, avec j ? i, alors tj?1(x) ? tj?1(y), et donc tj(y) = tj?1(y) et tj(x) ? 2 · tj(y). Ensuite, comme y n?est plus racine d?une arborescence, sa taille ne varie plus. En revanche, la taille de x peut augmenter. De m? eme, la hauteur de y ne varie plus, donc hi(y) = hj?1(y). Par r´ ecurrence, on a tj?1(y) ? 2hj?1(y) , donc ti(x) ? tj(x) ? 2 · tj(y) ? 2 · 2hi(y) = 2hi(x) . Comme n unions ne cr´ eent que des arborescences d?au plus n + 1 sommets, on a tn(x) ? n + 1 pour tout x, d?o` u la seconde in´ egalit´ e. Proposition 5.2. Avec la repr´ esentation par for? et et la r` egle de l?union pon- d´ er´ ee, une suite de n?1 op´ erations union-pond´ er´ ee et de m op´ erations trou- ver se r´ ealise en temps O(n + m log n). Preuve. Chaque union pond´ er´ ee prend un temps O(1). De plus, chaque arbores- cence obtenue durant les n ? 1 unions a une hauteur au plus log n, donc une op´ eration trouver prend un temps O(log n). Une autre fa¸ con de diminuer le co? ut des trouver est la compression des chemins. Si l?on ex´ ecute un trouver(x), on parcourt un chemin x0, x1, . . . , x de x = x0 vers la racine r = x de l?arborescence contenant x. On peut comprimer ce chemin en faisant un deuxi` eme parcours du chemin pendant lequel on fait, de chaque sommet xi, 0 ? i < , un fils de la racine r (voir figure 5.2). M? eme si cette compression ne r´ eduit pas le co? ut de ce trouver (en fait, elle en double le co? ut), les co? uts des trouver subs´ equents qui s?appliquent aux sommets dans les sous-arbres des xi sont fortement r´ eduits. Voici la r´ ealisation du trouver avec compression : Version 6 f´ evrier 2005 64 Chapitre 3. Structures de donn´ ees 5 9 4 2 8 2 8 4 9 5 Figure 5.2: Compression d?un chemin. proc´ edure trouver-avec-compression(x); r := x; tantque r n?est pas racine faire r :=p` ere[r] fintantque; tantque x = r faire y :=p` ere[x]; p` ere[x] := r; x := y fintantque; retourner(r). La compression des chemins seule conduit d´ ej` a ` a un algorithme efficace. La combi- naison de la compression des chemins et de l?union pond´ er´ ee fournit un algorithme tr` es efficace, dont le temps d?ex´ ecution est presque lin´ eaire. Pour les valeurs des param` etres que l?on rencontre en pratique, l?algorithme est lin´ eaire. Pour pouvoir pr´ esenter l?analyse de l?algorithme, nous avons besoin d?une nota- tion. Soit A : N × N ? N la fonction d´ efinie par A(i, 0) = 1 pour i ? 1; A(0, j) = 2j pour j ? 0; A(i + 1, j + 1) = A(i, A(i + 1, j)) pour i, j ? 0. Cette fonction est une variante de la fonction d?Ackermann. Elle cro? ?t tr` es rapi- dement, et n?est pas primitive r´ ecursive. Voici une table des premi` eres valeurs de A : i\j 0 1 2 3 4 5 0 0 2 4 6 8 10 1 1 2 4 8 16 32 2 1 2 4 16 65536 265536 3 1 2 4 65536 2 2···2 ) 65536 fois Soit ? la fonction d´ efinie pour m ? n par ?(m, n) = min{z ? 1 | A(z, 4 m/n ) > log n} Version 6 f´ evrier 2005 3.5. Gestion des partitions 65 Cette fonction est une sorte d?inverse de la fonction A, et cro? ?t tr` es lentement. Pour m ? n, on a ?(m, n) ? ?(n, n). On a ?(n, n) = 1 pour 1 ? n < 216 , et ?(n, n) = 2 pour 216 ? n < 265536 . Pour des valeurs de m et n apparaissant en pratique, on a donc ?(m, n) ? 2. Nous allons prouver le r´ esultat suivant, dont la d´ emonstration n?est pas facile, et peut ? etre omise en premi` ere lecture : Th´ eor` eme 5.3. Avec les r` egles de l?union pond´ er´ ee et de la compression des chemins, une suite de n?1 op´ erations unir et de m op´ erations trouver (m ? n) se r´ ealise en temps O(m · ?(m, n)). 3.5.3 Preuve du th´ eor` eme Note 3.5.1 Pour d´ emontrer le th´ eor` eme 5.3, nous reformulons le probl` eme. Soit T une for? et obtenue par n ? 1 op´ erations unir avec la r` egle de l?union pond´ er´ ee. Nous au- torisons que la for? et soit ensuite modifi´ ee par ce que nous appelons des trouver partiels . Un trouver partiel dans une arborescence parcourt un chemin x0, x1, . . . , xk d?un sommet x0 ` a un sommet xk qui n?est pas n´ ecessairement la racine. Ensuite, chacun des sommets x0, x1, . . . , xk?1 est fait fils du sommet xk. Le co? ut du trouver partiel est k. Il est facile de voir qu?une suite arbitraire de n ? 1 op´ erations unir et de m trouver peut ? etre simul´ ee par une suite de n ? 1 unir suivie d?une suite de m trouver partiels, et que le co? ut de la simulation est le co? ut de la suite originelle. En effet, les unir de la simulation sont juste les unir de la suite de d´ epart, et chaque trouver de la suite de d´ epart est remplac´ e par un trouver partiel avec les m? emes extr´ emit´ es. Il suffit donc de d´ emontrer la majoration pour une suite de n ? 1 op´ erations unir suivies de m trouver partiels. Soit T la for? et obtenue apr` es les n ? 1 op´ erations unir, et soit h(x) la hauteur d?un sommet x dans T. Pour chaque arc (x, y) de T (les arcs sont orient´ es en direction de la racine), on a h(x) < h(y). Le co? ut total des trouver partiels est proportionnel au nombre d?arcs parcourus lors de tous les trouver partiels. Soit F l?ensemble de ces arcs. Nous allons montrer que |F| = O(m?(m, n)) en r´ epartissant les arcs en groupes, et en ´ evaluant le nombre d?arcs dans chaque groupe. La r´ epartition des arcs de F se fait en fonction de la hauteur de leurs extr´ emit´ es. C?est pourquoi on d´ efinit, pour i, j ? 0, les ensembles de sommets Gi,j = {x | A(i, j) ? h(x) < A(i, j + 1)}. Ainsi, on a par exemple G0,0 = {x | 0 ? h(x) ? 1} Gk,0 = {x | h(x) = 1} pour k ? 1 Gk,1 = {x | 2 ? h(x) ? 3} pour k ? 0 Version 6 f´ evrier 2005 66 Chapitre 3. Structures de donn´ ees Lemme 5.4. Pour k ? 0 et j ? 1, on a |Gk,j| ? 2n/2A(k,j) . Preuve. Soit ? 1 un entier avec A(k, j) ? < A(k, j + 1), et comptons le nombre de sommets x tels que h(x) = . Deux sommets distincts de hauteur sont racines de sous-arbres disjoints, et la taille du sous-arbre est, d?apr` es le lemme 5.1, au moins 2 . Il y a donc au plus n/2 sommets de hauteur . Par cons´ equent, |Gk,j| ? A(k,j+1)?1 =A(k,j) n 2 ? 2n 2A(k,j) L?ensemble F des arcs des trouver partiels est r´ eparti en classes Nk pour k = 0, . . . , z + 1, o` u z est un param` etre fix´ e ult´ erieurement et une classe N par : Nk = {(x, y) ? F | k = min{i | ?j : x, y ? Gi,j}} pour 0 ? k ? z, et N = {(x, y) ? F | h(x) = 0, h(y) ? 2} enfin Nz+1 = F ? N ? 0?k?z Nk Pour un i ? 1 fix´ e, les nombres A(i, j), (j ? 0) partitionnent les entiers positifs en intervalles [A(i, j), A(i, j + 1)[, et (x, y) ? Nk si k est le plus petit entier i tel que les hauteurs de x et y appartiennent au m? eme intervalle relativement aux nombres A(i, j), j ? 0. Dans Nz+1 on trouve tous les arcs (x, y) pour lesquels ce nombre est plus grand que k, ` a l?exception des arcs (x, y) pour lesquels x est une feuille. Ceux-ci se r´ epartissent dans N0 si h(y) = 1, et dans N , si h(y) ? 2. Posons, pour 0 ? k ? z + 1, Lk = {(x, y) ? Nk | sur le chemin du trouver partiel contenant (x, y), l?arc (x, y) est le dernier arc dans Nk} Notons en effet que si (x, y) figure sur le chemin d?un trouver partiel, les som- mets x et y deviennent ensuite fr` eres, donc ne peuvent plus se retrouver sur un tel chemin. Lemme 5.5. On a les in´ egalit´ es suivantes : (1) |Lk| ? m pour 0 ? k ? z + 1; |N | ? m; (2) |N0 ? L0| ? n; (3) |Nk ? Lk| ? n pour 1 ? k ? z; (4) |Nz+1 ? Lz+1| ? b(z, n), avec b(z, n) = min{i | A(i, z) ? log n}. Version 6 f´ evrier 2005 3.5. Gestion des partitions 67 Preuve. (1) Chaque trouver partiel a au plus un arc dans Lk, donc |Lk| ? m. De m? eme, chaque trouver partiel a au plus un arc (x, y) dans N , parce que x est une feuille, donc |N | ? m. (2) Soit (x, y) ? N0 ? L0. Il existe j tel que 2j = A(0, j) ? h(x) < h(y) < A(0, j + 1) = 2(j + 1) donc tel que h(x) = 2j et h(y) = 2j + 1. Par ailleurs, il existe un arc (s, t) ? N0 qui vient apr` es l?arc (x, y) sur le chemin du m? eme trouver partiel. On a donc h(y) ? h(s) < h(t) A nouveau, il existe j tel que h(s) = 2j , h(t) = 2j + 1, donc en fait j < j et h(y) < h(s). Apr` es compression du chemin, le p` ere de x est un anc? etre de t, soit u, et en particulier h(u) ? h(t) > A(0, j + 1). Par cons´ equent, aucun trouver partiel ult´ erieur ne peut contenir un arc dont x est l?extr´ emit´ e initiale, et qui appartienne ` a N0. Il en r´ esulte que |N0 ? L0| ? n. Une partie de la preuve est commune pour les cas (3) et (4). Soit x un sommet, et supposons que x ? Gk,j pour un k avec 1 ? k ? z + 1, c?est-` a-dire A(k, j) ? h(x) < A(k, j + 1). Soit q le nombre d?arcs dans Nk ? Lk d´ ebutant par x. Notons-les (x, y1), . . . , (x, yq) avec h(y1) ? · · · ? h(yq). Pour chaque i, 1 ? i ? q, il existe un arc (si, ti) ? Nk qui figure ult´ erieurement dans le chemin du trouver partiel de (x, yi). Par cons´ equent, h(yi) ? h(si) < h(ti) De plus, apr` es compression du chemin, le p` ere de x est un anc` etre de ti (´ even- tuellement ti lui-m? eme). Ceci prouve que h(ti) ? h(yi+1). Maintenant, on a (x, yi) / ? Nk?1 et (si, ti) / ? Nk?1. Par d´ efinition, il existe j < j avec h(x) < A(k ? 1, j ) ? h(yi) ? h(si) < A(k ? 1, j ) ? h(ti) et en particulier h(yi) < A(k ? 1, j ) ? h(yi+1). Il existe donc un entier tel que h(y1) < A(k ? 1, ) ? A(k ? 1, + q ? 2) ? h(yq) (5.1) Les preuves de (3) et (4) se s´ eparent maintenant. Fin de la preuve de (3). Nous montrons que pour x ? Gk,j, 1 ? k ? z, j ? 0, il y a au plus A(k, j) arcs dans Nk ? Lk. Ceci est ´ evident si q = 1. C?est ´ egalement Version 6 f´ evrier 2005 68 Chapitre 3. Structures de donn´ ees clair si j = 0 ou j = 1, car pour ces valeurs de j, il n?y a pas d?arc dans Nk. On peut donc supposer q ? 2, j ? 2. Comme x ? Gk,j et yq ? Nk, on a yq ? Gk,j et par cons´ equent h(yq) < A(k, j + 1) = A(k ? 1, A(k, j)) Ceci prouve, en vue de (5.1), que A(k ? 1, + q ? 2) < A(k ? 1, A(k, j)) donc + q ? 2 < A(k, j) Or ? 1 parce que h(y1) ? 2 et A(k ? 1, ) > h(y1), donc A(k ? 1, ) > 2. Par cons´ equent q ? A(k, j) De cette in´ egalit´ e, on obtient |Nk ? Lk| ? j?2 |Gk,j| · A(k, j) et en majorant |Gk,j| par la valeur donn´ ee dans le lemme 5.4 |Nk ? Lk| ? j?2 2n · A(k, j)/2A(k,j) et comme A(k, j) ? 2j , |Nk ? Lk| ? j?2 2n · 2j 22j ? 5n/8 Fin de la preuve de (4). Par le lemme 5.1, on a h(yq) ? log n, et de l?´ equation (5.1) on obtient A(z, + q ? 2) ? log n La d´ efinition m? eme de b(z, n) implique que + q ? 2 ? b(z, n) et comme ci-dessus, q ? b(z, n). Il y a donc au plus b(z, n) arcs dans Nz+1 ? Lz+1 pour chaque sommet x qui n?est pas une feuille, d?o` u l?in´ egalit´ e cherch´ ee. Preuve du th´ eor` eme. On a |F| = z+1 k=0 |Lk| + |N | + z+1 k=0 |Nk ? Lk| ? m(z + 3) + n + 5 8 nz + b(z, n) (5.2) Version 6 f´ evrier 2005 Notes 69 Fixons le param` etre z ` a z = min{i | A(i, 4 m n ) > log n} = ?(m, n). Alors b(z, n) = b(?(m, n), n) = min{j | A(?(m, n), j) > log n} ? 4 m n ? 8 m n donc par (5.2) |F| ? (m + 5 8 n)?(m, n) + 11m + n = O(m, ?(m, n)) parce que m ? n. Notes Un type abstrait est un ensemble organis´ e d?objets, muni d?un ensemble d?op´ e- rations permettant de les manipuler. Le langage des types abstraits alg´ ebriques permet de donner une description formelle des types abstraits, comme ´ el´ ements d?une alg` ebre h´ et´ erog` ene particuli` ere. Chaque op´ eration sur un type est consid´ er´ ee comme une application (´ eventuellement partielle) qui, ` a une ou plusieurs instances du type, associe une nouvelle instance du type. Par exemple, empiler est une fonction (pile, objet ) ? pile, et d´ epiler est une fonction pile ? pile qui n?est d´ efinie que si la pile de d´ epart n?est pas vide. Ces fonctions doivent en outre v´ erifier certaines propri´ et´ es qui s?expriment souvent par des ´ equations. Ainsi, pour toute pile p, et tout objet x, on doit avoir d´ epiler(empiler(p, x)) = p. Un type abstrait alg´ ebrique est d´ efini alors comme l?ensemble de toutes les alg` e- bres satisfaisant ces conditions. Cette approche alg´ ebrique de la description d?un type abstrait est pr´ esent´ ee syst´ ematiquement dans C. Froidevaux, M. C. Gaudel, M. Soria, Types de donn´ ees et algorithmes, Mc- Graw-Hill, 1990. Les structures de donn´ ees d´ ecrites dans ce chapitre sont des plus classiques, et sont trait´ ees dans tous les livres d?algorithmique. Une pr´ esentation voisine est donn´ ee dans le livre de Froidevaux, Gaudel, Soria, et dans T. H. Cormen, C. E. Leiserson, R. L. Rivest, Introduction to Algorithms, MIT Press, McGraw-Hill, 1990. L?analyse de l?algorithme de gestion des partitions est due ` a Tarjan. Nous suivons l?exposition de Mehlhorn. Tarjan a montr´ e que l?algorithme n?est pas lin´ eaire en g´ en´ eral. L?existence d?un algorithme lin´ eaire reste ouvert. Les pagodes sont dues ` a Fran¸ con, Viennot et Vuillemin. Version 6 f´ evrier 2005 70 Chapitre 3. Structures de donn´ ees Exercices 3.1. Montrer que l?on peut impl´ ementer une pile avec deux files. Quelle est la complexit´ e en temps des op´ erations? 3.2. Montrer que l?on peut impl´ ementer une file avec deux piles. Quelle est la complexit´ e en temps des op´ erations? 3.3. Impl´ ementer une liste avec un tableau. 3.4. Ecrire une proc´ edure purger qui supprime toutes les r´ ep´ etitions dans une liste. Par exemple, le r´ esultat de cette proc´ edure sur la liste (a, b, a, a, b, c, a) est (a, b, c). 3.5. Ecrire une proc´ edure renverser qui retourne une liste. Par exemple, le r´ esultat de cette proc´ edure sur la liste (a, b, c, a, b, d) est (d, b, a, c, b, a). 3.6. Ecrire une proc´ edure fusion qui fusionne deux listes. Les listes sont tri´ ees au d´ epart, le r´ esultat est ´ egalement tri´ e, et un ´ el´ ement qui figurerait dans les deux listes de d´ epart ne figure qu?une fois dans la liste r´ esultat. Par exemple, la fusion des listes (3, 5, 8, 11) et (2, 3, 5, 14) est la liste (2, 3, 5, 8, 11, 14). 3.7. Les arborescences ordonn´ ees dont les sommets ont un nombre born´ e de fils peuvent s?impl´ ementer en associant ` a chaque sommet un tableau de pointeurs vers ses fils. R´ ealiser les op´ erations de manipulation d?arborescences ordonn´ ees dans cette repr´ esentation. 3.8. Un arbre filet´ e ( threaded tree ) est une structure de donn´ ees pour repr´ e- senter les arbres binaires, d´ eclar´ ee par TYPE arbre = ^sommet; sommet = RECORD val: element; g, d: arbre; gvide, dvide: boolean END; Pour un sommet s, gvide est vrai si et seulement si le sous-arbre gauche de s est vide, et dans ce cas, g pointe sur le sommet qui pr´ ec` ede s en ordre sym´ etrique. Dans le cas contraire, g pointe comme usuellement vers la racine du sous-arbre gauche de s. Bien entendu, la m? eme convention vaut pour le sous-arbre droit. a) D´ ecrire des algorithmes pour parcourir un arbre binaire filet´ e en ordre pr´ efixe, suffixe, sym´ etrique. b) D´ ecrire l?insertion et la suppression dans un tel arbre, et d´ ecrire les implications des rotations (voir chapitre 6) sur cette repr´ esentation. 3.9. Une pagode est une repr´ esentation des tournois. Chaque sommet s d?une pagode contient deux pointeurs g(s) et d(s) d´ efinis comme suit. Version 6 f´ evrier 2005 Exercices 71 Figure 5.3: Un arbre filet´ e. (1) si s est la racine ou est un fils droit, g(s) pointe vers le premier sommet en ordre sym´ etrique du sous-arbre de racine s; (2) si s est un fils gauche, g(s) pointe vers le p` ere de s. Le pointeur d(s) est d´ efini de mani` ere sym´ etrique. 1 3 4 6 9 5 8 7      ?       ?   ?         ??? ??? ??? ? ? ??? ? ??? ? ??? ??? ?? ???? ??? ????? ????? ????? ??? ??? ????? ????? ??? ??? ??? ? ??? ??? ? ? ??? ? ?? ? ? ? ? ??? ??? ??? ??? ??? ????? ????? ??? ??? ????? ????? ????? ????? ????? ??? ??? ? ??? ??? 1 3 4 6 9 5 8 7 Figure 5.4: Un tournoi et sa pagode. a) Ecrire une proc´ edure d?insertion d?une cl´ e dans une pagode, en l?ins´ erant le plus ` a droite possible. En d´ eduire qu?un parcours sym´ etrique donne les cl´ es dans leur ordre d?insertion. b) Ecrire une proc´ edure d?extraction de la plus petite cl´ e pr´ esente. c) D´ ecrire un algorithme de fusion de deux pagodes. 3.10. On peut utiliser, pour la repr´ esentation d?une partition, en plus du ta- bleau classe, une liste circulaire pour chaque classe. R´ ealiser les op´ erations unir et trouver et montrer qu?avec la r` egle de l?union pond´ er´ ee, on peut r´ ealiser une suite de n ? 1 unir et de m trouver en temps O(m + n log n). 3.11. Analyser l?algorithme de gestion de partitions qui utilise l?unir na¨ ?f et un trouver avec compression des chemins. Version 6 f´ evrier 2005 72 Chapitre 3. Structures de donn´ ees Version 6 f´ evrier 2005 73 Chapitre 4 Graphes Ce chapitre commence par la d´ efinition des graphes et de certains objets fonda- mentaux comme les chemins, les cha? ?nes, les circuits et les cycles. Pour les graphes sans circuit, sont ensuite introduites les notions de rang et de liste topologique. La section 2 pr´ esente l?algorithme de Roy-Warshall dans le cadre g´ en´ eral de la recherche des valeurs optimales des chemins entre tous les couples de sommets d?un graphe dont les arcs sont valu´ es par les ´ el´ ements d?un semi-anneau. On exa- mine ensuite certains cas particuliers comme le calcul de la relation d?accessibilit´ e, l?algorithme de Floyd et le calcul du langage des chemins d?un graphe ´ etiquet´ e. La section 3 d´ efinit les arbres, les arborescences et leurs principales variantes at- tribu´ ees. La section 4 introduit la notion de parcours d?un graphe non orient´ e et pr´ esente des algorithmes sp´ ecifiques pour les parcours en profondeur et en largeur. Les parcours sont ensuite ´ etendus aux graphes orient´ es et l?algorithme de Tarjan, qui d´ etermine les composantes fortement connexes d?un graphe, est pr´ esent´ e en tant qu?application des propri´ et´ es des parcours en profondeur. On termine par l?´ etude des parcours sp´ ecifiques aux arborescences. Introduction Les graphes constituent certainement l?outil th´ eorique le plus utilis´ e pour la mod´ elisation et la recherche des propri´ et´ es d?ensembles structur´ es. Ils intervien- nent chaque fois que l?on veut repr´ esenter et ´ etudier un ensemble de liaisons (ori- ent´ ees ou non) entre les ´ el´ ements d?un ensemble fini d?objets. Citons comme cas particuliers de liaisons des applications aussi diverses qu?une connexion entre deux processeurs d?un r´ eseau informatique, une contrainte de pr´ ec´ edence entre deux t? aches d?un probl` eme d?ordonnancement, la possibilit´ e pour un syst` eme de passer d?un ´ etat ` a un autre ou encore une incompatibilit´ e d?horaires. S?agissant d?un outil fondamental, la recherche des algorithmes les plus efficaces pour r´ ealiser les op´ erations de base sur les graphes constitue un objectif essentiel de l?algorithmi- que. Version 6 f´ evrier 2005 74 Chapitre 4. Graphes 4.1 D´ efinitions et propri´ et´ es ´ el´ ementaires 4.1.1 D´ efinitions Un graphe orient´ e G = (S, A) est compos´ e d?un ensemble fini S d?´ el´ ements appel´ es sommets et d?une partie A de S × S dont les ´ el´ ements sont appel´ es arcs. Les arcs d?un graphe orient´ e constituent donc une relation sur l?ensemble de ses sommets. Un arc (x, y) repr´ esente une liaison orient´ ee entre l?origine x et l?extr´ emit´ e y. Si (x, y) est un arc, y est un successeur de x, x est un pr´ ed´ ecesseur de y et si x = y, l?arc (x, x) est appel´ e boucle. Lorsque l?orientation des liaisons n?est pas une information pertinente, la notion de graphe non orient´ e permet de s?en affranchir. Un graphe non orient´ e G = (S, A) est compos´ e d?un ensemble fini S d?´ el´ ements appel´ es sommets et d?une famille de paires de S dont les ´ el´ ements sont appel´ es ar? etes. Etant donn´ e un graphe orient´ e, sa version non orient´ ee est obtenue en supprimant les boucles et en substituant ` a chaque arc restant (x, y) la paire {x, y}. Deux sommets distincts d?un graphe orient´ e (respectivement non orient´ e) G sont adjacents s?ils sont les extr´ emit´ es d?un m? eme arc (respectivement d?une m? eme ar? ete). Soient G = (S, A) un graphe orient´ e (respectivement non orient´ e) et T un sous-ensemble de S. L?ensemble not´ e ?(T) des arcs (respectivement ar? etes) de A dont une extr´ emit´ e est dans T et l?autre dans S ? T est appel´ e le cocycle associ´ e ` a T. L?ensemble not´ e B(T) des sommets de S ? T adjacents ` a au moins un sommet de T est appel´ e bordure de T. Si le sommet u appartient ` a B(T), on dit aussi que u est adjacent ` a T. Le graphe G = (S, A) est dit biparti s?il existe un sous-ensemble de sommets T tel que A = ?(T). (a) 1 2 4 5 3 1 (b) 1 2 4 3 1 (c) 1 2 4 3 1 (d) 1 4 3 Figure 1.1: Sous-graphes. Un sous-graphe du graphe G = (S, A) est un couple G = (S , A ) pour lequel S ? S et A ? A. Le sous-graphe G est un graphe partiel de G si S = S. Si A Version 6 f´ evrier 2005 4.1. D´ efinitions et propri´ et´ es ´ el´ ementaires 75 est l?ensemble des arcs de A dont les deux extr´ emit´ es sont dans S , le sous-graphe G est dit induit par S . Si S est l?ensemble des extr´ emit´ es des arcs de A , le sous-graphe G est dit induit par A . Les sommets d?un graphe sont repr´ esent´ es par des points distincts du plan. Un arc (x, y) d?un graphe orient´ e est repr´ esent´ e par une fl` eche d?origine x et d?extr´ emit´ e y, une ar? ete d?un graphe non orient´ e est repr´ esent´ ee par une ligne joignant ses deux extr´ emit´ es. Sur la figure 1.1 sont repr´ esent´ es en a) un graphe orient´ e G, en b) un sous-graphe de G, en c) le graphe partiel de G induit par les sommets {1, 2, 3, 4} et en d) le sous-graphe induit par les arcs {(1, 4), (4, 3)}. Le graphe G est biparti car tout arc est incident ` a T = {1, 2, 3}. 4.1.2 Impl´ ementations d?un graphe Parmi les impl´ ementations possibles d?un graphe orient´ e G = (S, A), on peut en retenir essentiellement trois qui interviennent dans la plupart des probl` emes th´ eoriques et pratiques : la matrice d?adjacence, la matrice d?incidence et la liste des successeurs. 1 2 3 5 4 1 2 3 4 5 6 (a) 1 2 3 4 5 1 0 0 0 1 1 2 0 0 0 1 0 3 0 0 0 0 1 4 0 0 1 0 0 5 0 1 0 0 0 (b) 1 2 3 4 5 4 5 4 3 5 2 (c) 1 2 3 4 5 6 1 1 0 0 1 0 0 2 0 0 0 0 1 -1 3 0 -1 1 0 0 0 4 -1 1 0 0 -1 0 5 0 0 -1 -1 0 1 (d) 1 2 3 5 4 (e) 1 2 3 4 5 4 5 4 3 5 2 5 4 2 1 3 1 (f) Figure 1.2: Impl´ ementations d?un graphe. La matrice d?adjacence M = M(G) est une matrice carr´ ee, indic´ ee par S, d´ efinie par : mij = 1 si (i, j) ? A 0 sinon o` u le 0 et le 1 seront entiers ou bool´ eens selon la convenance. Version 6 f´ evrier 2005 76 Chapitre 4. Graphes Si G est un graphe sans boucles, sa matrice d?incidence sommets-arcs ?(G) est d´ efinie par : ?xa = 1 si x est l?origine de l?arc a ?1 si x est l?extr´ emit´ e de l?arc a 0 sinon Cette matrice poss` ede une propri´ et´ e tr` es importante pour certains domaines de l?optimisation combinatoire comme la th´ eorie des flots (voir chapitre 8) : le d´ eterminant de toute sous-matrice carr´ ee extraite vaut 0, 1 ou ?1. Une matrice satisfaisant cette propri´ et´ e est dite totalement unimodulaire. Les matrices d?ajacence et d?incidence du graphe orient´ e de la figure 1.2 sont les suivantes : M = ? ? ? ? ? ? 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 ? ? ? ? ? ? ? = ? ? ? ? ? ? 1 0 0 1 0 0 0 0 0 0 1 ?1 0 ?1 1 0 0 0 ?1 1 0 0 ?1 0 0 0 ?1 ?1 0 1 ? ? ? ? ? ? . La liste des successeurs (en anglais : adjacency list) est un tableau (q1, . . . , qn) o` u qi est un pointeur sur une liste des successeurs du sommet i. Dans le cas d?un graphe non orient´ e, l?impl´ ementation la plus utilis´ ee est la liste des voisins qui est un tableau (q1, . . . , qn) o` u qi est un pointeur sur une liste des sommets adjacents au sommet i. C?est la version non orient´ ee de la liste des successeurs. Notons que les tailles de ces diverses repr´ esentations sont sensiblement diff´ erentes. Si n est le nombre de sommets et si m est le nombre d?arcs (ou d?ar? etes pour un graphe non orient´ e), la taille de la matrice d?adjacence est en ?(n2 ), celle de la matrice d?incidence en ?(nm) alors que la taille de la liste des successeurs (ou des voisins) est en ?(n + m). La figure 1.2 montre la liste des successeurs (c) du graphe orient´ e (a) et la liste des voisins (d) du graphe non orient´ e (b). 4.1.3 Chemins, cha? ?nes, circuits, cycles Soit G = (S, A) un graphe orient´ e. Un chemin d?origine x et d?extr´ emit´ e y est une suite finie non vide de sommets c = (s0, . . . , sp) telle que : s0 = x, sp = y et pour k = 0, .., p?1, (sk, sk+1) ? A. La longueur du chemin c est p, c?est le nombre d?arcs (non n´ ecessairement distincts) emprunt´ es par ce chemin. La notion de chemin nous permet d?introduire les ascendants et les descendants d?un sommet. Soit x un sommet de S, un sommet y est un ascendant (respective- ment descendant) de x s?il existe un chemin de y ` a x (respectivement de x ` a y) Version 6 f´ evrier 2005 4.1. D´ efinitions et propri´ et´ es ´ el´ ementaires 77 dans G. Le sommet y est un ascendant (respectivement descendant) propre du sommet x s?il existe un chemin de longueur non nulle de y ` a x (respectivement de x ` a y). Notons qu?un sommet peut ? etre ascendant propre et descendant propre de lui-m? eme. Un chemin c = (s0, . . . , sp) est simple si les arcs (si?1, si), i = 1, .., p sont deux ` a deux distincts. Un chemin c = (s0, . . . , sp) est ´ el´ ementaire si ses sommets sont distincts deux ` a deux. Un chemin (s0, . . . , sp) est un circuit si p ? 1 et s0 = sp. Un circuit c = (s0, . . . , sp) est ´ el´ ementaire si le chemin (s0, . . . , sp?1) est ´ el´ ementaire. Soulignons qu?un circuit ´ el´ ementaire n?est pas un chemin ´ el´ ementaire et que, de la m? eme fa¸ con, un chemin ´ el´ ementaire n?est pas un circuit ´ el´ ementaire. Consid´ erons le graphe orient´ e de la figure 1.2. La suite (5, 2, 4, 3, 5) est un circuit ´ el´ ementaire mais n?est pas un chemin ´ el´ ementaire. Par contre la suite (1, 4, 3) est un chemin ´ el´ ementaire. Consid´ erons maintenant un graphe non orient´ e G = (S, A) et d´ efinissons les notions correspondantes de cha? ?ne et cycle. Une cha? ?ne d?origine x et d?extr´ emit´ e y est une suite finie de sommets (s0, . . . , sp) telle que s0 = x, sp = y, deux sommets cons´ ecutifs quelconques de la liste sont les extr´ emit´ es d?une ar? ete, et ces ar? etes sont distinctes deux ` a deux. Notons que si (s0, . . . , sp) est une cha? ?ne, il en est de m? eme pour (sp, . . . , s0). Une cha? ?ne c = (s0, . . . , sp) est ´ el´ ementaire si les sommets de la liste c sont deux ` a deux distincts. Une cha? ?ne (s0, . . . , sp) est un cycle si s0 = sp. Un cycle (s0, . . . , sp) est ´ el´ ementaire si p ? 1 et si la liste (s0, . . . , sp?1) est une cha? ?ne ´ el´ ementaire. Pour le graphe non orient´ e repr´ esent´ e sur la figure 1.2, la liste (5, 1, 4, 1) n?est pas une cha? ?ne et (1, 5, 3, 4) est une cha? ?ne ´ el´ ementaire. Un graphe non orient´ e est connexe si pour tout couple de sommets, il existe une cha? ?ne ayant ces deux sommets comme extr´ emit´ es. Par extension, un graphe orient´ e est connexe si sa version non orient´ ee (c?est-` a-dire le graphe non orient´ e obtenu en supprimant les orientations et les boucles) est connexe. La relation sur l?ensemble des sommets d?un graphe non orient´ e d´ efinie par x ? y s?il existe une cha? ?ne de x ` a y est une relation d?´ equivalence dont les classes sont appel´ ees com- posantes connexes du graphe. Les graphes induits par les composantes connexes sont bien s? ur des graphes connexes. 4.1.4 Lemme de K¨ onig Les chemins d?un graphe constituent en g´ en´ eral un ensemble infini (il faut et il suffit que le graphe poss` ede des circuits). Par contre les chemins ´ el´ ementaires sont en nombre fini et constituent pour de nombreux probl` emes d?optimisation un ensemble dominant lorsque l?existence d?un chemin optimal ´ el´ ementaire est prouv´ ee. Le lemme de K¨ onig montre que l?existence d?un chemin d?origine x et d?extr´ emit´ e y entra? ?ne celle d?un chemin ´ el´ ementaire entre ces m? emes sommets. Version 6 f´ evrier 2005 78 Chapitre 4. Graphes Soit G = (S, A) un graphe orient´ e. Un chemin c est dit extrait d?un chemin c si les deux chemins c et c ont la m? eme origine et la m? eme extr´ emit´ e et si la suite des arcs de c est une sous-suite de celle des arcs de c . La relation est extrait de d´ efinie sur l?ensemble des chemins de G est une relation d?ordre et le lemme de K¨ onig ci-dessous montre que ses ´ el´ ements minimaux sont les chemins ´ el´ ementaires de G. Lemme 1.1 (de K¨ onig). De tout chemin on peut extraire un chemin ´ el´ emen- taire. Preuve. Nous raisonnons par induction sur la longueur p du chemin c. Si p = 0, c est ´ el´ ementaire. Soit donc c = (x0, . . . , xp) un chemin ` a p sommets avec p > 0. Si c n?est pas ´ el´ ementaire, il existe un couple (r, s) tel que 0 ? r < s ? p et xr = xs. Le chemin c = (x0, .., xr, xs+1, .., xp) est extrait de c et strictement plus petit que c. On peut donc extraire de c , et donc de c, un chemin ´ el´ ementaire. Remarque. Le lemme de K¨ onig s?´ etend aux circuits d?un graphe orient´ e et aussi aux cha? ?nes et aux cycles d?un graphe non orient´ e. 4.1.5 Graphes sans circuit Les graphes sans circuit interviennent dans de nombreux domaines, en particulier chaque fois que l?on ´ etudie une relation d?ordre partiel. Pour ces graphes, on conna? ?t des algorithmes sp´ ecifiques dont l?efficacit´ e est souvent due ` a l?utilisation d?une liste des sommets qui permet, lors de la visite d?un sommet de la liste, d?? etre s? ur que tous ses ascendants propres ont d´ ej` a ´ et´ e visit´ es. Une liste topologique des sommets d?un graphe G = (S, A) est une permutation (s1, . . . , sn) des sommets de S telle que pour tout arc (si, sj) on a i < j. Proposition 1.2. Un graphe orient´ e G = (S, A) est sans circuit si et seulement s?il existe une liste topologique des sommets de G. Preuve. La condition suffisante r´ esulte directement de la d´ efinition d?une liste topologique. D´ emontrons que la condition est n´ ecessaire par induction sur n = Card(S). La propri´ et´ e est bien s? ur vraie si n = 1. Supposons qu?elle le soit pour un graphe ` a n ? 1 sommets (n ? 2). Le graphe G ne poss´ edant pas de circuits, il existe au moins un sommet s sans descendants propres car dans le cas contraire, on pourrait construire un chemin infini, donc contenant n´ ecessairement un circuit. Le sous-graphe G de G induit par S ? {s} a n ? 1 sommets et ne poss` ede pas de circuits. Il existe donc une liste topologique L des sommets de G ; la liste L .(s) form´ ee de L concat´ en´ ee avec la liste (s) est alors une liste topologique des sommets de G. La propri´ et´ e pr´ ec´ edente conduit naturellement ` a un algorithme pour tester si un graphe orient´ e G est sans circuit. Le principe de cet algorithme est de rechercher Version 6 f´ evrier 2005 4.1. D´ efinitions et propri´ et´ es ´ el´ ementaires 79 une sortie s de G. S?il n?en n?existe pas alors G poss` ede un circuit sinon la r´ eponse pour G est la m? eme que pour Gs. En utilisant une liste des successeurs pour coder G, on obtient une complexit´ e O(n2 ). Nous donnerons dans la section 4.4.4 un algorithme plus efficace, de complexit´ e O(n + m), fond´ e sur un parcours en profondeur du graphe G. Il peut exister plusieurs listes topologiques d?un m? eme graphe sans circuit. Le graphe repr´ esent´ e sur la figure 1.3 ne poss` ede qu?une seule liste topologique (3, 2, 1, 6, 7, 5, 4) car il existe un seul chemin ´ el´ ementaire passant par tous les sommets. 3 1 4 2 5 6 7 Figure 1.3: Un graphe sans circuit. Plus g´ en´ eralement, soit ? une relation d?ordre sur un ensemble fini E. Une ex- tension lin´ eaire de ? est un ordre total sur E qui contient ?, c?est-` a-dire tel que : x ? y =? x y. Etant donn´ e un ordre total sur S, on peut constituer la suite (s1, . . . , sn) des ´ el´ ements de S telle que : s1 s2 . . . sn. L?op´ eration qui d´ etermine une extension lin´ eaire s?appelle le tri topologique et le r´ esultat du tri est une liste topologique. D´ eterminer une extension lin´ eaire ´ equivaut bien entendu ` a num´ eroter les sommets du graphe, c?est-` a-dire ` a trouver une bijection ? : S ? {1, . . . , n} v´ erifiant : (x, y) ? A =? ?(x) < ?(y). Soit G = (S, A) un graphe sans circuit. Le rang du sommet s, not´ e ?(s), est la longueur maximale d?un chemin d?extr´ emit´ e s. Notons que ?(s) est bien d´ efini puisque les chemins de G sont ´ el´ ementaires et donc en nombre fini. La figure 1.4 montre un graphe sans circuit et ` a sa droite le m? eme graphe rang´ e. Proposition 1.3. Pour tout sommet x, les ascendants propres de x ont un rang strictement inf´ erieur au rang de x, les descendants propres de x ont un rang strictement sup´ erieur au rang de x, et si x est de rang k > 0, il poss` ede un ascendant propre de rang k ? 1. Version 6 f´ evrier 2005 80 Chapitre 4. Graphes 1 7 2 4 5 3 8 9 6 1 2 3 4 5 6 7 8 9 0 0 1 1 2 3 4 5 3 Figure 1.4: Classement par rang. Preuve. Si y est un ascendant propre de x, alors ?(x) > ?(y). De m? eme, si y est un descendant propre de x, alors ?(x) < ?(y). Enfin si tous les ascendants propres de x ´ etaient de rang inf´ erieur ou ´ egal ` a k ? 2, on aurait : ?(x) ? k ? 1, d?o` u la contradiction. Remarque. La liste des sommets d?un graphe sans circuit, ordonn´ ee par rang croissant au sens large, est une liste topologique. 4.2 Accessibilit´ e Etant donn´ e un graphe orient´ e G = (S, A), le sommet y est dit accessible ` a partir du sommet x s?il existe un chemin de x ` a y. L?objet de cette section est le calcul de la relation d?accessibilit´ e. A cet effet, nous d´ ecrivons l?algorithme de Roy-Warshall qui fournit la matrice bool´ eenne de la relation d?accessibilit´ e. Cet algorithme qui utilise comme structure de donn´ ees la matrice bool´ eenne associ´ ee au graphe initial a une complexit´ e O(n3 ), o` u n est le nombre de sommets de G. Nous posons S = {1, 2, · · ·, n} et pour k ? S, nous notons E(k) l?ensemble {1, 2, · · ·, k}; par convention l?ensemble E(0) est vide. Si c = (v1, . . . , vk) est un chemin de G, l?int´ erieur I(c) de ce chemin est l?ensemble des sommets du sous-chemin (v2, . . . , vk?1); si k ? 2, I(c) est l?ensemble vide. Enfin nous notons Gk = (S, Ak) le graphe d´ efini par : (i, j) ? Ak ?? ?c : i ? j, I(c) ? E(k). Remarque. Le graphe G0 est le graphe initial G compl´ et´ e d?une boucle en chaque sommet; le graphe Gn est le graphe de la relation d?accessibilit´ e. Version 6 f´ evrier 2005 4.2. Accessibilit´ e 81 4.2.1 Algorithme de Roy-Warshall L?algorithme de Roy-Warshall calcule la suite des graphes G1, G2, . . . , Gn en utilisant le th´ eor` eme suivant : Th´ eor` eme 2.1. Pour tout i, j, k ? S, l?arc (i, j) appartient ` a Ak si et seulement si (i, j) ? Ak?1 ou ((i, k) ? Ak?1 et (k, j) ? Ak?1). Preuve. Si (i, j) ? Ak, il existe d?apr` es le lemme de K¨ onig un chemin ´ el´ ementaire c de i ` a j dont l?int´ erieur I(c) est inclus dans E(k). Si I(c) ne contient pas k, alors I(c) est inclus dans E(k ? 1) et donc (i, j) ? Ak?1. Si I(c) contient k, nous notons c (respectivement c ) le sous-chemin de c de i ` a k (respectivement le sous- chemin de c de k ` a j). Le chemin c ´ etant ´ el´ ementaire, I(c ) et I(c ) sont inclus dans E(k ? 1); il en r´ esulte que (i, k) ? Ak?1 et (k, j) ? Ak?1. R´ eciproquement on a : (i, j) ? Ak?1 =? (i, j) ? Ak, car E(k ? 1) ? E(k). Supposons maintenant que (i, k) ? Ak?1 et (k, j) ? Ak?1 ; il existe alors un chemin c (respectivement c ) de i ` a k (respectivement de k ` a j) tel que I(c ) (respectivement I(c )) soit inclus dans E(k ? 1). L?int´ erieur du chemin c obtenu par la concat´ enation de c et c est donc inclus dans E(k) et par cons´ equent (i, j) ? Ak. Une impl´ ementation possible de l?algorithme de Roy-Warshall utilise comme structure de donn´ ees une seule matrice bool´ eenne, not´ ee a et initialis´ ee avec la matrice d?adjacence de G; cette impl´ ementation est donn´ ee par la proc´ edure Roy-Warshall(G) suivante : proc´ edure Roy-Warshall(G); {g est la matrice d?adjacence du graphe G} {a est la matrice de travail} a := g; pour i de 1 ` a n faire aii := 1; pour k de 1 ` a n faire pour i de 1 ` a n faire pour j de 1 ` a n faire aij := aij ou (aik et akj); retourner(a). L?utilisation d?une seule matrice de travail rend n´ ecessaire la proposition suivante pour valider la proc´ edure Roy-Warshall(G). Proposition 2.2. Pour tout i, j, k ? S, les deux ´ equivalences suivantes sont vraies : (1) (i, k) ? Ak?1 ?? (i, k) ? Ak ; Version 6 f´ evrier 2005 82 Chapitre 4. Graphes (2) (k, j) ? Ak?1 ?? (k, j) ? Ak. Preuve. (laiss´ ee ` a titre d?exercice). Th´ eor` eme 2.3. La proc´ edure Roy-Warshall(G) d´ etermine la matrice de la relation d?accessibilit´ e d?un graphe orient´ e G = (S, A) en O(n3 ) op´ erations ´ el´ ementaires. Preuve. Notons a(k) la valeur de la matrice a calcul´ ee par la proc´ edure Roy- Warshall(G) lors de l?it´ eration k et supposons que jusqu?au calcul de l?´ el´ ement (i, j) de a ` a l?it´ eration k, les valeurs a (p) rs soient correctes. Lors du calcul de a (k) ij , l?´ el´ ement (i, j) de la matrice a contient initialement la valeur a (k?1) ij , par contre l?´ el´ ement (i, k) de la matrice a contient la valeur a (k?1) ik si k > j ou la valeur a (k) ik si k < j ; de m? eme l?´ el´ ement (k, j) de la matrice a contient la valeur a (k?1) kj si k > i ou la valeur a (k) ik si k < i. Cependant la proposition pr´ ec´ edente nous assure que la valeur calcul´ ee a (k) ij est correcte. 1 2 3 4 5 1 1 0 0 0 0 1 1 0 0 1 0 1 1 1 0 0 0 1 1 0 0 0 1 1 matrice d'adjacence Figure 2.1: Un graphe orient´ e et sa matrice d?adjacence. Exemple. Consid´ erons le graphe orient´ e de la figure 2.1. Les matrices d?adja- cence des graphes G1, G2 et G3 sont les suivantes : A1 = ? ? ? ? ? ? 1 1 0 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 ? ? ? ? ? ? A2 = ? ? ? ? ? ? 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 ? ? ? ? ? ? A3 = ? ? ? ? ? ? 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 ? ? ? ? ? ? Les graphes G4 et G5 sont ´ egaux au graphe G3, si bien que la matrice de la relation d?accessibilit´ e est celle du graphe G3. 4.2.2 Autres probl` emes d?accessibilit´ e Nous consid´ erons dans ce paragraphe la notion de graphe ´ etiquet´ e, c?est-` a-dire de graphe dont chaque arc (i, j) porte une ´ etiquette eij choisie dans un ensemble E. Version 6 f´ evrier 2005 4.2. Accessibilit´ e 83 L?id´ ee centrale de l?algorithme de Roy-Warshall est de r´ esoudre la suite des sous-probl` emes obtenus en faisant grossir de l?ensemble vide jusqu?` a S lui- m? eme, l?ensemble des sommets qui peuvent appartenir ` a l?int´ erieur d?un chemin. Une formule de r´ ecurrence permet de passer simplement de la solution d?un sous-probl` eme ` a celle du sous-probl` eme suivant. Cette m? eme id´ ee conduit ` a la r´ esolution d?une classe de probl` emes analogues lorsque l?ensemble des ´ etiquettes poss` ede une structure de semi-anneau. Nous illustrons cette m´ ethodologie en traitant deux probl` emes classiques sur les graphes ´ etiquet´ es : a) Si E = R, d´ eterminer pour tout couple de sommets la valeur maximale des chemins entre ces deux sommets; b) Si E est l?ensemble des parties non vides d?un alphabet A, d´ eterminer pour tout couple de sommets le langage des ´ etiquettes des chemins entre ces deux sommets. Chemins de valeur maximale : algorithme de Floyd Soit G = (S, A) un graphe orient´ e dont chaque arc est valu´ e par un nombre r´ eel. Nous appelons valeur d?un chemin la somme des ´ etiquettes des arcs de ce chemin. Nous supposons de plus que tout circuit du graphe a une valeur n´ egative ou nulle (on dit encore qu?il n?existe pas de circuits absorbants). Le probl` eme consiste alors ` a d´ eterminer, pour tout couple de sommets (i, j) la valeur maximale des chemins de i ` a j, not´ ee aij. Etant donn´ e un couple (i, j), le lemme de K¨ onig et l?absence de circuits positifs montrent qu?il suffit de calculer la valeur maximale des chemins ´ el´ ementaires de i ` a j et donc que aij est fini. La recherche sera donc conduite dans l?ensemble des chemins ´ el´ ementaires de G. Nous notons a (k) ij la valeur maximale d?un chemin de i ` a j dont l?int´ erieur est inclus dans E(k) et nous prenons comme valeurs initiales, pour k = 0 : a (0) ij = ? ? ? eij, si (i, j) ? A et i = j ; 0, si i = j ; ??, sinon. La proposition suivante permet alors le calcul des a (k) ij : Proposition 2.4. Pour tout i, j, k ? S, on a a (k) ij = max{a (k?1) ij , a (k?1) ik +a (k?1) kj }. Preuve. La valeur maximale d?un chemin de i ` a j dont l?int´ erieur est inclus dans E(k ? 1) est par d´ efinition a (k?1) ij . La valeur maximale d?un chemin de i ` a j dont l?int´ erieur est inclus dans E(k) et contient k est a (k?1) ik + a (k?1) kj car tout chemin de cet ensemble est constitu´ e de la concat´ enation d?un chemin de i ` a k dont l?int´ erieur est inclus dans E(k ? 1) et d?un chemin de k ` a j dont l?int´ erieur est inclus dans E(k ? 1). Version 6 f´ evrier 2005 84 Chapitre 4. Graphes Comme les deux ensembles de chemins pr´ ec´ edents recouvrent tous les chemins de i ` a j dont l?int´ erieur est inclus dans E(k), la valeur maximale cherch´ ee est max{a (k?1) ij , a (k?1) ik + a (k?1) kj }. L?algorithme issu de cette proposition a ´ et´ e d´ ecouvert par Floyd, la proc´ edure ci- dessous de complexit´ e O(n3 ) impl´ emente cet algorithme et n?utilise qu?une seule matrice de travail a. proc´ edure Floyd(G, e); {g est la matrice d?adjacence du graphe G} {e est la matrice des ´ etiquettes du graphe G} {a est la matrice r´ esultat} pour i de 1 ` a n faire pour j de 1 ` a n faire aij :=si gij = 1 alors eij sinon ?? finpour; aii := 0 finpour; pour k de 1 ` a n faire pour i de 1 ` a n faire pour j de 1 ` a n faire a (k) ij = max{a (k?1) ij , a (k?1) ik + a (k?1) kj } retourner(a). La figure 2.2 montre un graphe ´ etiquet´ e par des r´ eels. Les matrices, o` u ?? est 1 2 3 4 5 1 -3 2 2 1 -4 3 Figure 2.2: Un graphe ´ etiquet´ e. cod´ e par un tiret, calcul´ ees par la proc´ edure Floyd(G) sont les suivantes : a(0) = ? ? ? ? ? ? 0 1 ? ? ? ? 0 2 ? ? ?3 ? 0 2 1 ? ? ? 0 ?4 ? ? ? 3 0 ? ? ? ? ? ? a(1) = ? ? ? ? ? ? 0 1 ? ? ? ? 0 2 ? ? ?3 ?2 0 2 1 ? ? ? 0 ?4 ? ? ? 3 0 ? ? ? ? ? ? a(2) = ? ? ? ? ? ? 0 1 3 ? ? ? 0 2 ? ? ?3 ?2 0 2 4 ? ? ? 0 ?4 ? ? ? 3 0 ? ? ? ? ? ? Version 6 f´ evrier 2005 4.2. Accessibilit´ e 85 a(3) = ? ? ? ? ? ? 0 1 3 5 4 ?1 0 2 4 3 ?3 ?2 0 2 1 ? ? ? 0 ?4 ? ? ? 3 0 ? ? ? ? ? ? a(4) = ? ? ? ? ? ? 0 1 3 5 4 ?1 0 2 4 3 ?3 ?2 0 2 1 ? ? ? 0 ?4 ? ? ? 3 0 ? ? ? ? ? ? a(5) = ? ? ? ? ? ? 0 1 3 7 4 ?1 0 2 6 3 ?3 ?2 0 4 1 ? ? ? 0 ?4 ? ? ? 3 0 ? ? ? ? ? ? Langage des chemins d?un graphe ´ etiquet´ e Nous consid´ erons ici un alphabet A et prenons pour E l?ensemble des parties non vides de A. L?ensemble des ´ etiquettes d?un chemin de i ` a j est le langage produit des ´ etiquettes associ´ ees aux arcs successifs du chemin. Nous appelons alors langage des chemins de i ` a j, et nous notons Lij l?ensemble des ´ etiquettes des chemins de i ` a j. Le probl` eme consiste alors ` a d´ eterminer pour chaque couple (i, j) le langage Lij. Ce probl` eme est classique dans le cadre de la th´ eorie des automates, on peut en particulier se servir de la construction it´ erative des Lij r´ ealis´ ee par l?algorithme dans la preuve du th´ eor` eme de Kleene (voir chapitre 9). Nous notons L (k) ij le langage des chemins de i ` a j dont l?int´ erieur est inclus dans E(k) et nous prenons pour k = 0 les valeurs initiales suivantes : L (0) ij = Aij si i = j Aij ? {1} sinon o` u 1 repr´ esente le mot vide et Aij est l?ensemble des ´ etiquettes des arcs de i ` a j. La proposition suivante permet alors le calcul des langages L (k) ij : Proposition 2.5. Pour tout i, j, k ? S, on a L (k) ij = L (k?1) ij ? L (k?1) ik L (k?1) kk ? L (k?1) kj . Preuve. Un mot du second membre est soit dans L (k?1) ij , soit dans l?ensemble L (k?1) ik (L (k?1) kk )? L (k?1) kj . Dans le premier cas le mot appartient ` a L (k) ij , dans le se- cond cas, il s?´ ecrit uvw o` u u appartient ` a L (k?1) ik , v ` a (L (k?1) kk )? et w ` a L (k?1) kj . Par d´ efinition u est donc une ´ etiquette d?un chemin de i ` a k dont l?int´ erieur est inclus dans E(k ? 1), v est la concat´ enation d?un nombre fini d?´ etiquettes de circuits de k ` a k dont l?int´ erieur est inclus dans E(k ? 1), enfin v est l?´ etiquette d?un chemin de k ` a j dont l?int´ erieur est inclus dans E(k ? 1). Le mot form´ e par la concat´ enation de u, v et w est alors une ´ etiquette du chemin obtenu par concat´ enation des chemins associ´ es. R´ eciproquement, consid´ erons un mot u ? L (k) ik . Si l?int´ erieur de ce chemin ne contient pas k, u appartient par d´ efinition ` a L (k?1) ij ; si l?int´ erieur de ce chemin contient k, ce chemin est form´ e de la concat´ enation d?un chemin de i ` a k (premier passage par k en tant que sommet interm´ ediaire), d?une suite finie (´ eventuellement Version 6 f´ evrier 2005 86 Chapitre 4. Graphes vide) de chemins de k ` a k (associ´ es ` a tous les passages successifs par k en tant que sommet interm´ ediaire) et d?un dernier chemin de k ` a j. Par construction, l?int´ erieur de tous ces chemins est inclus dans E(k ? 1). Le mot u est donc la concat´ enation d?un mot de L (k?1) ik , d?une suite de mots de L (k?1) kk et d?un mot de L (k?1) kj . Nous pouvons donc d´ eduire de la proposition pr´ ec´ edente que, quel que soit le couple (i, j), le langage des chemins de i ` a j est obtenu ` a partir des langages r´ eduits aux lettres de A par une suite finie d?op´ erations d?union, concat´ enation et ´ etoile. 4.2.3 Semi-anneaux et accessibilit´ e Un ensemble K muni de deux op´ erations binaires associatives ? et ? et de deux ´ el´ ements distingu´ es 0 et 1 est un semi-anneau si 1. (K, ?, 0) est un mono¨ ?de commutatif, c?est-` a-dire a?b=b?a pour a, b ? K et a ? 0=0 ? a=a pour tout a dans K ; 2. (K, ?, 1) est un mono¨ ?de et a ? 1=1 ? a=a pour tout a dans K ; 3. l?op´ eration ? est distributive par rapport ` a ?, c?est-` a-dire : a ? (b ? c)= (a ? b) ? (a ? c) et (a ? b) ? c=(a ? c) ? (a ? b); 4. l?´ el´ ement 0 est un z´ ero pour l?op´ eration ? : 0 ? a=a ? 0=0. On note (K, ?, ?, 0, 1) un semi-anneau. Par exemple (N, +, ×, 0, 1) est un semi- anneau. Un semi-anneau (K, ?, ?, 0, 1) est complet si toute famille {ai}i?I d?´ el´ e- ments de K admet une somme not´ ee i?I ai sujette aux conditions suivantes : a) si I est fini, I = {i1, . . . , in}, alors i?I ai = ai1 ? ai2 . . . ? ain ; b) la somme est associative : si I = j?J Ij, avec Ij ? Ik = ? pour j = k, alors : i?I ai = j?J ( i?Ij ai) c) l?op´ eration ? est distributive par rapport ` a ?, c?est-` a-dire : ( i?I ai) ? ( j?J bj) = i?I j?J (ai ? bj). Cette d´ efinition de la compl´ etude est assez lourde, il suffit de retenir que les sommes infinies sont autoris´ ees et que l?on peut les manipuler comme des sommes finies. Version 6 f´ evrier 2005 4.2. Accessibilit´ e 87 Exemples. 1) Le semi-anneau de Boole (B, ?, ?, 0, 1), avec B = {0, 1} est complet. On a : i?I ai = 1 s?il existe i ? I tel que ai = 1; 0 sinon. 2) Soit N = N?{+?}, avec a+(+?) = (+?)+a = +?. Alors (N , min, +, ?, 0) est un semi-anneau complet. La distributivit´ e s?exprime par : a + min{b, c} = min{a + b, a + c}. 3) Soit A un alphabet (voir chapitre 9) et A? l?ensemble des mots sur A. Alors (P(A? ), ?, ·, ?, ) est un semi-anneau complet. 4) Soit R = R?{+?, ??}, avec (+?)+(??) = +?. Alors (R, min, +, +?, 0) est un semi-anneau complet. 5) Soit N = N?{+?}. Alors (N , max, min, 0, +?) est un semi-anneau complet. On a max{a, +?} = +?, max{0, a} = a et min{a, max{b, c}} = max{min{a, b}, min{a, c}}. Dans un semi-anneau complet, on d´ efinit l?´ etoile a? d?un ´ el´ ement a par : a? = 1 ? a ? a2 ? . . . ? an ? . . . avec a0 = 1, et an+1 = a ? an . Dans le semi-anneau de Boole, on a a? = 1 pour tout a. Dans celui de l?exemple 2), on a a? = 0. Dans celui de l?exemple 4), on a a? = min n?N na = 0 si a ? 0, ?? sinon. Les co? uts des chemins Soit maintenant G = (S, A) un graphe et soit K un semi-anneau complet. Soit c : A ? K une application qui ` a un arc u de A associe son co? ut c(u). On ´ etend c aux chemins comme suit : si ? = (x0, . . . , xn) est un chemin, alors c(?) = c(x0, x1) ? c(x1, x2) ? . . . ? c(xn?1, xn). (Notons que pour n = 0, c(?) = 1). Si ? est un ensemble de chemins, on pose : c(?) = ??? c(?) (et en particulier c(?) = 0). Le probl` eme g´ en´ eral qui nous int´ eresse est le calcul des ´ el´ ements cij = ???ij c(?) Version 6 f´ evrier 2005 88 Chapitre 4. Graphes o` u ?ij est l?ensemble des chemins de i ` a j dans G. Revenons sur nos exemples. Soit G = (S, A) un graphe. 1) Avec le semi-anneau de Boole, fixons le co? ut d?un arc ´ egal ` a 1. On a alors : cij = 1 si ?ij = ?, 0 sinon. Ainsi, cij = 1 si et seulement si j est accessible de i. 2) Avec le semi-anneau de Floyd (N , min, +, ?, 0), le co? ut d?un chemin est la somme des co? uts des arcs successifs qui le composent, le co? ut cij est le minimum des co? uts des chemins de i ` a j. Ce co? ut est +? s?il n?y a pas de chemin de i ` a j. 3) Avec la terminologie du chapitre 9, cij est l?ensemble des mots qui sont les ´ etiquettes d?un chemin de i ` a j. 4) Avec le semi-anneau (R, min, +, +?, 0), ` a nouveau cij est le minimum des co? uts des chemins de i ` a j. Notons que s?il existe un circuit de co? ut n´ egatif passant par le sommet i, alors cii = ??. 5) Appelons capacit´ e d?un arc u le nombre c(u). La capacit´ e d?un chemin est la capacit´ e minimale des arcs qui le composent et pour deux sommets i et j, cij est la capacit´ e maximale d?un chemin de i ` a j. Nous allons voir que l?algorithme de Roy-Warshall (voir section 4.2.1) s?´ etend au calcul des valeurs cij. Soit G = (S, A), avec S = {1, . . . , n}. Rappelons que E(k) = {1, . . . , k} et que I(?) est l?int´ erieur d?un chemin ?. Notons ?k ij l?ensemble des chemins ? dont l?int´ erieur est contenu dans E(k). Soit c : A ? K une fonction de co? ut dans un semi-anneau complet K. On pose : ck ij = c(?k ij) = ???k ij c(?). Lemme 2.6. On a, pour i et j, dans S ck ij = ck?1 ij ? ck?1 ik ? ck?1 kk ? ? ck?1 kj . (2.1) Preuve. Notons D le membre droit de l?´ equation 2.1. On a en vertu de la dis- tributivit´ e g´ en´ eralis´ ee ck?1 kk ? = m?N {?1,...,?m}??k?1 kk c(?1) ? c(?2) . . . ? c(?m) et par cons´ equent D = ???k?1 ij c(?)? ???k?1 ik ,???k?1 kj m?N ?1,...,?m??k?1 kk c(?)?c(?1)?c(?2) . . .?c(?m)?c(?). Version 6 f´ evrier 2005 4.2. Accessibilit´ e 89 Tout chemin ? ? ?k ij est soit chemin de ?k?1 ij , soit se d´ ecompose de mani` ere unique en ? = ?(?1, . . . , ?m)?, o` u ? ? ?k?1 ik , ? ? ?k?1 kj , m ? N, ?1, . . . , ?m ? ?k?1 kk . D?o` u le r´ esultat. Dans les cas particuliers des semi-anneaux K tels que a? = 1 pour tout a ? K, la formule 2.1 se simplifie en : ck ij = ck?1 ij ? ck?1 ik ? ck?1 kj . Il en est ainsi pour l?accessibilit´ e et pour les plus courts chemins sans circuit de co? ut n´ egatif. Dans ce cas la proposition 2.2 reste vraie et l?algorithme de Roy- Warshall se transpose directement en rempla¸ cant l?avant-derni` ere ligne par : ak ij := ak?1 ij ? (ak?1 ik ? ak?1 kj ). On obtient alors le th´ eor` eme : Th´ eor` eme 2.7. Le calcul des cij, pour i, j ? S, se fait par l?algorithme de Roy-Warshall en O(n3 ) op´ erations ?, ? et ?, o` u n est le nombre de sommets du graphe. Preuve. (imm´ ediate d?apr` es ce qui pr´ ec` ede.) 4.2.4 Forte connexit´ e Soit G = (S, A) un graphe orient´ e. La relation d?accessibilit´ e d´ efinie pr´ ec´ e- demment est un pr´ eordre sur S (r´ eflexive et transitive). Si l?on note ? cette relation, la relation d?´ equivalence sur S induite par ce pr´ eordre, que l?on notera ? est d´ efinie par : i ? j si i ? j et j ? i. Les classes d?´ equivalence de la relation ? s?appellent les composantes fortement connexes de G. Deux sommets distincts appartiennent ` a une m? eme classe si et seulement s?ils appartiennent ` a un m? eme circuit. La relation induite par ? sur l?ensemble quotient des classes d?´ equivalence d´ efinit le graphe quotient de G par ?. On appelle alors graphe r´ eduit de G le graphe obtenu ` a partir du graphe quotient en supprimant ses boucles. Ce graphe est sans circuit car l?existence d?un circuit passant par deux classes distinctes ? et ? entra? ?nerait l?´ equivalence pour ? d?un sommet quel- conque de ? et d?un sommet quelconque de ?, d?o` u la contradiction. Le graphe de la figure 2.3 poss` ede deux composantes fortement connexes C = {1, 2, 3} et C = {4, 5}. La d´ etermination des composantes fortement connexes d?un graphe est un probl` eme fr´ equent dans l?analyse des graphes d?´ etat (cha? ?nes de Markov, r´ eseaux de Petri,... ) mod´ elisant l?´ evolution d?un syst` eme. On distingue alors sou- vent les classes finales qui correspondent aux sorties du graphe r´ eduit (d` es que l?´ etat du syst` eme est un sommet d?une classe finale, les ´ etats post´ erieurs appar- tiendront ` a cette classe) et les autres dont les sommets sont dits transitoires . Pour l?exemple de la figure 2.3, C est la seule classe finale et les ´ etats {1, 2, 3} sont transitoires. On verra au paragraphe 4.4.5 un algorithme efficace de calcul des composantes fortement connexes. Version 6 f´ evrier 2005 90 Chapitre 4. Graphes 1 2 3 4 5 C' C" Figure 2.3: Un graphe orient´ e et son graphe r´ eduit. 4.3 Arbres et arborescences Les arbres repr´ esentent une structure minimale en nombre de liaisons pour con- necter un ensemble de sommets. A ce titre, ils constituent une classe fondamentale de graphes intervenant dans de nombreux probl` emes d?optimisation de r´ eseaux. Les arborescences fournissent des structures de donn´ ees ` a la base de nombreux algorithmes performants. 4.3.1 Arbres Nous consid´ erons dans ce paragraphe des graphes non orient´ es, et nous rappelons que dans un graphe non orient´ e, la longueur d?un cycle est sup´ erieure ou ´ egale ` a trois. Soit G un graphe ` a n sommets (n ? 1); nous allons prouver que les six propri´ et´ es ci-dessous sont ´ equivalentes. Un graphe v´ erifiant l?une de ces propri´ et´ es est un arbre. 1) G est un graphe connexe sans cycle; 2) G est un graphe connexe poss´ edant n ? 1 ar? etes; 3) G est un graphe sans cycle poss´ edant n ? 1 ar? etes; 4) G est un graphe tel que deux sommets quelconques sont li´ es par une seule cha? ?ne; 5) G est un graphe connexe qui perd sa connexit´ e par suppression d?une ar? ete quelconque; 6) G est un graphe sans cycle tel que l?adjonction d?une ar? ete quelconque cr´ ee un cycle et un seul. Pour d´ emontrer l?´ equivalence de ces d´ efinitions, deux lemmes pr´ eliminaires seront utiles. Lemme 3.1. Un graphe connexe ` a n sommets poss` ede au moins n ? 1 ar? etes. Preuve. (Induction sur n.) La propri´ et´ e est vraie pour n = 1. Supposons n ? 2 et soit G = (S, A) un graphe connexe ` a n sommets. Consid´ erons un sommet u de S. Notons Gu le sous-graphe de G induit par S ? {u} et soient C1,C2,...,Cp Version 6 f´ evrier 2005 4.3. Arbres et arborescences 91 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Figure 3.1: Un arbre ` a quatorze sommets. les composantes connexes de Gu. Sur la figure 3.2 sont repr´ esent´ es ` a gauche un graphe orient´ e G et ` a droite le graphe Gu. Pour tout k = 1, . . . , p, il existe au moins une ar? ete liant u ` a un sommet de Ck, sinon G ne serait pas connexe. D?autre part les sous-graphes Gk de G induits par les Ck sont connexes. On a donc par induction mk ? nk ?1, o` u nk (respectivement mk) d´ esigne le nombre de sommets (respectivement d?ar? etes) de Gk . Il en r´ esulte que : m ? ( p k=1 mk) + p ? p k=1 nk = n ? 1. Lemme 3.2. Un graphe ` a n sommets ayant au moins n ar? etes poss` ede un cycle. Preuve. (Induction sur n.) La propri´ et´ e est vraie pour n ? 3. Soit donc n ? 4 et G = (S, A) un graphe ` a n sommets poss´ edant m ar? etes (m ? n). Supposons en raisonnant par l?absurde que G soit sans cycles et consid´ erons un sommet u de S. Notons Gu le sous-graphe de G induit par S ? {u}, C1,C2,...,Cp les composantes connexes de Gu et Gk le sous-graphe de G induit par Ck (voir figure 3.2). Chaque Gk est sans cycle, donc mk ? nk ? 1 et le nombre d?ar? etes incidentes ` a u est m ? p k=1 mk ? m + p ? p k=1 nk ? p + 1. Il existe donc un k dans {1, . . . , p} tel que u soit adjacent ` a deux sommets distincts a et b de Ck. Le graphe Gk ´ etant connexe, il existe une cha? ?ne de a ` a b dans Gk et donc un cycle dans G passant par u, a et b. Proposition 3.3. Soit G un graphe ` a n sommets, les six propri´ et´ es suivantes sont ´ equivalentes : (1) G est un graphe connexe sans cycle; (2) G est un graphe connexe poss´ edant n ? 1 ar? etes; (3) G est un graphe sans cycle poss´ edant n ? 1 ar? etes; (4) G est un graphe tel que deux sommets quelconques sont li´ es par une seule cha? ?ne; Version 6 f´ evrier 2005 92 Chapitre 4. Graphes C C C 1 2 3 u C C C 1 2 3 Figure 3.2: Le graphe Gu. (5) G est un graphe connexe qui perd la connexit´ e par suppression d?une ar? ete quelconque; (6) G est un graphe sans cycle tel que l?adjonction d?une ar? ete quelconque cr´ ee un cycle et un seul. Preuve. Nous montrons que 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 1. 1 ? 2. Soit G un graphe ` a n sommets connexe et sans cycle. D?apr` es le lemme 1, on a m ? n ? 1 et d?apr` es le lemme 2 on a m ? n ? 1, d?o` u il r´ esulte que m = n ? 1. 2 ? 3. Un graphe G connexe et poss´ edant n?1 ar? etes est sans cycle car dans le cas contraire, la suppression d?une ar? ete quelconque du cycle entra? ?nerait l?existence d?un graphe connexe ` a n sommets et n ? 2 ar? etes. 3 ? 4. Supposons qu?un graphe G ` a n ? 1 ar? etes soit sans cycle et ne soit pas connexe. Le graphe induit par chaque composante connexe qui est connexe et sans cycle poss` ede un sommet de plus que d?ar? etes. Le nombre de composantes connexes de G ´ etant au moins deux, le graphe G lui m? eme poss` ede au plus n ? 2 ar? etes. De plus l?existence de deux cha? ?nes distinctes entre deux sommets entra? ?ne celle d?un cycle dans G. 4 ? 5. Soit G un graphe tel que pour toute paire de sommets, il existe une cha? ?ne et une seule ayant ces deux sommets pour extr´ emit´ es. Le graphe G est bien s? ur connexe. Si G ne perdait pas la connexit´ e par suppression d?une ar? ete {a, b}, une cha? ?ne n?utilisant pas cette ar? ete lierait a et b, ce qui contredit l?hypoth` ese d?unicit´ e de la cha? ?ne liant a et b. 5 ? 6. Si G est connexe et perd la connexit´ e par suppression d?une ar? ete quel- conque, il est sans cycle car dans le cas contraire, la suppression d?une ar? ete du cycle ne lui ferait pas perdre la connexit´ e. De plus l?adjonction d?une ar? ete {a, b} cr´ ee un cycle puisqu?il existe d´ ej` a une cha? ?ne liant a et b dans G. Ce cycle passe par l?ar? ete {a, b} puisque G est sans cycle. De plus si l?adjonction de {a, b} cr´ eait deux cycles distincts, il existerait dans G deux cha? ?nes distinctes de a ` a b et donc un cycle. 6 ? 1. Si l?adjonction d?une ar? ete quelconque {a, b} cr´ ee un cycle, G est connexe car dans le cas contraire, l?adjonction d?une ar? ete entre deux sommets appartenant Version 6 f´ evrier 2005 4.3. Arbres et arborescences 93 ` a deux composantes connexes distinctes ne cr´ eerait pas de cycles. 4.3.2 Arborescences On obtient une arborescence ` a partir d?un arbre en distinguant l?un de ses som- mets. Une arborescence est donc un couple form´ e d?un arbre H et d?un sommet distingu´ e r appel´ e racine. Une arborescence (H, r) peut aussi ? etre d´ efinie na- turellement en tant que graphe orient´ e en substituant l?arc (u, v) ` a l?ar? ete {u, v} si la cha? ?ne de r ` a v dans H passe par u, l?arc (v, u) sinon. Une arborescence de racine r est alors un graphe orient´ e tel qu?il existe un chemin unique de r ` a n?importe quel sommet. L?une des propri´ et´ es les plus importantes d?une arborescence est sa structure r´ ecursive que nous mettons en ´ evidence par le lemme suivant : Lemme 3.4. Soit A = (H, r) une arborescence poss´ edant au moins deux som- mets, Hr le graphe induit par S ? {r} et r1, . . . , rk les sommets adjacents ` a la racine. Les sous-graphes induits par les composantes connexes de Hr constituent k arbres disjoints contenant chacun un et un seul des sommets ri. Preuve. Chaque composante connexe de Hr contient un et un seul ri car H ne poss` ede pas de cycle. Les k sous-graphes induits par ces composantes qui sont connexes et sans cycle sont des arbres disjoints. La figure 3.3 illustre la structure r´ ecursive d?une arborescence. 6 7 1 3 5 2 A(7) A(3) A(4) A(2) 1 2 3 4 5 6 7 Arborescence A=(H,6) 4 Figure 3.3: Structure r´ ecursive d?une arborescence. Etant donn´ ee l?importance des structures arborescentes, certaines notations sp´ eci- fiques ont ´ et´ e cr´ e´ ees. Les ascendants et lesdescendants d?un sommet ont leur d´ efinition usuelle pour l?arborescence consid´ er´ ee comme un graphe orient´ e. Tout sommet s (sauf la racine) a un pr´ ed´ ecesseur unique not´ e p(s) et appel´ e p` ere de s. Inversement les successeurs d?un sommet s sont ses fils. Si le sommet s n?a pas de fils, il est appel´ e feuille (ou encore sommet externe, dans le cas contraire, c?est un Version 6 f´ evrier 2005 94 Chapitre 4. Graphes noeud (ou encore sommet interne). La profondeur d?un sommet est la longueur du chemin de la racine ` a ce sommet. La hauteur d?un sommet u est la longueur maximale d?un chemin d?origine u. Si u et v sont deux sommets, l?anc? etre de u et v est l?ascendant commun de u et v de profondeur maximale. Par conformit´ e avec les six d´ efinitions initiales (en particulier : m = n ? 1), tous les arbres que nous avons d´ efinis jusqu?ici poss` edent au moins un sommet. Il est cependant commode, surtout dans le cadre des applications informatiques li´ ees aux structures de donn´ ees et leur programmation (par exemple l?utilisation du pointeur nil du langage Pascal), de consid´ erer qu?un arbre vide est aussi un arbre. Sauf mention contraire, nous adopterons d´ esormais cette convention et noterons ? une arborescence vide. 4.3.3 Arborescences ordonn´ ees Il est souvent utile de d´ efinir pour chaque sommet d?une arborescence un ordre total sur les fils de ce sommet. C?est par exemple le cas pour les arbres 2-3 (voir chapitre 6) ou encore les arbres de d´ erivation dans une grammaire. Si l?on adjoint ` a chaque sommet interne d?une arborescence un ordre total sur les fils de ce sommet, on d´ efinit une arborescence ordonn´ ee. Les relations d?ordre locales permettent de munir l?ensemble des sommets de l?arborescence d?un ordre total. Soit A une arborescence ordonn´ ee, la liste L repr´ esentant l?ordre total sur les sommets de A est construite r´ ecursivement comme suit : si A est l?arborescence vide, la liste L est vide; sinon soient L1, . . . , Lk les listes associ´ ees aux ordres totaux pour les sous-arborescences de racines r1, . . . , rk et (r1, . . . , rk) la liste associ´ eee ` a l?ordre total sur les fils r1, . . . , rk de la racine, la liste L est ´ egale ` a (r) · L1 · L2 · · · Lk o` u l?on note L · L la concat´ enation des deux listes L et L . Remarque. La liste associ´ ee ` a l?ordre total sur les sommets d?une arborescence ordonn´ ee est une liste pr´ efixe au sens d´ efini dans la section 4.4.5. a b c d e f g h i j k l Figure 3.4: Une arborescence. Version 6 f´ evrier 2005 4.3. Arbres et arborescences 95 La figure 3.4 repr´ esente une arborescence ordonn´ ee dans laquelle, comme il est d?usage, les fils d?un m? eme sommet sont dessin´ es de la gauche vers la droite dans l?ordre croissant. L?ordre total est donc (a, b, d, e, i, j, f, c, g, h, k, l). 4.3.4 Arbres positionn´ es et arbres binaires Un arbre positionn´ e d?arit´ e p est une arborescence telle que les arcs liant les fr` eres d?un m? eme sommet ` a leur p` ere sont ´ etiquet´ es par des ´ el´ ements distincts de l?ensemble {1, . . . , p}. On parle alors du ki` eme fils si l?arc a l?´ etiquette k. Un arbre positionn´ e d?arit´ e p est complet si chacun de ses noeuds poss` ede p fils. Un arbre binaire est un arbre positionn´ e d?arit´ e 2. Au lieu de l?´ etiqueter sur {1, 2}, il est plus parlant d?utiliser les ´ etiquettes gauche et droit . Chaque n?ud poss` ede donc soit un fils droit , soit un fils gauche , soit les deux. Une d´ efinition r´ ecursive des arbres binaires, fondamentale dans les applications informatiques, s?´ enonce comme suit : (1) l?arbre vide est un arbre binaire; (2) soient A1 et A2 deux arbres binaires et s un sommet n?appartenant ni ` a A1 ni ` a A2, alors l?arborescence de racine s, de sous-arbre gauche A1 et de sous-arbre droit A2 est un arbre binaire. La distinction entre fils gauche et fils droit entra? ?ne quelques notations suppl´ e- mentaires. Soit A un arbre binaire complet et u l?un de ses sommets internes, Ag(u) (respectivement Ad(u)) d´ esigne le sous-arbre de A dont la racine est le fils gauche de u (respectivement le fils droit de u). Si u est la racine on note Ag (respectivement Ad) le sous-arbre gauche (respectivement le sous-arbre droit) de A. Le sous-arbre de racine u est not´ e A(u). La figure 3.5 pr´ esente un exemple d?arbre binaire. 4.3.5 Arbre binaire complet Un arbre binaire complet est un arbre binaire non vide et complet, c?est-` a-dire tel que chaque noeud poss` ede z´ ero ou deux fils. La figure 3.5 repr´ esente un arbre binaire complet. La d´ efinition r´ ecursive suivante des arbres binaires complets est ´ egalement tr` es utile : (1) une arborescence r´ eduite ` a sa racine est un arbre binaire complet; (2) soient A1 et A2 deux arbres binaires complets et s un sommet n?appar- tenant ni ` a A1 ni ` a A2, l?arborescence A de racine s, de sous-arbre gauche A1 et de sous-arbre droit A2 est un arbre binaire complet. La figure 3.6 montre les premiers arbres binaires complets. La proposition simple qui suit illustre le raisonnement par induction fr´ equemment pratiqu´ e sur les arbres binaires complets. Proposition 3.5. Un arbre binaire complet ` a p (p ? 1) sommets externes poss` ede p ? 1 sommets internes. Version 6 f´ evrier 2005 96 Chapitre 4. Graphes 1 2 3 6 7 8 9 Un arbre binaire Un arbre binaire complet Sommets externes cerclés 4 5 Figure 3.5: Arbre binaire et arbre binaire complet. aucun n?ud un n?ud deux n?uds trois n?uds Figure 3.6: Les premiers arbres binaires complets. Preuve. (Induction sur p.) Si p = 1, l?arbre binaire complet est r´ eduit ` a un sommet qui est externe et la propri´ et´ e est vraie. Soient p ? 2 et A un arbre binaire complet ` a p sommets externes. L?arbre A est form´ e d?une racine r, d?un sous-arbre gauche A1 qui est un arbre binaire complet ` a p1 sommets externes (p1 ? 1) et d?un sous- arbre droit A2 qui est un arbre binaire complet ` a p2 sommets externes (p2 ? 1). On a p1 + p2 = p et par r´ ecurrence le nombre de sommets internes de A1 est donc p1 ? 1 et celui de A2 est p2 ? 1. Le nombre de sommets internes de A est donc 1 + (p1 ? 1) + (p2 ? 1) = p ? 1. Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 97 Les arbres binaires complets ne constituent en fait qu?une repr´ esentation plus structur´ ee des arbres binaires. En effet, l?op´ eration d?effeuillage permet d?associer ` a un arbre binaire complet un arbre binaire (sous-jacent). L?image r´ esultant de l?effeuillage d?un arbre binaire complet A est le sous-graphe de A induit par ses sommets internes. L?effeuillage n?est pas une op´ eration injective mais on peut montrer que tous les arbres binaires complets ayant la m? eme image sont isomor- phes. Ils ne diff` erent en fait que par les noms des feuilles supprim´ ees. La figure 3.7 repr´ esente un arbre binaire complet et ` a sa droite l?arbre effeuill´ e. 5 1 2 3 4 6 7 8 9 Un arbre binaire complet 1 2 4 7 L'arbre binaire effeuillé Figure 3.7: Effeuillage d?un arbre binaire complet. L?op´ eration r´ eciproque appel´ ee compl´ etion consiste ` a compl´ eter ` a deux le nombre de fils de chaque sommet de A. Cette d´ efinition ne pr´ ecise cependant pas la r` egle de choix des noms des nouveaux sommets. La figure 3.8 montre l?op´ eration de compl´ etion. 4.4 Parcours d?un graphe 4.4.1 Parcours d?un graphe non orient´ e Dans cette section nous consid´ erons un graphe non orient´ e connexe G = (S, A). Un parcours de G ` a partir de l?un de ses sommets s est une liste de sommets L telle que : ? le premier sommet de L est s, ? chaque sommet de S appara? ?t une fois et une seule dans L, ? tout sommet de la liste (sauf le premier) est adjacent ` a au moins un sommet plac´ e avant lui dans la liste. Nous pr´ esentons d?abord un algorithme g´ en´ erique de calcul d?un parcours. Nous ´ etudions ensuite les deux types de parcours les plus utilis´ es : les parcours en profondeur et les parcours en largeur. Version 6 f´ evrier 2005 98 Chapitre 4. Graphes Arbre binaire 1 2 3 4 5 6 1 2 3 4 5 6 Arbre binaire complété Figure 3.8: Compl´ etion d?un arbre binaire. D´ efinitions et notations Soit T une partie non vide de S, la bordure B(T) de T est l?ensemble des sommets de S ? T adjacents ` a T. Pour le graphe de la figure 4.1, la bordure de {3, 5, 6} est {1, 2, 4}. Soit L une liste de sommets de G. Le support de L, not´ e ?(L), est l?ensemble des sommets pr´ esents dans la liste (par exemple ?(1, 2, 1, 3, 5, 3, 3) = {1, 2, 3, 5}). La liste des k premiers sommets de L est not´ ee Lk. Un sommet u de L est ferm´ e si tous ses voisins dans G appartiennent ` a ?(L), dans le cas contraire il est ouvert. Comme les listes qui interviennent dans ce chapitre ne contiennent qu?une seule occurrence de chaque ´ el´ ement de leur support, nous utiliserons la notation (abusive mais plus simple) B(L) ` a la place de B(?(L)). 5 6 3 4 1 2 7 Figure 4.1: Bordure d?un sous-ensemble de sommets. Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 99 Algorithme g´ en´ erique et propri´ et´ es des parcours Nous donnons dans cette section un algorithme g´ en´ erique de construction d?un parcours. Nous pr´ esentons ensuite les propri´ et´ es fondamentales des parcours et nous proposons un premier niveau d?impl´ ementation de l?algorithme g´ en´ erique. Consid´ erons la proc´ edure Parcours-g´ en´ erique(G, s) ci-dessous : proc´ edure Parcours-g´ en´ erique(G, s); L := (s); pour k de 1 ` a n ? 1 faire choisir un sommet v dans B(L); L := L · (v) fintantque. La proposition suivante ´ etablit l?´ egalit´ e entre l?ensemble des listes construites par la proc´ edure et l?ensemble des parcours de G. Proposition 4.1. Les parcours de G sont exactement les listes construites par Parcours-g´ en´ erique(G, s). Preuve. Soit L une liste de Parcours-g´ en´ erique(G, s). Montrons par induc- tion sur le nombre d?it´ erations que la liste Lk obtenue apr` es k it´ erations satisfait l?invariant suivant : Lk est un parcours du sous-graphe de G induit par ?(Lk) . La propri´ et´ e est vraie pour k = 0. Consid´ erons l?it´ eration k (0 < k ? n?1) et soit u un sommet de l?ensemble non vide S ??(Lk?1). Comme G est connexe, il existe une cha? ?ne ´ el´ ementaire du sommet s de ?(Lk?1) au sommet u de S??(Lk?1) dont l?une des ar? etes {x, y} v´ erifie x ? S??(Lk?1) et y ? ?(Lk?1). Le choix du sommet x est donc possible ` a l?it´ eration k tant que k < n. Comme d?une part Lk?1 est un parcours du sous-graphe de G induit par ?(Lk?1) (hypoth` ese d?induction) et que d?autre part le sommet x appartient ` a B(Lk?1), la liste Lk = Lk?1 ·(x) est un parcours du sous-graphe de G induit par ?(Lk) = ?(Lk?1) ? {x}. La liste Ln?1 est donc un parcours de G. R´ eciproquement soit L = (x1, . . . , xn) un parcours de G ` a partir de s. Par d´ efinition d?un parcours, xk+1 appartient ` a B({x1, . . . , xk}) = B(Lk?1) pour k de 1 ` a n ? 1. L est donc aussi la liste obtenue par Parcours-g´ en´ erique en choisissant le sommet xk+1 ` a l?it´ eration k. Soit L = (x1, . . . , xn) un parcours de G. Si nous associons ` a chaque sommet xk (k ? {2, . . . , n}) un sommet xk appartenant ` a B({xk}) ? {x1, . . . , xk?1}, le sous- graphe de G induit par les ar? etes {xk, xk}, appel´ ees ar? etes de liaison, est un arbre couvrant de G. Cette propri´ et´ e est tr` es importante car elle montre qu?un parcours emprunte un nombre minimal d?ar? etes de liaison. Version 6 f´ evrier 2005 100 Chapitre 4. Graphes Proposition 4.2. Soit L = (x1, . . . , xn) un parcours de G. Pour tout k, (2 ? k ? n), soit xk un sommet de {x1, . . . , xk?1} adjacent ` a xk. Le sous-graphe induit par les ar? etes {xk, xk}, (2 ? k ? n), est un arbre couvrant de G. Preuve. Nous notons Gp le sous-graphe de G induit par les ar? etes {xk, xk} (k ? {1, . . . , p}) et nous raisonnons par r´ ecurrence sur p. La propri´ et´ e est vraie pour p = 1 car on a toujours x1 = s, et G1 est donc r´ eduit ` a l?ar? ete {s, x2}. Supposons p ? 2; le graphe Gp est connexe car obtenu par adjonction ` a l?arbre Gp?1 (hypoth` ese d?induction) d?un nouveau sommet xp+1 et d?une nouvelle ar? ete incidente ` a xp+1 et ` a un sommet de Gp?1. Le graphe Gp qui est connexe et poss` ede p ? 1 ar? etes et p sommets (car Gp?1 poss` ede p ? 2 ar? etes et p ? 1 sommets) est donc un arbre. Il en r´ esulte que Gn est un arbre couvrant de G. La figure 4.2 repr´ esente le parcours (1, 3, 4, 6, 7, 2, 5) d?un graphe non orient´ e et montre l?arbre couvrant associ´ e (ar? etes ´ epaisses). 1 3 7 4 6 2 5 Figure 4.2: Parcours d?un graphe et arbre couvrant. Avant d?´ etudier des parcours particuliers, nous proposons une impl´ ementation partielle de l?algorithme g´ en´ erique d´ ecrivant le calcul des sommets ouverts. Nous appelons degr´ e r´ esiduel d?un sommet x, et nous le notons r(x), le nombre de voisins de x qui n?appartiennent pas ` a la liste en cours. Un sommet de la liste en cours (nous dirons encore sommet visit´ e) est donc ouvert si et seulement si son degr´ e r´ esiduel est non nul. Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 101 proc´ edure Parcours(G, s); pour tout sommet x dans S faire r(x) := d(x); Fermer(x) finpour; {d(x) est le degr´ e de x dans G} Ouvrir(s); Examiner-voisins(s); tantqu?il reste un sommet non visit´ e faire choisir une ar? ete de liaison {x, y} o` u x est ouvert et y non visit´ e; L := L · (y); si r(y) > 0 alors ouvrir(y);Examiner-voisins(y) finsi fintantque. A chaque ´ etape, l?algorithme Parcours ci-dessus choisit une ar? ete de liaison {x, y} o` u x est un sommet ouvert et y un sommet non visit´ e, ouvre le sommet y si r(y) > 0 et diminue d?une unit´ e le degr´ e r´ esiduel de chacun des voisins de y dans G. L?algorithme utilise un tableau bool´ een pour g´ erer l?ensemble des sommets visit´ es, un tableau bool´ een pour g´ erer l?ensemble des sommets ouverts, un tableau lin´ eaire pour g´ erer les degr´ es r´ esiduels et une liste des voisins pour coder G. La proc´ edure Examiner-voisins(y) fait la mise ` a jour des degr´ es r´ esiduels et des sommets ouverts ` a chaque visite d?un nouveau sommet. Sa complexit´ e est O(d(y)). proc´ edure Examiner-voisins(y); pour tout voisin z de y dans G faire r(z) := r(z) ? 1; si z est visit´ e et r(z) = 0 alors Fermer(z) finpour. Dans la mesure o` u l?algorithme de choix de l?ar? ete de liaison n?est pas pr´ ecis´ e, il n?est pas possible d?´ evaluer la complexit´ e globale de l?algorithme Parcours. Cependant, comme chaque sommet est visit´ e une fois et une seule, la proc´ edure Examiner-voisins est ´ egalement ex´ ecut´ ee une fois et une seule pour chaque sommet. Il en r´ esulte la proposition suivante : Proposition 4.3. Dans l?algorithme Parcours, la complexit´ e des op´ erations autres que le choix de l?ar? ete de liaison est O(n + m). Nous allons d´ esormais ´ etudier deux types de parcours en particularisant la r` egle de choix des ar? etes de liaison. Version 6 f´ evrier 2005 102 Chapitre 4. Graphes 4.4.2 Parcours en profondeur Un parcours L du graphe G ` a partir de s est dit en profondeur si, ` a chaque ´ etape, l?ar? ete de liaison {x, y} choisie est telle que le sommet x soit le dernier sommet visit´ e ouvert. Une impl´ ementation possible de l?algorithme de choix consiste alors ` a utiliser une pile de sommets visit´ es posss´ edant les propri´ et´ es suivantes : ? tous les sommets ouverts sont dans la pile, ? si un sommet ouvert x a ´ et´ e visit´ e avant un sommet ouvert y, alors y est plac´ e plus haut que x dans la pile. A partir d?une pile contenant initialement le seul sommet s, les op´ erations sur la pile, ` a chaque ´ etape du parcours, sont les suivantes : a) Si le sommet de pile t est ouvert, une ar? ete {t, y} est choisie comme ar? ete de liaison et on empile y; b) Si le sommet de pile est ferm´ e, on proc` ede ` a des d´ epilements tant que le sommet de pile est ferm´ e (et la pile non vide). La proc´ edure Profondeur(G, s) ci-dessous r´ ealise ces op´ erations de pile pour choisir les ar? etes de liaison. proc´ edure Profondeur(G, s); Cr´ eer(?); pour tout sommet x dans S faire r(x) := d(x); Fermer(x) finpour; L := (s); Ouvrir(s); Empiler(s, ?); Examiner-voisins(s); tantque ? est non vide faire t :=Sommet(?); si t est ouvert alors choisir une ar? ete {t, y} telle que y soit non visit´ e; L := L · (y); Empiler(y, ?); si r(y) > 0 alors Ouvrir(y); Examiner-voisins(y) finsi sinon D´ epiler(?) finsi fintantque. Nous proposons au lecteur, ` a titre d?exercice, de d´ emontrer que la pile ? g´ er´ ee par la proc´ edure Profondeur(G, s) poss` ede les deux propri´ et´ es requises. On peut plus pr´ ecis´ ement montrer, par r´ ecurrence sur le nombre de sommets visit´ es, que la liste des sommets contenus de bas en haut dans la pile lors de la visite du sommet x est la liste des sommets du chemin de s ` a x dans l?arborescence de liaison en cours. Cette propri´ et´ e est int´ eressante car elle induit une autre impl´ ementation possible de l?algorithme de choix pour un parcours en profondeur. Il suffit en effet Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 103 de construire la fonction p` ere de l?arborescence de liaison au fur et ` a mesure de la cr´ eation des ar? etes de liaison. Si le sommet visit´ e en cours x est ferm´ e, on utilise alors la fonction p` ere pour remonter au dernier sommet visit´ e ouvert. Sur le graphe de la figure 4.3, la proc´ edure Profondeur calcule le parcours en profondeur (1, 3, 4, 6, 5, 2, 7). Les contenus de la pile et de la liste sont donn´ es 1 3 7 4 6 2 5 Figure 4.3: Parcours en profondeur. dans le tableau ci-dessous. La premi` ere ligne correspond ` a la pile et la seconde ` a la liste : (1) (1,3) (1,3,4) (1,3,4,6) (1,3,4,6,5) (1,3,4,6) (1,3,4,6,2) (1) (1,3) (1,3,4) (1,3,4,6) (1,3,4,6,5) (1,3,4,6,5) (1,3,4,6,5,2) (1,3,4,6) (1,3,4) (1,3) (1) (1,3,4,6,5,2) (1,3,4,6,5,2) (1,3,4,6,5,2) (1,3,4,6,5,2) (1,7) (1) () (1,3,4,6,5,2,7) (1,3,4,6,5,2,7) (1,3,4,6,5,2,7) Proposition 4.4. La complexit´ e en temps de la proc´ edure Profondeur est O(n + m). Preuve. Evaluons d?abord la complexit´ e des op´ erations sur la pile. Comme un sommet est visit´ e une fois et une seule, il est empil´ e une fois et une seule. Il est donc d´ epil´ e au plus une fois et en fait exactement une fois en raison de la condition de terminaison. La complexit´ e des op´ erations sur la pile est donc O(n). Comme la complexit´ e des op´ erations autres que le choix des ar? etes de liaison dans l?algorithme Parcours est O(n + m) (proposition 4.3), la complexit´ e globale de la proc´ edure Profondeur est O(n + m). Nous avons d´ ecrit jusqu?ici des algorithmes it´ eratifs pour le calcul d?un parcours en profondeur ` a partir d?un sommet s. Nous pr´ esentons maintenant un algorithme r´ ecursif qui r´ esout ce probl` eme. Le principe de cet algorithme est de visiter s, puis de r´ ealiser un appel r´ ecursif pour chaque voisin de s non encore visit´ e. Un appel pour un sommet x est terminal si tous les voisins de x sont d´ eja visit´ es. La proc´ edure Profondeur-r´ ecursif ci-dessous impl´ emente cet algorithme. Version 6 f´ evrier 2005 104 Chapitre 4. Graphes proc´ edure Profondeur-r´ ecursif(s); Visiter(s); pour tout voisin x de s faire si x est non visit´ e alors Visiter(x); Profondeur-r´ ecursif(x) finsi finpour. La proc´ edure Visiter(x) met ` a jour le tableau des sommets visit´ es et la liste des sommets visit´ es. Cet algorithme, dont l?analyse est propos´ ee en exercice, a une complexit´ e O(max{n, m}). L?une de ses variantes, utilis´ ee pour le calcul des composantes fortement connexes d?un graphe orient´ e, est ´ etudi´ ee dans la sec- tion 4.4.5. 4.4.3 Parcours en largeur Un parcours L du graphe G ` a partir de s est dit en largeur si, ` a chaque ´ etape, l?ar? ete de liaison {x, y} choisie est telle que le sommet x soit le premier sommet visit´ e ouvert. Une impl´ ementation possible de l?algorithme de choix consiste ici ` a utiliser une file de sommets visit´ es posss´ edant les propri´ et´ es suivantes : ? tous les sommets ouverts sont dans la file, ? si un sommet ouvert x a ´ et´ e visit´ e avant un sommet ouvert y, alors y est plac´ e apr` es x dans la file. A partir d?une file contenant initialement le seul sommet s, les op´ erations sur la file, ` a chaque ´ etape du parcours, sont les suivantes : a) Si la t? ete de file t est un sommet ouvert, une ar? ete {t, y} est choisie comme ar? ete de liaison et l?on enfile y; b) Si la t? ete de file est un sommet ferm´ e, on proc` ede ` a des d´ efilements tant que la t? ete de file est un sommet ferm´ e (et la file non vide). La proc´ edure Largeur(G, s) ci-dessous r´ ealise ces op´ erations de file pour choisir les ar? etes de liaison. Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 105 proc´ edure Largeur(G, s); Cr´ eer(?); pour tout sommet x dans S faire r(x) := d(x); Fermer(x) finpour; L := (s); Ouvrir(s); Enfiler(s, ?); Examiner-voisins(s); tantque ? est non vide faire t :=T? ete(?); si t est ouvert alors choisir une ar? ete {t, y} telle que y soit non visit´ e; L := L · (y); Enfiler(y, ?); si r(y) > 0 alors Ouvrir(y); Examiner-voisins(y) finsi sinon D´ efiler(?) finsi fintantque. Sur le graphe de la figure 4.4, la proc´ edure Largeur calcule le parcours en largeur (1, 7, 4, 3, 6, 5, 2). Par un raisonnement analogue ` a celui fait pour la proc´ edure Profondeur, la complexit´ e de la proc´ edure Largeur est O(n + m). 1 3 7 4 6 2 5 Figure 4.4: Parcours en largeur. Parcours d?un graphe non orient´ e quelconque Consid´ erons le cas o` u le graphe G n?est pas connexe. Un parcours de G est d´ efini comme une liste de sommets telle que : ? chaque sommet de S apparait une fois et une seule dans la liste, ? chaque sommet de la liste (sauf le premier) appartient ` a la bordure du sous-ensemble des sommets plac´ es avant lui dans la liste, si toutefois cette bordure est non vide. La condition de connexit´ e n?est alors plus requise si les sommets de la liste en cours constituent une composante connexe de G. Version 6 f´ evrier 2005 106 Chapitre 4. Graphes Il r´ esulte de cette d´ efinition qu?un parcours de G est une liste L = L1 · L2 · · · Lp o` u les Lj sont des parcours des sous-graphes (connexes) induits par les p com- posantes connexes de G. Les ar? etes de liaison constituent alors une famille de p arbres o` u chaque arbre couvre une composante connexe de G. Le parcours (9, 7, 6, 10, 8, 1, 2, 3, 4, 5) est un parcours en profondeur du graphe de la figure 4.5. Les ar? etes ´ epaisses correspondent ` a des arbres couvrant les deux composantes connexes. 1 2 3 4 5 6 7 8 9 10 Figure 4.5: Un graphe non orient´ e non connexe. 4.4.4 Parcours d?un graphe orient´ e Dans cette section nous consid´ erons un graphe G orient´ e et sans boucles. Pour un graphe orient´ e, la bordure ?(T) d?une partie T de S est le sous-ensemble des sommets de S ? T qui sont les extr´ emit´ es d?un arc dont l?origine est dans T. Si L est une liste de sommets de G, nous noterons encore abusivement ?(L) la bordure du support de L. Un sommet d?une liste L est ferm´ e si tous ses successeurs dans G appartiennent ` a ?(L), dans le cas contraire il est ouvert. Sur l?exemple de la figure 4.6, la bordure de {1, 2} est {3, 4, 5}. 7 2 1 4 6 3 5 Figure 4.6: Bordure pour un graphe orient´ e. Un parcours de G est une liste des sommets de G telle que : ? chaque sommet de S appara? ?t une fois et une seule dans la liste, ? chaque sommet de la liste (sauf le premier) appartient ` a la bordure du sous-ensemble des sommets plac´ es avant lui dans la liste, si toutefois cette bordure est non vide. Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 107 Les propri´ et´ es des parcours des graphes non orient´ es se prolongent au cas orient´ e. La notion d?ar? ete de liaison est remplac´ ee par celle d?arc de liaison. Le graphe partiel des arcs de liaison poss` ede en particulier la propri´ et´ e suivante que nous ´ enon¸ cons sans d´ emonstration : Proposition 4.5. Les arcs de liaison d?un parcours constituent une for? et cou- vrante du graphe G. La liste L=(4, 5, 9, 8, 7, 6, 10, 11, 1, 3, 2) est un parcours du graphe orient´ e de la figure 4.7. La for? et couvrante contient deux arborescences A1 et A2 (en trait plein). 1 2 3 4 5 6 7 8 9 10 11 2 Figure 4.7: Un graphe orient´ e. Parcours en profondeur d?un graphe orient´ e Un parcours de G est dit en profondeur si l?origine de chaque arc de liaison est le dernier sommet ouvert d´ ej` a visit´ e. La proc´ edure Parcours-profondeur-graphe-orient´ e ci-dessous calcule un parcours en profondeur en utilisant essentiellement la proc´ edure Profondeur- r´ ecursif-orient´ e, qui est l?adaptation directe de la proc´ edure Profondeur- r´ ecursif pr´ esent´ ee dans la section 4.4.2 pour le cas non orient´ e. proc´ edure Parcours-profondeur-graphe-orient´ e(G); tant qu?il existe un sommet de G non visit´ e faire choisir un sommet non visit´ e s; Profondeur-r´ ecursif-orient´ e(s) fintantque. La proc´ edure Profondeur-r´ ecursif-orient´ e s?´ ecrit alors : Version 6 f´ evrier 2005 108 Chapitre 4. Graphes proc´ edure Profondeur-r´ ecursif-orient´ e(s) Visiter(s); pour tout successeur x de s faire si x est non visit´ e alors Visiter(x); Profondeur-r´ ecursif-orient´ e(x) finsi finpour. Nous pr´ esentons maintenant quelques propri´ et´ es des parcours en profondeur qui seront particuli` erement utiles au calcul des composantes fortement connexes. Soit L un parcours en profondeur de G. Nous notons F la for? et couvrante induite par L et r(x) le rang d?un sommet x dans la liste L. En dehors des arcs de F, le parcours L permet de distinguer trois autres classes d?arcs dans G. Un arc (x, y) est arri` ere si y est un ascendant de x dans F. Un arc (x, y) est avant si x est un ascendant de y dans F. Un arc (x, y) est transverse si ses deux extr´ emit´ es ap- partiennent ` a deux arborescences diff´ erentes, ou si x et y ont un anc? etre commun z dans F distinct de x et de y. Pour le parcours (4, 5, 9, 8, 7, 6, 10, 11, 1, 3, 2) du graphe de la figure 4.7, les arcs (7, 9), (11, 10) et (2, 1) sont arri` ere, les arcs (6, 5), (1, 5) et (3, 4) sont transverses et il n?y a pas d?arc avant. Le lemme suivant ´ etablit une propri´ et´ e des arcs transverses. Lemme 4.6. Si (x, y) est un arc transverse pour un parcours en profondeur L, alors r(y) < r(x). Preuve. Soit L = L1 ·L2 · · · Lq un parcours en profondeur et soient A1, A2, . . . , Aq les arborescences de la for? et couvrante. Par d´ efinition de L, il n?existe pas d?arc dont l?origine soit dans Ai et l?extr´ emit´ e dans Aj avec i < j. Soit (x, y) un arc transverse tel que x ? Ai et y ? Aj avec i = j. On a n´ ecessairement i > j et donc r(x) > r(y). Soit (x, y) un arc transverse dont les deux extr´ emit´ es x et y appartiennent ` a la m? eme arborescence et soit z ? {x, y} l?anc? etre commun de x et y dans cette arborescence. Si r(x) < r(y), lorsque le sommet x est visit´ e, le sommet y ne l?est pas encore. Il existe donc ` a cette ´ etape du parcours un chemin de sommets non visit´ es de x ` a y. Donc y sera accessible dans l?arborescence ` a partir de x. D?o` u la contradiction. Le classement des arcs de G relativement ` a un parcours en profondeur L fix´ e est ` a la base d?un algorithme performant pour tester si un graphe est sans circuit. En effet, le lemme suivant montre que G poss` ede un circuit si et seulement s?il existe au moins un arc arri` ere. Lemme 4.7. Soient G un graphe orient´ e et L l?un de ses parcours en profondeur. Le graphe G est sans circuit si et seulement s?il n?existe pas d?arc arri` ere. Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 109 Preuve. La condition n´ ecessaire est ´ evidente. Soit ? un circuit de G et supposons qu?il n?existe pas d?arc arri` ere. D?apr` es le lemme 4.6, le circuit ? poss` ede au moins un arc transverse et un arc avant. Consid´ erons alors le sommet z, origine d?un arc avant de ?, dont le rang est minimum et notons y le pr´ ed´ ecesseur de z dans ?. Soit x un sommet de ? distinct de z. Si l?arc de ? d?origine x est transverse, alors, d?apr` es le lemme 4.6 son rang r(x) est plus grand que le rang du premier sommet, origine d?un arc avant, rencontr´ e ` a partir de x sur le circuit; on a donc r(x) > r(z). Si l?arc de ? d?origine x est avant, on a r(x) > r(z) par d´ efinition de z. Donc, lorsque le sommet z est visit´ e, aucun autre sommet de ? n?est encore visit´ e. Il en r´ esulte l?existence dans F d?un chemin de z ` a y. L?arc (y, z) est donc arri` ere et transverse (par d´ efinition de z). Contradiction. Pour tester si un graphe orient´ e est sans circuit, il suffit donc de construire un par- cours en profondeur de ce graphe et de tester si les arcs de G qui n?appartiennent pas ` a la for? et couvrante sont avant ou transverse . La complexit´ e de cet al- gorithme est en fait celle du parcours, soit O(n + m). Si le graphe G est fortement connexe, la for? et couvrante du parcours se r´ eduit ` a une seule arborescence couvrante. Dans le cas contraire, nous montrons que le sous-graphe de F induit par chaque composante fortement connexe est une arborescente couvrante de cette composante fortement connexe. Lemme 4.8. Soient L un parcours en profondeur de G, F la for? et induite par L et C une composante fortement connexe de G. Le sous-graphe de F induit par C est une arborescence couvrant C. Preuve. Soit s le premier sommet de C visit´ e dans L. Tous les autres sommets de C sont accessibles ` a partir de s dans le sous-graphe de G induit par C et n?ont pas encore ´ et´ e visit´ es. Ils seront donc visit´ es apr` es s et accessibles dans F ` a partir de s. La proposition en r´ esulte. La proposition pr´ ec´ edente met en ´ evidence le premier sommet du parcours L appartenant ` a une composante fortement connexe donn´ ee C. Nous appellerons ce sommet point d?entr´ ee de L dans C. Nous donnons maintenant une caract´ erisation de ces points d?entr´ ee qui est ` a la base d?un algorithme efficace pour le calcul des composantes fortement connexes d?un graphe. Nous fixons maintenant un parcours en profondeur L. Soit x un sommet, le rang d?attache de x par rapport ` a F est d´ efini par ?(x) = min{r(z) | z ? AT(x) ? {x}}, o` u AT(x) est l?ensemble des sommets extr´ emit´ es d?un arc arri` ere ou transverse dont l?origine est un descendant de x dans F et dont l?extr´ emit´ e appartient ` a une composante fortement connexe dont le point d?entr´ ee est un ascendant propre de x dans F. Le sommet de rang ?(x) est appel´ e point d?attache du sommet x dans F et est not´ e a(x). Version 6 f´ evrier 2005 110 Chapitre 4. Graphes Soit B ? A un sous-ensemble des arcs de G. Il sera commode d?´ ecrire respective- ment x B ?? y, x (?,B) ?? y, et x (+,B) ?? y s?il existe de x ` a y respectivement un arc de B, un chemin dans B et un chemin non nul dans B. Si l?on note R l?ensemble des arcs arri` ere, T l?ensemble des arcs transverses, X = R ? T et F l?ensemble des arcs de F, alors un sommet z appartient ` a AT(x) si et seulement s?il existe deux sommets y et t tels que x (?,F ) ?? y X ?? z (?,A) ?? t (+,F ) ?? x. (4.1) Il r´ esulte directement de cette d´ efinition que les sommets de AT(x) sont dans la m? eme composante fortement connexe que x. 1 2 3 5 7 8 9 10 11 4 2 3 4 5 6 7 8 9 10 11 1 9 9 9 1 2 6 3 3 3 7 7 6 Figure 4.8: Rangs d?attache et points d?attache. La figure 4.8 illustre les d´ efinitions du rang d?attache et du point d?attache, L=(4, 5, 9, 8, 7, 6, 10, 11, 1, 3, 2) est un parcours en profondeur d?un graphe G pos- s´ edant six composantes fortement connexes (encadr´ ees). Les points d?entr´ ee de ces composantes sont cercl´ es de noir. Le rang d?un sommet est ` a c? ot´ e de ce som- met. Le rang d?attache d?un sommet est ´ egalement inscrit en gras ` a c? ot´ e de ce sommet. Le lemme suivant fournit une caract´ erisation des points d?entr´ ee. Lemme 4.9. Un sommet x est un point d?entr´ ee si et seulement si x = a(x). Preuve. Si x est un point d?entr´ ee de la composante fortement connexe C, alors AT(x) = ?. En effet, si z ? AT(x) il existe y et t qui v´ erifient 4.1. On a donc z ? C puisque z ? AT(x) et t ? C puisqu?aucun ascendant propre de x dans F n?appartient ` a C. D?o` u la contradiction. Il en r´ esulte que ?(x) = r(x) et que a(x) = x. R´ eciproquement, si x appartient ` a la composante fortement connexe C et n?est pas son point d?entr´ ee, nous notons e le point d?entr´ ee de C. On a alors e (+,F ) ?? x et x (+,A) ?? e. Or comme il n?existe pas de chemin de x ` a e dans F, il existe un sommet z qui n?est pas un descendant de x dans F tel que : x (?,F ) ?? y X ?? z (?,A) ?? e. (4.2) Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 111 Le sommet z appartient ` a AT(x) et nous montrons que r(z) < r(x). Soit t l?anc? etre de z et x dans F. Le sommet t est distinct de x puisque z n?est pas un descendant de x dans F. Si t = z alors z est un ascendant propre de x et r(z) < r(x). Si t est distinct de z et r(z) > r(x), lors de la visite de x seul le sommet x du chemin de x ` a z a ´ et´ e visit´ e et donc z sera un descendant de x dans F, ce qui contredit l?hypoth` ese. On a donc r(z) < r(x) et donc a(x) = x. 4.4.5 Calcul des composantes fortement connexes Nous pr´ esentons dans cette section un algorithme efficace, d? u ` a Tarjan, pour le calcul des composantes fortement connexes d?un graphe orient´ e quelconque G. Cet algorithme r´ ealise simultan´ ement un parcours en profondeur L du graphe G et le calcul des rangs d?attache de chaque sommet. L?impl´ ementation de cet algorithme par la proc´ edure cfc ci-dessous est une variante de la proc´ edure profondeur- r´ ecursif pr´ esent´ ee dans la section 4.4.2. Cette variante utilise une pile ? qui empile les sommets au fur et ` a mesure de leur insertion dans le parcours en profondeur et d´ epile tous les sommets de chaque nouvelle composante fortement connexe d´ etect´ ee lorsque le parcours en profondeur revient sur un point d?entr´ ee. La proc´ edure cfc se distingue de la proc´ edure Profondeur-r´ ecursif par les trois points suivants : a) La notion de voisin est remplac´ ee par celle de successeur; b) Lors de l?examen des successeurs du sommet x en cours dans le parcours en profondeur, deux cas sont possibles : 1. Si le successeur y examin´ e n?est pas d´ ej` a visit´ e, alors le rang r(y) est calcul´ e, le rang d?attache ?(y) est initialis´ e ` a r(y), le sommet y est empil´ e dans ?, un appel r´ ecursif est ex´ ecut´ e pour le sommet y et le rang d?attache ?(x) est actualis´ e ` a min{?(x), ?(y)}. 2. Si le successeur y examin´ e est d´ ej` a visit´ e, le rang d?attache ?(x) est actualis´ e ` a min{?(x), r(y)}. c) Lorsque tous les successeurs d?un sommet x ont ´ et´ e trait´ es, la valeur de ?(x) est le rang d?attache de x. Si ?(x) = r(x), le sommet x est un point d?entr´ ee d?une composante fortement connexe C dont les sommets autres que x sont situ´ es au-dessus de x dans ?. Cette pile est alors d´ epil´ ee jusqu?au sommet x. La proc´ edure Desc(s) ci-dessous d´ etermine dans le tableau c les composantes fortement connexes qui sont des descendants de la composante fortement connexe contenant s dans le graphe r´ eduit de G. L?´ el´ ement c(x) est le num´ ero de la composante fortement connexe contenant x. On suppose ´ egalement qu?un tableau de bool´ eens est utilis´ e pour tester l?appartenance d?un sommet ` a la pile ?. Version 6 f´ evrier 2005 112 Chapitre 4. Graphes proc´ edure Desc(s); (1) Empiler(s, ?); V := V ? {s}; (2) r := r + 1; r(s) := r; ?(s) := r; (3) pour tout successeur x de s dans G faire (4) si x ? V alors Desc(x); ?(s) := min{?(s), ?(x)} (5) sinon (6) si x est dans ? alors ?(s) := min{?(s), r(x)} finsi (7) finsi (8) finpour; (9) si ?(s) = r(s) alors (10) k := k + 1; (11) r´ ep´ eter z :=D´ epiler(?); c(z) := k (12) jusqu?` a z = s; (13) finsi. L?algorithme de calcul des composantes fortement connexes de G est impl´ ement´ e par la proc´ edure cfc(G) ci-dessous. proc´ edure cfc(G) V := ?; {V est l?ensemble des sommets visit´ es} r := 0; {r est le compteur pour les rangs} k := 0; {k num´ erote les composantes fortement connexes} Pilevide(?); tantque V = S faire choisir s dans S ? V ; Desc(s) fintantque. Les deux propositions suivantes ´ etablissent la complexit´ e et la validit´ e de la proc´ edure cfc. Proposition 4.10. Soit G un graphe poss´ edant n sommets et m arcs. La com- plexit´ e de la proc´ edure cfc est O(max{m, n}). Preuve. Pour ´ evaluer la complexit´ e de la proc´ edure cfc, examinons les op´ erations suppl´ ementaires r´ ealis´ ees par rapport ` a un simple parcours en profondeur du graphe G. Lors de chaque ´ etape du parcours en profondeur, seules des op´ erations de mise ` a jour de complexit´ e O(1) sont introduites. En ce qui concerne la pile ?, chaque sommet est empil´ e et d´ epil´ e exactement une fois. Il en r´ esulte que la complexit´ e globale de la proc´ edure cfc est O(max{m, n}). Proposition 4.11. Soit s un sommet du graphe G. La proc´ edure Desc(s) d´ etermine les composantes fortement connexes de G+ (s). Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 113 Preuve. Au cours d?un parcours en profondeur d?un graphe G, un sommet passe successivement par trois ´ etats. Tant qu?il n?a pas ´ et´ e visit´ e, il est libre. Lorsqu?il est visit´ e (c?est-` a-dire lorsqu?il est l?extr´ emit´ e d?un mouvement avant du par- cours), il devient examin´ e. Lorsqu?il devient l?extr´ emit´ e d?un mouvement arri` ere du parcours, il est exclu. L?ordre dans lequel les sommets sont examin´ es est celui du parcours en profondeur. La liste L? associ´ ee ` a l?ordre d?exclusion des sommets v´ erifie les propri´ et´ es suivantes : ? le dernier sommet exclu d?une composante fortement connexe est son point d?entr´ ee, ? les points d?entr´ ee des composantes fortement connexes apparaissent dans l?ordre d?un parcours postfixe du graphe r´ eduit de G. La liste d?exclusion pour l?exemple de la figure 4.9 est (7, 8, 9, 5, 11, 10, 6, 4). v 4 5 6 7 8 9 10 11 7 1 2 - 3 4 5 - - 8 1 2 - 3 3 5 - - 9 1 2 - 3 3 3 - - dépilement de C1={7,8,9} 5 1 2 - 3 3 3 - - dépilement de C2={5} 11 1 2 6 3 3 3 7 7 10 1 2 6 3 3 3 7 7 dépilement de C3={10,11} 6 1 2 6 3 3 3 7 7 dépilement de C4={6} 4 1 2 6 3 3 3 7 7 dépilement de C5={4} 1 2 3 9 10 11 C6 5 6 7 8 9 10 11 4 2 3 4 5 6 7 8 1 1 2 3 4,3 5,3 C1 C2 C3 C4 C5 Desc(4) Desc(5) Desc(6) Desc(9) Desc(8) Desc(7) Desc(10) Desc(11) Figure 4.9: Une ex´ ecution de Desc. Supposons dans un premier temps que les valeurs ?(x) calcul´ ees par la proc´ edure Desc(s) pour tous les sommets de G+ (s) soient effectivement les rangs d?attache de ces sommets. La liste d?exclusion L? du parcours en profondeur de G+ (s) correspond ` a l?ordre dans lequel les appels r´ ecursifs de la proc´ edure Desc pour les sommets de G+ (s) se terminent. Il r´ esulte alors du lemme 4.9 que lorsque le nouveau sommet exclu x satisfait ?(x) = r(x), ce sommet est un point d?entr´ ee. Donc les macro-d´ epilements de la pile sont r´ ealis´ es par Desc lors des exclusions successives des points d?entr´ ee. Or, lors de l?exclusion d?un point d?entr´ ee x, la pile contient dans sa partie sup´ erieure ` a partir du sommet x les sommets de la composante fortement connexe C de x. En effet, en raison de l?ordre postfixe des Version 6 f´ evrier 2005 114 Chapitre 4. Graphes macro-d´ epilements, tous les descendants propres de C dans le graphe r´ eduit de G ont d´ ej` a ´ et´ e macro-d´ epil´ es . Nous montrons maintenant que, pour tout sommet x de G+ (s), lors de la termi- naison de l?appel Desc(x), la valeur calcul´ ee ?(x) est ´ egale au rang d?attache du sommet x. Nous raisonnons par r´ ecurrence sur le nombre d?appels termin´ es de la proc´ edure Desc. Consid´ erons la terminaison de l?appel Desc(v). Nous montrons d?abord que si le sommet w est un fils de v dans F et si r(v) > ?(w) alors on a n´ ecessairement ?(v) ? ?(w). En effet, soit (y, x) un arc arri` ere ou transverse tel que w (?,F ) ?? y et x (?,A) ?? e o` u x est le point d?attache de w et e est le point d?entr´ ee de la composante fortement connexe contenant x. On a ?(w) = r(x) et donc r(x) < r(v). Comme x ? AT(v), on a ?(v) ? ?(w). Nous montrons maintenant que si l?arc (v, w) est un arc arri` ere ou transverse dont l?extr´ emit´ e w appartient ` a une composante fortement connexe C non encore macro-d´ epil´ ee et si r(v) > r(w) alors on a n´ ecessairement ?(v) < r(w). En effet, soit e le point d?entr´ ee de C. L?appel Desc(e) n?est pas termin´ e lors de la terminaison de Desc(v). Le sommet e qui est un ascendant de w est aussi un ascendant de v. En effet, dans le cas contraire, r(e) ? r(w) < r(v) impliquerait que l?appel Desc(e) soit termin´ e avant Desc(v). Il en r´ esulte que w ? AT(v) et ?(v) < r(w). En utilisant l?hypoth` ese de r´ ecurrence pour les successeurs de v qui sont des fils de v dans F, la valeur ?(v) calcul´ ee par l?appel Desc(v) est ´ egale ` a min{r(v), ?, ?} o` u, si S d´ esigne les fils de v dans F et T les autres successeurs de v dans G : ? = min{?(w) | w ? S} ? = min{r(w) | w ? T}. D?apr` es ce qui pr´ ec` ede, cette valeur correspond ` a celle du rang d?un sommet de AT(v). Montrons que lors de la terminaison de Desc(v), on a ?(v) = ?(v). Nous consid´ erons ` a cet effet un arc (x, y) arri` ere ou transverse dont l?origine est un descendant de v dans F et l?extr´ emit´ e y appartient ` a AT(v) et nous montrons que ?(v) ? r(y). Nous notons e le point d?entr´ ee de la composante fortement connexe contenant y et envisageons deux cas : ? Supposons x = v. D?apr` es l?hypoth` ese de r´ ecurrence, les composantes forte- ment connexes ont ´ et´ e correctement calcul´ ees jusqu?` a la terminaison des appels de Desc ant´ erieurs ` a Desc(v). Le sommet y est donc dans la pile puisque Desc(e) n?est pas termin´ e. Or lors de l?examen du successeur y de v dans l?appel Desc(v), la valeur ?(v) est actualis´ ee (ligne (6)) ` a une valeur inf´ erieure ou ´ egale ` a r(y). ? Supposons x = v. Le sommet x est alors un descendant propre de v dans F. Si z est le fils de v dans F dont x est le descendant, apr` es la terminaison de l?appel Desc(z), la valeur ?(v) est actualis´ ee (ligne (4)) et rendue inf´ erieure ou ´ egale ` a ?(z) donc ` a r(y). Version 6 f´ evrier 2005 4.4. Parcours d?un graphe 115 Il en r´ esulte que ?(v) = ?(v). La figure 4.9 montre en a) l?arbre des appels r´ ecursifs o` u les sommets gris´ es correspondent aux points d?entr´ ee (donc aux macro-d´ epilements), en b) les valeurs des rangs d?attache en cours apr` es la terminaison de Desc(v). 4.4.6 Parcours d?une arborescence La structure r´ ecursive des arborescences permet de d´ efinir des parcours sp´ ecifiques fond´ es sur d?autres r` egles que la propri´ et´ e d?adjacence commune aux parcours ´ etudi´ es jusqu?ici. Deux parcours sont tr` es utilis´ es : le parcours pr´ efixe pour lequel les ascendants propres d?un sommet sont plac´ es avant ce sommet dans la liste et le parcours postfixe pour lequel les descendants propres d?un sommet sont plac´ es avant ce sommet dans la liste. Soit A une arborescence de racine r. La structure r´ ecursive de A permet d?´ etablir simplement les algorithmes des parcours pr´ efixe et postfixe. fonction Lpref(A) :liste; si A = ? alors Lpref :=() sinon L := (r); pour chaque fils u de r faire L :=L·Lpref(A(u)); Lpref :=L finsi. fonction Lpost(A) :liste; si A = ? alors Lpost :=() sinon L := (); pour chaque fils u de r faire L :=L·Lpost(A(u)); Lpost :=L · (r) finsi. Pour l?arborescence de la figure 4.10, (6, 7, 1, 3, 5, 4, 2) est le parcours pr´ efixe et (1, 7, 5, 3, 4, 2, 6) est le parcours postfixe. Proposition 4.12. La liste lpref(A) contient chaque sommet de A une fois et une seule et tous les ascendants propres d?un sommet sont plac´ es avant ce sommet dans la liste. Version 6 f´ evrier 2005 116 Chapitre 4. Graphes 1 2 3 4 5 6 7 Figure 4.10: Une arborescence. Preuve. (Induction sur le nombre n de sommets de A.) Si n ? 1, la propri´ et´ e est vraie. Soit une arborescence A = (H, r) ` a n sommets (n ? 2). Par d´ efinition, lpref(A) est la concat´ enation des listes (r), lpref(A(r1)), ..., lpref(A(rk)). Par induction, pour tout j ? {1, . . . , k}, lpref(A(rj)) v´ erifie la proposition pour la sous-arborescence A(rj). La liste lpref(A) contient donc chaque sommet de A une et une seule fois. D?autre part, soit u un sommet de A et v un ascendant propre de u. Si v = r alors il est plac´ e avant u. Sinon, par induction, v est plac´ e avant u dans la sous-arborescence A(rj) qui contient u et la proposition est donc v´ erifi´ ee. Parcours sym´ etrique d?un arbre binaire Les arbres binaires sont tr` es utilis´ es comme structures de donn´ ees permettant de manipuler efficacement les ensembles ordonn´ es. Le parcours sym´ etrique d?un arbre binaire est une liste des sommets de l?arbre telle que tout sommet est plac´ e dans la liste apr` es les sommets de son sous-arbre gauche et avant les sommets de son sous-arbre droit. Une telle liste est unique puisque la d´ efinition impose la place de la racine, puis successivement la place des racines de tous les sous-arbres. L?algorithme r´ ecursif suivant d´ etermine le parcours sym´ etrique not´ e sym(A) d?un arbre binaire A de racine r : fonction Sym(A :arbre binaire) :liste; si A = ? alors Sym:= () sinon Sym :=Sym(Ag) · (r)· Sym(Ad) finsi. Le parcours sym´ etrique de l?arborescence de la figure 4.11 est (12, 2, 5, 4, 6, 3, 1, 7, 10, 11, 8, 9). Proposition 4.13. La liste sym(A) est le parcours sym´ etrique de l?arbre bi- naire A. Version 6 f´ evrier 2005 Notes 117 1 2 7 12 3 8 4 10 9 5 6 11 Figure 4.11: Un arbre binaire. Preuve. (Induction sur le nombre n de sommets de A.) La propri´ et´ e est vraie pour n = 0 puisque Sym(?) est vide. Soit A un arbre binaire ` a n ? 1 sommets. Par d´ efinition, Sym(A) est la concat´ enation des listes Sym(Ag), (r) et Sym(Ad). Par induction la propri´ et´ e est vraie pour tout sommet de Ag et de Ad et elle est vraie par construction pour la racine r de A, donc elle est vraie pour tout sommet de A. Notes Les ouvrages sur les graphes sont nombreux. Nous avons utilis´ e les d´ efinitions du livre de r´ ef´ erence : C. Berge, Graphes, Gauthier-Villars (troisi` eme ´ edition), 1983. D?autres livres utiles sont : F. Harrary, Graph Theory, Addison-Wesley, Reading, Mass, 1969; M. Gondran et M. Minoux, Graphes et Algorithmes, Eyrolles, 1979. L?algorithme de calcul des composantes fortement connexes est de : R. Tarjan, Depth First Search and Linear Graph Algorithms, SIAM J. Computing 1 (1972), 146?160. Exercices 4.1. D´ emontrer que la matrice d?incidence sommets-arcs d?un graphe orient´ e sans boucles est totalement unimodulaire, c?est-` a-dire que le d´ eterminant de toute sous-matrice carr´ ee extraite vaut 0, +1 ou ?1. Version 6 f´ evrier 2005 118 Chapitre 4. Graphes 4.2. Soit G = (S, A) un graphe orient´ e. On consid` ere la famille G des graphes partiels de G qui ont m? eme fermeture transitive que G. Un graphe H de G est minimal si le graphe obtenu ` a partir de H en supprimant un arc quelconque n?est plus dans G. Montrer qu?en g´ en´ eral il existe dans G plusieurs graphes minimaux. D´ emontrer que si le graphe G est sans circuit, alors G ne contient qu?un seul graphe minimal (qui est appel´ e graphe de Hasse de G). 4.3. Ecrire un algorithme de complexit´ e O(max{m, n}) pour d´ eterminer si un graphe ` a n sommets et m arcs est sans circuit. 4.4. Soient G = (S, A) un graphe orient´ e et c : A ? N. Soit p un entier fix´ e. Pour tout couple de sommets i, j, on cherche les longueurs des p plus courts chemins (relativement ` a c) de i ` a j. On utilise pour cela le semi-anneau (Np , min, +, 0p , 1p ) des vecteurs ` a p coordonn´ ees dans N o` u les op´ erations + et min sont d´ efinies pour deux vecteurs a = (a1, . . . , ap) et b = (b1, . . . , bp) par min{a, b} = (c1, . . . , cp), o` u les ci, i ? {1, . . . , p} sont les p plus petits ´ el´ ements de a1, a2, . . . , ap, b1, b2 . . . , bp et a+b = c, o` u les ci, i ? {1, . . . , p} sont les p plus petits ´ el´ ements parmi les p2 sommes ai + bj, i ? {1, . . . , p}, j ? {1, . . . , p}. Montrer que le vecteur cn ij d´ efini par la formule de r´ ecurrence 2.1 fournit les valeurs des p plus courts chemins de i ` a j dans G. 4.5. Soit Kn l?ensemble des matrices carr´ ees d?ordre n ` a coefficients dans un semi-anneau complet K. Montrer comment munir Kn d?une structure de semi- anneau complet. On d´ efinit pour M ? Kn la matrice M? par : M? = I ? M ? M2 . . . ? Mh ? . . . . Soit G = (S, A) un graphe ` a n sommets, soit c : A ? K une fonction co? ut et soit M = mij la matrice d´ efinie par : mij = c((i, j)) si (i, j) ? A 0 sinon. D´ emontrer que : m? ij = cij o` u cij = ???ij c(?). 4.6. Montrer que pour R = R ? {+?, ??}, (R, min, max, +?, ??) est un semi-anneau complet. Soit G = (S, A) un graphe non orient´ e, c : A ? R une fonction co? ut et soit cij = min ???ij c(?) o` u ?ij est l?ensemble des cha? ?nes ´ el´ ementaires de i ` a j. Soit U = {(i, j) ? A | cij = c((i, j))}. Montrer que le sous-graphe (S, U) est un arbre couvrant de co? ut minimal (au sens du chapitre 7). Version 6 f´ evrier 2005 Exercices 119 4.7. D´ emontrer la proposition 2.2. 4.8. Soit G = (S, A) un graphe orient´ e connexe ` a n sommets et m arcs. On appelle cycle ´ el´ ementaire de G une suite d?arcs de G telle que deux arcs cons´ ecutifs quelconques de la suite (y compris le dernier et le premier) aient une extr´ emit´ e commune et que ces extr´ emit´ es communes successives soient toutes distinctes. On associe ` a un cycle ´ el´ ementaire de G le vecteur de {0, 1, ?1}m pour lequel la coordonn´ ee associ´ ee ` a l?arc u vaut 0 si le cycle n?emprunte pas l?arc u, 1 si le cycle emprunte l?arc u dans le sens de u et ?1 si le cycle emprunte l?arc u dans le sens oppos´ e ` a u. D´ emontrer que le sous-espace vectoriel de Rm engendr´ e par les cycles ´ el´ ementaires de G est de dimension m ? n + 1. En d´ eduire que si G poss` ede p composantes connexes, le nombre maximum de cycles ind´ ependants de G est m ? n + p. 4.9. Montrer que l?on peut utiliser un parcours en largeur d?un graphe non orient´ e ` a partir d?un sommet s pour d´ eterminer les longueurs des plus courtes cha? ?nes de s ` a tous les autres sommets du graphe. 4.10. Soit G un graphe non orient´ e connexe et soit s l?un de ses sommets. Montrer que l?arborescence des appels r´ ecursifs de la proc´ edure Profondeur- r´ ecursif(s) s?identifie avec une arborescence couvrante de G de racine s. Mon- trer que si {x, y} est une ar? ete n?appartenant pas ` a l?arborescence, l?un des deux sommets x ou y est ascendant de l?autre dans l?arborescence. Montrer que la complexit´ e en temps de la proc´ edure est O(max{n, m}), o` u n est le nombre de sommets et m le nombre d?ar? etes du graphe G. Version 6 f´ evrier 2005 120 Chapitre 4. Graphes Version 6 f´ evrier 2005 121 Chapitre 5 Tris Ce chapitre traite des algorithmes de tri. La premi` ere section pr´ esente trois algo- rithmes de tri interne pour lesquels aucune hypoth` ese particuli` ere n?est faite sur les cl´ es : le tri rapide, le tri fusion et le tri par tas. La seconde section concerne le tri externe. On y pr´ esente un algorithme de construction des monotonies et deux algorithmes de r´ epartition : le tri ´ equilibr´ e et le tri polyphas´ e. Introduction Dans ce chapitre, nous pr´ esentons trois algorithmes de tri parmi les plus efficaces lorsqu?aucune hypoth` ese particuli` ere n?est faite sur la nature ou la structure des cl´ es des ´ el´ ements ` a trier. Le tri rapide place d´ efinitivement un ´ el´ ement appel´ e pivot, construit une liste gauche des ´ el´ ements dont la cl´ e est inf´ erieure ou ´ egale ` a celle du pivot, construit une liste droite des ´ el´ ements dont la cl´ e est strictement sup´ erieure ` a celle du pivot et r´ ealise enfin un appel r´ ecursif sur chacune des deux listes. Le tri fusion est ´ egalement un tri dichotomique. Il r´ ealise d?abord un appel r´ ecursif sur chacune des deux listes obtenues par scission de la liste initiale en deux listes de taille ´ egale (` a une unit´ e pr` es) et interclasse ensuite les deux listes tri´ ees. Le tri par tas place d?abord les ´ el´ ements ` a trier dans un tableau organis´ e en file de priorit´ e (tas), puis supprime un ` a un les ´ el´ ements de priorit´ e minimum du tas tout en les repla¸ cant simultan´ ement dans le tableau dans l?ordre inverse. Ces trois algorithmes de tri ont une complexit´ e moyenne O(n log n). Dans le pire des cas, le tri rapide a pour complexit´ e O(n2 ), alors que la complexit´ e des deux autres tris est O(n log n). D?autres algorithmes moins performants comme par exemple les tris simples (tri bulle, tri par insertion, tri par s´ election,...) ne sont pas pr´ esent´ es ici mais ont, pour la plupart d?entre eux, servi d?illustration ` a d?autres sujets trait´ es dans le livre. Certains algorithmes, par exemple le tri par champs, sont plus performants mais exigent certaines hypoth` eses sp´ ecifiques sur les cl´ es des ´ el´ ements ` a trier. Nous proposons en exercice l?´ etude de certains algorithmes de ce type. Version 6 f´ evrier 2005 122 Chapitre 5. Tris 5.1 Tri interne La donn´ ee d?un probl` eme de tri est constitu´ ee d?une permutation L = (e1, . . . , en), d?un ensemble E de n ´ el´ ements et d?une application c : E ? F de E dans un ensemble F totalement ordonn´ e qui associe ` a chaque ´ el´ ement e une cl´ e c(e). Nous appellerons ´ el´ ement maximal de E un ´ el´ ement dont la cl´ e est le plus grand ´ el´ ement de c(E). Inversement, un ´ el´ ement minimal de E est un ´ el´ ement dont la cl´ e est le plus petit ´ el´ ement de c(E). Une liste tri´ ee de E est une permutation de E dont les ´ el´ ements sont rang´ es dans un ordre compatible avec la relation d?ordre sur F. Trier la liste L, c?est d´ eterminer une liste tri´ ee des ´ el´ ements de L. Exemple. Si E = {A, B, C, D}, F = {0, 1}, c(A) = c(B) = 1 et c(C) = c(D) = 0, la liste (C, D, B, A) est une liste tri´ ee. Nous mesurerons la complexit´ e d?un tri par le nombre de comparaisons de cl´ es qu?il r´ ealise et la taille d?un probl` eme de tri sera d´ efinie par le nombre n d?´ el´ ements ` a trier. Nous supposerons ´ egalement que la liste initiale L est impl´ ement´ ee par un tableau lin´ eaire T[i..j] o` u n = j ? i + 1. Ces hypoth` eses sont r´ ealistes dans le cas d?un tri interne o` u les ´ el´ ements ` a trier sont et restent disponibles en m´ emoire centrale. La section 5.2 traitera le cas du tri externe pour lequel cette hypoth` ese n?est pas satisfaite. 5.1.1 Le tri rapide Le tri rapide d?une liste L sur E est un algorithme comprenant deux phases. La premi` ere phase transforme la liste L en une liste L = G·(?)·D sur E o` u ? est un ´ el´ ement de L appel´ e pivot, G est la liste gauche contenant g ´ el´ ements (g ? n?1), D est la liste droite contenant d ´ el´ ements (d ? n?1). De plus, la cl´ e d?un ´ el´ ement quelconque de G est inf´ erieure ou ´ egale ` a la cl´ e d?un ´ el´ ement quelconque de D. Notons que chacune des listes G ou D peut ? etre vide et qu?elles le sont toutes les deux si n = 1. Plus pr´ ecis´ ement, si le pivot est un ´ el´ ement maximal, alors la liste D est vide, si le pivot est un ´ el´ ement minimal, alors la liste G peut ? etre vide ou non. Il est important de remarquer qu?apr` es la premi` ere phase, le pivot est bien plac´ e et que les tailles de la liste gauche et de la liste droite sont strictement plus petites que n. La seconde phase consiste simplement en deux appels r´ ecursifs de l?algorithme, l?un pour la liste G, l?autre pour la liste D. Un appel de l?algorithme de tri rapide est terminal si n ? 1. Notons qu?un ap- pel terminal n?effectue aucune comparaison de cl´ es. Nous pouvons donc d´ ecrire l?algorithme de tri rapide par la proc´ edure tri rapide ci-dessous. La cl´ e de l?´ el´ ement T(k) est not´ ee c(k) et les listes associ´ ees aux appels r´ ecursifs correspon- dent ` a des sous-tableaux de T[i..j]. La premi` ere phase correspond ` a la fonction pivoter qui retourne l?indice du pivot. Version 6 f´ evrier 2005 5.1. Tri interne 123 proc´ edure tri rapide(T[i..j]); si i < j alors k :=pivoter(T[i..j]); tri rapide(T[i..(k ? 1)]); tri rapide(T[(k + 1)..j]) finsi. L?algorithme de pivotage L?efficacit´ e du tri rapide d´ epend directement de l?algorithme de pivotage. Ce dernier doit d?une part choisir le pivot et d?autre part r´ eorganiser le tableau. Nous conviendrons de choisir comme pivot le premier ´ el´ ement du tableau, c?est- ` a-dire l?´ el´ ement T(i) dont la cl´ e c(i) est not´ ee conventionnellement ?. Ce choix, qui n?est pas le seul possible, n?est pas plus mauvais qu?un autre en l?absence d?hypoth` ese suppl´ ementaire sur les donn´ ees et pr´ esente le double avantage d?? etre simple ` a impl´ ementer et de conduire ` a une analyse en moyenne rigoureuse. Nous appelons couple invers´ e du tableau par rapport au pivot un couple d?indices (s, t) tel que : i < s < t ? j, c(s) > ?, c(t) ? ?. Le couple invers´ e (s, t) pr´ ec` ede le couple invers´ e (s , t ) si s ? s et t ? t. Cette re- lation de pr´ ec´ edence conf` ere ` a l?ensemble des couples invers´ es une relation d?ordre total. Si cet ensemble n?est pas vide, il existe donc un premier couple invers´ e. La r´ eorganisation du tableau T[i..j] est un algorithme it´ eratif o` u chaque it´ eration concerne des sous-tableaux embo? ?t´ es de T et toujours la m? eme valeur de ?. La premi` ere it´ eration concerne le tableau T[i + 1..j]. Elle consiste ` a rechercher le premier couple invers´ e (s?il existe) par un appel ` a la fonction premier-couple- invers´ e qui retourne un couple (s, t). Si s < t, alors (s, t) est effectivement le premier couple invers´ e par rapport ` a ?, les ´ el´ ements de rang s et t sont ´ echang´ es dans le tableau T par la proc´ edure Echanger et l?it´ eration suivante concernera le sous-tableau T[s ..t ] o` u s = s + 1 et t = t ? 1. L?algorithme se termine si s > t . fonction premier-couple-invers´ e(T, k, l, ?) :couple; s := k; t := l; tantque s ? l etalors c(s) ? ? faire s := s + 1 fintantque; tantque t ? k etalors c(t) > ? faire t := t ? 1 fintantque premier-couple-invers´ e :=(s, t). La fonction pivoter ci-dessous impl´ emente l?algorithme de pivotage. Version 6 f´ evrier 2005 124 Chapitre 5. Tris fonction pivoter(T, i, j) :indice; ? :=c(i); s := i + 1; t := j ; tantque s ? t faire (s, t) :=premier-couple-invers´ e(T, s, t, ?); si s < t alors Echanger(T, s, t); s := s + 1; t := t ? 1 finsi fintantque; pivoter :=t; ´ echanger(T, i, t). La figure 1.1 montre une ex´ ecution de l?algorithme de pivotage. La premi` ere ligne contient la liste initiale. pointeur gauche pointeur droit 6 14 3 1 10 5 1 6 4 5 2 11 6 6 3 1 10 5 1 6 4 5 2 11 9 6 9 14 6 6 3 1 2 5 1 6 4 5 10 11 9 14 5 6 3 1 2 5 1 6 4 6 10 11 9 14 pivot placé Figure 1.1: Un pivotage. Le lemme suivant ´ etablit un encadrement du nombre de comparaisons de cl´ es r´ ealis´ ees lors d?un pivotage. Lemme 1.1. L?algorithme de pivotage r´ ealise au moins n ? 1 et au plus n + 1 comparaisons de cl´ es. Preuve. Si tous les ´ el´ ements de T[i + 1..j] ont une cl´ e inf´ erieure ou ´ egale ` a ?, la valeur finale de s est j +1 et t n?a pas ´ et´ e modifi´ e. Il en r´ esulte n?1 comparaisons ` a partir de s et une comparaison ` a partir de t, soit en tout n comparaisons. Il y a de m? eme n comparaisons si tous les ´ el´ ements de T[i+1..j] ont une cl´ e strictement sup´ erieure ` a ?. Si le tableau T[i + 1..j] contient un ´ el´ ement de cl´ e inf´ erieure ou ´ egale ` a ? et un ´ el´ ement de cl´ e strictement sup´ erieure ` a ?, deux cas sont possibles. Si le dernier ´ echange d?un couple invers´ e concerne deux ´ el´ ements contigus dans T, il y a eu exactement n ? 1 comparaisons avant cet ´ echange et il n?y en aura pas apr` es. Sinon, lors de la terminaison du pivotage, les cl´ es des ´ el´ ements indic´ es par les derni` eres valeurs de s et t ont ´ et´ e compar´ ees deux fois ` a ?, il y a donc eu n + 1 comparaisons (voir figure 1.2). Version 6 f´ evrier 2005 5.1. Tri interne 125 Dernier couple inversé, n+1 comparaisons Dernier couple inversé, n-1 comparaisons Figure 1.2: Dernier ´ echange d?un couple invers´ e. Complexit´ e dans le pire des cas Examinons l?arborescence A des appels r´ ecursifs d?une ex´ ecution de l?algorithme de tri rapide. L?arborescence associ´ ee ` a la liste initiale de la figure 1.1 est donn´ ee sur la figure 1.3. Les indices i et j d?un appel sont inscrits ` a l?int´ erieur du sommet correspondant. Les sommets des appels terminaux sont cercl´ es de noir. Cette 13,12 11,11 11,14 13,14 1,14 14,14 2,2 4,4 2,4 6,6 1,0 8,8 10,9 2,6 1,6 8,9 1,9 Figure 1.3: Appels r´ ecursifs du tri rapide. arborescence est un arbre binaire complet dont les feuilles correspondent ` a un tableau contenant au plus un ´ el´ ement. Si les deux fils y et z d?un noeud x cor- respondent ` a deux tableaux de p et q ´ el´ ements, le noeud x correspond lui ` a un tableau de p+q +1 ´ el´ ements. D?apr` es le lemme 1.1, le nombre maximum de com- paraisons faites au noeud x , ´ egal ` a p+q+2, est la somme du nombre maximum de comparaisons (p + 1) faites au noeud y et du nombre maximum de comparaisons (q + 1) faites au noeud z. Le nombre total de comparaisons faites pour tous les noeuds d?un m? eme niveau de l?arbre est donc major´ e par n+1 et le nombre total de comparaisons est lui-m? eme major´ e par (n + 1)h(A) o` u h(A) est la hauteur en nombre de sommets de l?arborescence A. Version 6 f´ evrier 2005 126 Chapitre 5. Tris Si la liste initiale contient n ´ el´ ements, la hauteur maximale est atteinte (voir exercices) lorsque chaque niveau (le niveau 0 de la racine except´ e) est constitu´ e de deux noeuds fr` eres, un noeud terminal correspondant ` a une liste vide et un noeud correspondant ` a une liste de p ´ el´ ements si son p` ere est lui-m? eme associ´ e ` a une liste de p + 1 ´ el´ ements (voir figure 1.4). La complexit´ e dans le pire des cas de l?algorithme de tri rapide est donc O(n2 ). Cette complexit´ e est effectivement atteinte lorsque la liste initiale L est une liste tri´ ee. En effet l?arborescence induite est alors le peigne repr´ esent´ e sur la figure 1.4. Dans ce cas, le nombre de comparaisons (voir lemme 1.1), inscrit ` a l?int´ erieur du sommet sur la figure, est exactement n pour le niveau 0, n ? 1 pour le niveau 1, n?i pour le niveau i, 2 pour l?avant-dernier niveau et 0 pour le dernier niveau, soit en tout n j=2 j=n(n + 1)/2 ? 1 comparaisons. n n-1 n-2 2 1 0 0 0 ............ Figure 1.4: Un peigne . Complexit´ e en moyenne du tri rapide Nous faisons ici l?hypoth` ese que les cl´ es des n ´ el´ ements de la liste initiale L sont distinctes et que les n! permutations qui repr´ esentent les rangs de ces cl´ es dans L sont ´ equiprobables. Nous noterons ?(L) la permutation des rangs des cl´ es de la liste L. Exemple. Si L = (A, B, C, D, E, F), c(A) = 3, c(B) = 1, c(C) = 5, c(D) = 10, c(E) = 7 et c(F) = 15, on a ?(L) = (2, 1, 3, 5, 4, 6). Le lemme suivant montre que l?algorithme de pivotage conserve les hypoth` eses probabilistes de la liste initiale pour les deux sous-listes gauche et droite. Lemme 1.2. Soit r le rang du pivot. Apr` es l?algorithme de pivotage, les per- mutations de {1, . . . , r ? 1} associ´ ees aux listes gauches G sont ´ equiprobables. Il en est de m? eme pour les permutations de {r + 1, . . . , n} associ´ ees aux listes droites D. Preuve. La preuve est imm´ ediate si r = 1 ou si r = n. Nous supposons donc 1 < r < n et nous choisissons une permutation possible en sortie de l?algorithme Version 6 f´ evrier 2005 5.1. Tri interne 127 de pivotage, not´ ee ? = ?1 · (r) · ?2, o` u ?1 est une permutation de {1, . . . , r ? 1} et ?2 est une permutation de {r + 1, . . . , n}. Supposons que l?algorithme de pivotage ait r´ ealis´ e ` a partir d?une liste L, les q ´ echanges de couples invers´ es (s1, t1), (s2, t2), · · · , (sq, tq) et que ? soit la permuta- tion des rangs de la liste obtenue apr` es pivotage. On a alors : 1 ? s1 < s2 < · · · < sq ? r ? 1 r + 1 ? tq < tq?1 < · · · < t1 ? n. (1.1) Si maintenant on op` ere sur la permutation ? la transposition ?0 qui consiste ` a ´ echanger ?(1) et ?(r) puis les q transpositions ?k, k = 1, .., q, o` u ?k consiste ` a ´ echanger ?(sk) et ?(tk), on retrouve la permutation des rangs de la liste L. R´ eciproquement, si nous choisissons q entiers naturels sk et q entiers naturels tk satisfaisant (1.1), et si nous op´ erons sur ? la transposition ?0 suivie des q transpositions ?k, nous obtenons une permutation ? qui apr` es pivotage donne la permutation ?. De plus, et c?est l` a le point crucial, deux choix distincts des entiers sk et tk satisfaisant (1.1) correspondent ` a deux permutations ? distinctes. Pour r, ? et q fix´ es, le nombre de choix possibles des entiers sk et tk satisfaisant 1.1 est r?1 q n?r q . Comme les valeurs possibles pour q sont celles de l?ensemble {1, . . . , min{r ? 1, n ? r}}, le nombre total de permutations qui, apr` es pivotage, donne la permutation ? est min{r?1,n?r} q=1 r ? 1 q n ? r q . Ce nombre ne d´ epend que du rang r du pivot et non de la permutation ? elle- m? eme. Il en r´ esulte que, pour r fix´ e, les permutations ? apr` es pivotage sont ´ equiprobables. Il en est bien s? ur de m? eme des permutations ?1 et ?2. Le lemme pr´ ec´ edent permet ` a l?analyse en moyenne de pouvoir profiter de la struc- ture r´ ecursive de l?algorithme de tri rapide. En effet l?hypoth` ese d?´ equiprobabilit´ e des permutations ?(L) est conserv´ ee pour les deux appels r´ ecursifs. Nous notons Mn le nombre moyen de comparaisons de cl´ es r´ ealis´ ees pour une liste initiale de n ´ el´ ements. En conditionnant par la valeur r du rang du pivot (les n valeurs de r sont ´ equiprobables), les lemmes 1.2 et 1.1 nous permettent d?´ ecrire pour n ? 2 : Mn ? n r=1 1/n [n + 1 + M(r ? 1) + M(n ? r)]. Les conditions initiales sont M(0) = M(1) = 0 puisqu?aucune comparaison n?est ex´ ecut´ ee pour un appel terminal. En d´ eveloppant l?in´ egalit´ e pr´ ec´ edente et en remarquant que n r=1 M(r ? 1) = n r=1 M(n ? r) = n?1 r=1 M(r) Version 6 f´ evrier 2005 128 Chapitre 5. Tris il vient : Mn ? n + 1 + 2/n n?1 r=1 M(r). Pour obtenir une majoration de M(n), nous r´ esolvons l?´ equation de r´ ecurrence : Sn = n + 1 + 2/n n?1 r=1 S(r) avec S(0) = S(1) = 0. La solution de cette ´ equation de r´ ecurrence compl` ete, d´ evelopp´ ee dans la section 2.4 du chapitre 2, est donn´ ee par Sn = 2(n + 1)(Hn+1 ? 4/3), o` u Hn est le ni` eme nombre harmonique. Il en r´ esulte que Mn = O(n log n). L?analyse de l?algorithme de pivotage a ´ egalement montr´ e que le nombre de com- paraisons d?un pivotage est au moins n?1. On montre alors ` a partir de l?in´ egalit´ e Mn ? n r=1 1/n[n ? 1 + M(r ? 1) + M(n ? r)] et en suivant la m? eme d´ emarche que pour la majoration de Mn, que M(n) ? 2(n + 1)Hn ? 4n. Il en r´ esulte que M(n) = ?(n log n). 5.1.2 Le tri fusion Le principe de l?algorithme de tri fusion est de scinder la liste initiale L de n ´ el´ ements en deux sous-listes G et D, ayant respectivement n/2 et n/2 ´ el´ ements, telles que L = G · D. Un appel r´ ecursif est r´ ealis´ e pour chacune des deux listes G et D. L?interclassement des deux listes tri´ ees fournit ensuite la liste tri´ ee r´ esultat. La complexit´ e du tri fusion d´ epend donc de l?algorithme d?interclassement. Etant donn´ ees deux listes tri´ ees L1 et L2 ayant respectivement n et m ´ el´ ements, il est possible de r´ ealiser leur interclassement dans un tableau r´ esultat R en temps O(n + m) (voir exercices). Dans le tri-fusion on peut profiter du fait que les deux listes se trouvent c? ote-` a-c? ote dans le tableau initial pour construire un algorithme d?interclassement plus raffin´ e que celui du cas g´ en´ eral mais qui a la m? eme com- plexit´ e en temps. La proc´ edure interclasser ci-dessous recopie dans la partie gauche du tableau de travail la liste L1 et dans la partie droite la liste L2 invers´ ee. Ce placement astucieux des deux listes permet alors de replacer dans le tableau initial T les n + m ´ el´ ements du plus petit au plus grand en r´ ep´ etant n + m fois le m? eme traitement. La liste L1 occupe initialement dans T les positions de g ` a m et la liste L2 les positions de m + 1 ` a d. Version 6 f´ evrier 2005 5.1. Tri interne 129 proc´ edure interclasser(T, g, m, d); pour i de g ` a m faire R(i) := T(i); pour j de m + 1 ` a d faire R(j) := T(d + m + 1 ? j); i := g; j := d; pour k de g ` a d faire si R(i) < R(j) alors T(k) := R(i); i := i + 1 sinon T(k) := R(j); j := j ? 1 finsi finpour. L?algorithme du tri-fusion est alors impl´ ement´ e par la proc´ edure tri-fusion ci- dessous. Cette proc´ edure devra utiliser un tableau de travail global R pour r´ ealiser les interclassements. proc´ edure tri-fusion(T, i, j); si i < j alors n := j ? i + 1; g := i; m := i + n/2 ? 1; d := j ; tri-fusion(T, g, m); tri-fusion(T, m + 1, d); interclasser(T, g, m, d) finsi. La figure 1.5 montre l?arborescence des appels r´ ecursifs du tri fusion pour la liste de la figure 1.1. Dans chaque sommet sont inscrits en partie haute les bornes du sous-tableau et en partie basse le sous-tableau r´ esultat de cet appel. Les sommets des appels terminaux sont arrondis. Complexit´ e du tri fusion dans le pire des cas Soit n le nombre d?´ el´ ements du tableau initial. Le premier appel r´ ecursif de la proc´ edure tri-fusion porte sur un tableau de n/2 ´ el´ ements et le second sur un tableau de n/2 ´ el´ ements. Comme le nombre maximum de comparaisons de la proc´ edure interclasser pour deux sous-tableaux contenant en tout n ´ el´ ements est n ? 1, le nombre maximum de comparaisons pour un tableau initial de taille n, not´ e f(n), satisfait pour n ? 2 l?in´ egalit´ e : f(n) ? n ? 1 + f( n/2 ) + f( n/2 ). La condition initiale est f(1) = 0. Nous obtenons une majoration de f en r´ esolvant l?´ equation de r´ ecurrence (de partitions) g(n) = n ? 1 + g( n/2 ) + g( n/2 ), Version 6 f´ evrier 2005 130 Chapitre 5. Tris 1,1 1,14 1,1,2,3,4,5,5,6,6,9,10,14 1,7 1,1,3,5,6,10,14 8,14 2,4,5,6,9,11 1,3 4,7 8,10 11,14 3,6,14 1,1,5,10 4,5,6 2,6,9,11 13,14 2,3 4,5 6,7 8,8 9,10 11,12 6 3,14 1,10 1,5 6 4,5 2,11 6,9 14 3 1 10 5 1 2,2 3,3 4,4 5,5 6,6 7,7 9,9 10,10 11,11 12,12 13,13 14,14 4 5 2 11 9 6 Figure 1.5: Un tri fusion. avec g(1) = 0 comme condition initiale. Cette ´ equation ´ etudi´ ee dans la section 2.3 du chapitre 2 (voir aussi l?exercice 2.4 du chapitre 2) a pour solution : g(n) = 0 si n = 1 n log n + 1 ? 2 log n si n ? 2 Il en r´ esulte que la complexit´ e f(n) du tri fusion dans le pire des cas est O(n log n). Le nombre minimum de comparaisons d?un interclassement de deux listes de taille m et n est min{m, n}. Dans le cas de la proc´ edure tri-fusion, ce nombre est n/2 . Le nombre minimum de comparaisons, not´ e h(n) d?un tri fusion d?une liste de n ´ el´ ements v´ erifie donc l?in´ egalit´ e : h(n) ? n/2 + h( n/2 ) + h( n/2 ). On obtient une minoration de h en r´ esolvant l?´ equation de r´ ecurrence g(n) = 0 si n = 1 n/2 + g( n/2 ) + g( n/2 ) si n ? 2. Les r´ esultats sur les r´ ecurrences de partition permettent alors de montrer que g(n) = ?(n log n). La complexit´ e du tri fusion est donc ?(n log n). 5.1.3 Le tri par tas Rappelons qu?un tas est un arbre tournoi parfait dont les sommets contiennent les ´ el´ ements d?un ensemble E muni d?une cl´ e c : E ? F o` u F est totalement ordonn´ e. Dans la section 3.4, des algorithmes ont ´ et´ e donn´ es pour l?insertion et pour la suppression d?un ´ el´ ement de plus petite cl´ e. Ces algorithmes utilisent une impl´ ementation du tas par un couple (T, p) o` u p est le nombre d?´ el´ ements contenus dans le tas et T est un tableau ` a p positions. Le tri par tas consiste simplement ` a Version 6 f´ evrier 2005 5.2. Tri externe 131 ins´ erer un ` a un les n ´ el´ ements de la liste initiale puis ` a r´ ealiser n suppressions d?un ´ el´ ement de plus petite cl´ e. Afin de pouvoir utiliser directement les algorithmes ins´ erertas et extrairemin donn´ es dans la section 3.4, nous supposerons que la liste initiale est impl´ ement´ ee par le tableau T[1..n]. La proc´ edure Tri-par-tas ci-dessous utilise uniquement le tableau T pour toutes les op´ erations de mise ` a jour. proc´ edure Tri-par-tas(T, n); p := 0; {cr´ eation d?un tas vide} pour k de 1 ` a n faire Ins´ erer(T(k), T); pour k de 1 ` a n faire extrairemin(T). Avant la ki` eme insertion, le tas est constitu´ e des k ? 1 premiers ´ el´ ements de T et les ´ el´ ements non encore ins´ er´ es occupent les n ? k positions suivantes. Apr` es la ki` eme suppression, le tas occupe les n ? k premi` eres positions du tableau et les ´ el´ ements occupant les k derni` eres positions sont rang´ es par cl´ e d´ ecroissante au sens large. En effet, l?´ echange des contenus de la racine et de la derni` ere feuille du tas, r´ ealis´ e au d´ ebut de extrairemin(T), permet de r´ ecup´ erer l?´ el´ ement supprim´ e lors de la ki` eme suppression dans la position n ? k + 1 du tableau. Comme la complexit´ e en temps des algorithmes Ins´ erer et extrairemin est O(log n) o` u n est le nombre d?´ el´ ements du tas, la complexit´ e du tri par tas est O(n log n). La figure 1.6 montre l?ex´ ecution de l?algorithme de tri par tas. Une barre oblique ` a l?int´ erieur du tableau indique la s´ eparation entre le tas en partie gauche et les ´ el´ ements non contenus dans le tas en partie droite. 5.2 Tri externe Les probl` emes de tri ´ etudi´ es jusqu?ici supposent que tous les objets ` a trier sont plac´ es en m´ emoire centrale. Cependant en pratique, cette hypoth` ese ne peut ? etre satisfaite en raison de la taille et du nombre des objets ` a trier. Ces objets sont alors plac´ es sur des m´ emoires secondaires (disques, bandes magn´ etiques, etc.) et l?algorithme de tri ex´ ecutera des op´ erations de lecture et d?´ ecriture sur le support utilis´ e. Comme la dur´ ee d?une op´ eration d?entr´ ee-sortie sur une m´ emoire externe est beaucoup plus grande qu?un temps d?acc` es ` a la m´ emoire centrale, le temps op´ eratoire d?un algorithme de tri externe est essentiellement d? u au nombre d?op´ erations d?entr´ ee-sortie qu?il ex´ ecute. Ce nombre sera la mesure de complexit´ e que nous utiliserons pour ce type d?algorithme. Le mode d?acc` es (s´ equentiel, direct, etc.) est bien s? ur un param` etre important pour la conception d?un algorithme de tri externe. Nous nous limiterons au cas de supports identiques ` a acc` es s´ equentiel. Version 6 f´ evrier 2005 132 Chapitre 5. Tris [6/3,2,3,1,5] [3,6/2,3,1,5] 6 3 6 2 6 3 [2,6,3/3,1,5] [6,3,2,3,1,5] Liste initiale 2 3 3 6 [2,3,3,6/1,5] 1 2 3 6 3 [1,2,3,6,3/5] 1 2 3 6 3 5 [1,2,3,6,3,5] Insertion des six éléments 1 2 3 6 3 5 [1,2,3,6,3,5] 2 3 6 3 [2,3,3,6,5/1] 5 3 3 6 [3,3,5,6/2,1] 5 6 3 [3,6,5/3,2,1] 5 6 [5,6/3,3,2,1] 5 6 [6/5,3,3,2,1] [6,5,3,3,2,1] liste terminale Suppression des six éléments Figure 1.6: Un tri par tas. La structure g´ en´ erale d?un algorithme de tri externe comprend la r´ esolution de trois probl` emes. Le premier est la construction de monotonies, c?est-` a-dire de sous-listes disjointes tri´ ees. Le second est la r´ epartition dynamique des monotonies sur les supports. Le troisi` eme est l?interclassement des monotonies. Les solutions retenues pour ces trois probl` emes doivent concourir ` a l?obtention sur un support de la liste tri´ ee de tous les objets en minimisant le nombre d?op´ erations d?entr´ ee- sortie pour y parvenir. Il faut en particulier ´ eviter des situations dites de blocage o` u toutes les monotonies se trouvent plac´ ees sur un m? eme support alors que le tri n?est pas termin´ e. Dans ce chapitre nous ´ etudierons plus sp´ ecialement le probl` eme de la r´ epartition dynamique des monotonies et l?une de ses solutions, appel´ ee tri polyphas´ e, qui, en utilisant les nombres de Fibonacci, conduit ` a un algorithme performant. Nous noterons s le nombre de supports, n le nombre d?objets ` a trier et m la place disponible en m´ emoire centrale, mesur´ ee en nombre d?objets. On suppose que les Version 6 f´ evrier 2005 5.2. Tri externe 133 n objets sont initialement plac´ es sur un m? eme support not´ e S0. 5.2.1 Construction des monotonies Pour limiter le nombre d?entr´ ees-sorties, il convient de construire un petit nombre de monotonies de grande taille. Deux techniques conduisant ` a un nombre compa- rable d?entr´ ees-sorties r´ epondent ` a cet objectif. L?une construit des monotonies de m? eme taille m en utilisant un algorithme de tri interne; l?autre construit des monotonies en g´ en´ eral plus longues par s´ election et remplacement. Monotonies de m? eme taille Chaque it´ eration consiste ` a lire en m´ emoire centrale les m objets suivants du support S0 (ou le nombre restant d?objets s?il est inf´ erieur ` a m), ` a trier les objets contenus en m´ emoire centrale par un algorithme de tri interne et ` a ´ ecrire la liste obtenue sur un support qui d´ epend de la strat´ egie de r´ epartition. L?algorithme r´ ealise ainsi d?une part 2n op´ erations d?entr´ ee-sortie (n lectures et n ´ ecritures) et d?autre part n/m tris internes. S´ election et remplacement L?algorithme est initialis´ e par la lecture en m´ emoire centrale des m premiers ob- jets de S0. On note E l?ensemble des objets contenus en m´ emoire centrale et f l?objet suivant sur S0. L?ensemble E contient un sous-ensemble M initialement vide d?objets dits marqu´ es car ils ne peuvent appartenir ` a la monotonie en cours de construction. Le calcul de la monotonie suivante commence lorsque M est vide et se termine lorsque M est ´ egal ` a E. Une it´ eration consiste ` a calculer le plus petit ´ el´ ement e de E?M, ` a placer e ` a la suite de la monotonie courante en construction et ` a lire en m´ emoire centrale l?objet f de S0 dans la place occup´ ee par e. Si f est plus petit que e, il est ajout´ e ` a l?ensemble M car il ne pourra pas faire partie de la monotonie courante. Le pire des cas correspond aux objets rang´ es initialement dans l?ordre inverse de l?ordre requis. Apr` es la lecture en m´ emoire centrale des m premiers objets, tout nouvel objet lu en m´ emoire est imm´ ediatement marqu´ e. Chaque monotonie est alors de taille m. Dans le cas g´ en´ eral, la taille de chaque monotonie (sauf peut-? etre la derni` ere) est plus grande que m. Si les objets non marqu´ es en m´ emoire centrale sont organis´ es en tas, la complexit´ e des op´ erations ´ el´ ementaires hors entr´ ees-sorties est O(n log m) et le nombre d?op´ erations d? entr´ ee-sortie est 2n puisque chaque ´ el´ ement est lu et ´ ecrit une seule fois. La figure 2.1 d´ ecrit les dix premi` eres ´ etapes d?un exemple de construction de monotonies par s´ election et remplacement pour une m´ emoire de 5 cellules (m=5). La liste initiale sur support externe est S0=(4, 3, 6, 7, 10, 5, 1, 2, 8, 3, 5, 9, 4). L?´ el´ ement de la ligne i et de la colonne j est la cl´ e de l?objet contenu dans la cellule i ` a l?´ etape j. Si cette cl´ e est suivie d?une ´ etoile, la cellule i appartient ` a M. Si cette cl´ e est Version 6 f´ evrier 2005 134 Chapitre 5. Tris suivie d?une pointe de fl` eche, l?objet correspondant est le suivant de la monotonie en cours. Comme apr` es l?´ etape 8 toutes les cellules sont marqu´ ees, la premi` ere monotonie est (3, 4, 5, 6, 7, 8, 10). La seconde commence par (1, 2, . . .). 4 3^ 6 7 10 4^ 5 6 7 10 1* 5^ 6 7 10 1* 2* 6^ 7 10 1* 2* 8 7^ 10 1* 2* 8^ 3* 10 1* 2* 5* 3* 10^ 1* 2* 5* 3* 9* 1^ 2 5 3 9 4 2^ 5 3 9 1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 changement de monotonie Figure 2.1: S´ election et remplacement. 5.2.2 R´ epartition des monotonies Une fois construite, chaque monotonie doit ? etre plac´ ee sur l?un des s supports. La strat´ egie de r´ epartition des monotonies sur les supports est ici essentielle pour l?efficacit´ e des op´ erations ult´ erieures d?interclassement. Nous examinons deux strat´ egies de r´ epartition. Le tri ´ equilibr´ e a le m´ erite d?? etre simple ` a impl´ ementer, mais utilise mal les supports, r´ ealise 2n op´ erations d?entr´ ee-sortie par phase et surtout est contraint d?ex´ ecuter des recopies de monotonies. Le tri polyphas´ e, en fondant sa strat´ egie de r´ epartition sur les nombres de Fibonacci, r´ ealise un nom- bre limit´ e d?op´ erations d?entr´ ee-sortie ` a chaque phase, n?est jamais contraint ` a de simples recopies, mais doit par contre introduire des monotonies fant? omes si le nombre total de monotonies initiales n?est pas l?un des ´ el´ ements d?une suite sp´ ecifique d´ eduite de la suite de Fibonacci d?ordre s ? 1. Le tri ´ equilibr´ e Le tri ´ equilibr´ e consiste ` a d´ efinir deux sous-ensembles L (supports de lecture) et E (supports d?´ ecriture) de q supports chacun. Lors de leur cr´ eation, les monotonies sont r´ eparties uniform´ ement sur les supports de L. Une phase de l?algorithme est d´ ecrite par la proc´ edure phase-tri-´ equilibr´ e ci-dessous. L?it´ eration fon- damentale de cette proc´ edure, appel´ ee fusion ´ el´ ementaire et impl´ ement´ ee par fusion( ?, k), lit la premi` ere monotonie de chaque support de ?, interclasse ces monotonies en m´ emoire centrale et ´ ecrit la monotonie r´ esultat sur le support d?´ ecriture k. Version 6 f´ evrier 2005 5.2. Tri externe 135 proc´ edure phase-tri-´ equilibr´ e; k := 0 (mod q); tantque toutes les monotonies de L n?ont pas ´ et´ e lues faire soit ? le sous-ensemble des supports non vides de L; fusion( ?, k); k := k + 1 (mod q) fintantque; L := ensemble des supports de E ; E := ensemble des supports de L. Une phase du tri ´ equilibr´ e fait passer le nombre de monotonies de M ` a M/q et les nouvelles monotonies restent uniform´ ement r´ eparties sur les supports. Si M0 est le nombre initial de monotonies, le nombre maximal de phases est en O(log M0). Chaque phase r´ ealise 2n entr´ ees-sorties car chaque objet est lu et ´ ecrit une fois. Il en r´ esulte que le nombre d?op´ erations d?entr´ ee-sortie du tri ´ equilibr´ e est en O(n log M0). La figure 2.2 d´ ecrit un tri ´ equilibr´ e. Les Mi sont les monotonies initiales et f est l?op´ erateur de fusion ´ el´ ementaire. Les sous-ensembles {S1, S2, S3} et {S4, S5, S6} sont alternativement utilis´ es en lecture et en ´ ecriture. Lors de la phase 1, la monotonie M3 a simplement ´ et´ e recopi´ ee. S1 S2 S3 S4 S5 S6 M1,M2,M3 M4,M5 M6,M7 f(M1,M4,M6) f(M2,M5,M7) M3=f(M3) f(f(M1,M4,M6),f(M2,M5,M7),M1) phase 0 phase 1 phase 2 Figure 2.2: Le tri ´ equilibr´ e. Comme nous l?avons soulign´ e, le principal inconv´ enient du tri ´ equilibr´ e est de r´ ealiser une lecture et une ´ ecriture de chaque objet lors d?une m? eme phase. De plus, si en fin de phase tous les supports de lecture sont vides sauf un ne con- tenant qu?une seule monotonie, celle-ci sera simplement recopi´ ee et le nombre de monotonies ne diminuera pas lors de cette fusion ´ el´ ementaire. Le tri polyphas´ e Par rapport au tri ´ equilibr´ e, le tri polyphas´ e ne r´ ealise au cours d?une phase qu?un nombre limit´ e d?op´ erations d?entr´ ee-sortie, n?ex´ ecute pas de simples recopies et Version 6 f´ evrier 2005 136 Chapitre 5. Tris utilise beaucoup mieux l?ensemble des supports en se servant des nombres de Fibonacci pour r´ epartir initialement les monotonies. L?it´ eration fondamentale du tri polyphas´ e, ´ egalement appel´ ee phase, consiste ` a choisir un support dit d?´ ecriture, not´ e e et ` a r´ ealiser k fusions ´ el´ ementaires sur le support e. L?´ etat du syst` eme est d´ efini par la suite ordonn´ ee par valeurs d´ ecroissantes N = (N1, . . . , Ns) des nombres de monotonies sur les S supports, chaque rang de cette suite correspondant ` a un num´ ero logique de support. On passe des num´ eros logiques aux num´ eros physiques par une permutation et l?on appelle total de N le nombre ?(N) = i?{1,...,s} Ni. Le lemme suivant d´ etermine pour un ´ etat terminal N fix´ e, quel est l?´ etat initial de plus grand total permettant d?atteindre N en une seule phase. Lemme 2.1. L?´ etat (N1 + N2, N1 + N3, · · · , N1 + Ns, 0) est un ´ etat de total maximal permettant d?atteindre l?´ etat N en une seule phase. Preuve. Notons ?(N) = (N1 + N2, N1 + N3, · · ·, N1 + Ns, 0). En prenant comme suppport d?´ ecriture e celui qui ne contient aucune monotonie et en r´ ealisant N1 fusions ´ el´ ementaires de l?ensemble des autres supports sur e, on construit une phase qui fait passer de l?´ etat ?(N) ` a l?´ etat (N2, N3, · · ·, Ns, N1) qui, ` a une per- mutation pr` es, est l?´ etat N. Remarquons de plus que ?(?(N)) = ?(N)+(s?2)N1. Supposons maintenant que M soit un ´ etat initial permettant de passer en une seule phase de l?´ etat M ` a l?´ etat N. Consid´ erons les num´ eros logiques des supports dans M. Soit e le num´ ero du support d?´ ecriture choisi et ai, i ? {1, . . . , s}?{e} le nombre d?occurrences du support num´ ero i dans les k fusions ´ el´ ementaires de la phase. Le nombre de monotonies du support num´ ero i devient Mi = Mi ? ai, i ? {1, . . . , s}?{e} et celui du support num´ ero e devient Me = Me +k. Comme nous avons k ? Me et pour tout i dans {1, . . . , s} ? {e}, ai ? k, il vient : ?(M) = ?(M ) + ( i?{1,...,s}?{e} ai) ? k ? ?(M ) + (s ? 2)k ? ?(N) + (s ? 2)N1 car ?(M ) = ?(N) et k ? N1. Soit E1 = (1, 0, · · ·, 0) l?´ etat final associ´ e ` a la liste des objets totalement tri´ ee sur un seul support. Il r´ esulte du lemme pr´ ec´ edent que ?(n) (E1 ) est une r´ epartition initiale sur les supports qui permet d?obtenir l?´ etat E1 en n phases. Si m est le nombre initial de monotonies, le tri polyphas´ e utilise comme r´ epartition initiale le vecteur ?(k) (E1 ) o` u k est le plus petit entier tel que ?(?(k) (E1 )) ? m. Il faudra donc ajouter et r´ epartir sur les supports m ? ?(?(k) (E1 )) monotonies fant? omes. R´ epartition initiale des monotonies Nous examinons dans cette section la nature et les propri´ et´ es essentielles de la suite ?(n) (E1 ), n ? N et la r´ epartition initiale des monotonies fant? omes. Notons que n est l?indice g´ en´ erique de la suite et ne repr´ esente pas dans cette section le Version 6 f´ evrier 2005 5.2. Tri externe 137 nombre d?´ el´ ements ` a trier. Nous notons F n s = (fn 1, . . . , fn s) le vecteur ?(n) (E1 ) et Ts(n) son total. Il r´ esulte directement de la d´ efinition de ? que F n+1 s est obtenu ` a partir de Fn s par la relation de r´ ecurrence suivante : fn+1 i = fn 1 + fn i+1 si i ? s ? 1 0 si i = s avec comme conditions initiales : f0 i = 1 si i = 1 0 sinon Le tableau ci-dessous montre les valeurs de F n s pour s = 6 et 0 ? n ? 8. n fn 1 fn 2 fn 3 fn 4 fn 5 fn 6 T(n) 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 5 2 2 2 2 2 1 0 9 3 4 4 4 3 2 0 17 4 8 8 7 6 4 0 33 5 16 15 14 12 8 0 65 6 31 30 28 24 16 0 129 7 61 59 55 47 31 0 253 8 120 116 108 92 61 0 497 Dans le cas particulier de trois supports, l?´ equation de r´ ecurrence pr´ ec´ edente s?´ ecrit pour n ? 2 : fn+1 1 = fn 1 + fn 2 fn+1 2 = fn 1 . Sa solution est imm´ ediate car nous avons pour n ? 2 : fn+1 1 = fn 1 + fn?1 1 fn+1 2 = fn?1 1 + fn?1 2 = fn 2 + fn?1 2 . Compte tenu des conditions initiales, ` a savoir f0 1 = f1 1 = 1, f0 2 = 0 et f1 2 = 1, nous obtenons : fn 1 = ?(n + 1) fn 2 = ?(n) T3(n) = ?(n + 2) o` u ?(n) est l?´ el´ ement de rang n de la suite de Fibonacci d?ordre deux d´ efinie par : ?(n) = ?(n ? 1) + ?(n ? 2) si n ? 2 1 si n = 1 0 si n = 0 Dans le cas g´ en´ eral, la suite de Fibonnaccci d?ordre p, not´ ee ?p (n) est d´ efinie par : ?p (n) = ? ? ? p k=1 ?p (n ? k) si n ? p 1 si n = p ? 1 0 si n ? {0, . . . , p ? 2} Version 6 f´ evrier 2005 138 Chapitre 5. Tris On montre alors que dans le cas de s supports : fn k = ?s?1 (n+(s?1)?2)+?s?1 (n+(s?1)?3)+· · ·+?s?1 (n+(s?1)?(s+1?k) et que le nombre total de monotonies est donn´ e par : Ts(n) = (s ? 1)?s?1 (n + (s ? 3)) + (s ? 2)?s?1 (n + (s ? 4)) + · · · + ?s?1 (n ? 1) Supposons que le nombre initial m de monotonies soit compris strictement entre Ts(n) et Ts(n+1). Il faut donc cr´ eer Ts(n+1)?m monotonies fant? omes que l?on a avantage ` a r´ epartir aussi uniform´ ement que possible sur les supports. L?algorithme fibonacci(s, m) ci-dessous r´ ealise cet objectif en construisant la r´ epartition F n+1 s et en donnant la priorit´ e aux monotonies fant? omes. proc´ edure fibonacci(s, m); {On suppose connu l?entier n tel que Ts(n) < m < Ts(n + 1)} r := Ts(n + 1) ? Ts(n); F := Ts(n + 1) ? m; pour S de 1 ` a s ? 1 faire d(S) := fn+1 S ? fn S ; S := 0; pour j de 1 ` a r faire S := S + 1 (mod s ? 1); si d(S) > 0 alors d(S) := d(S) ? 1; si j < F alors ´ ecrire une monotonie fant? ome sur le support S + 1 sinon ´ ecrire la monotonie suivante sur le support S + 1; finsi finsi finpour; pour S de 1 ` a s ? 1 faire ´ ecrire les fn S monotonies suivantes sur le support S finpour. La figure 2.3 montre la r´ epartition r´ ealis´ ee par l?algorithme pr´ ec´ edent pour 19 monotonies initiales et 6 supports. Pour cet exemple, on a : T6(3)=17, T6(4)=33 et F6(4)=(8, 8, 7, 6, 4, 0). Analyse du tri polyphas´ e La fonction g´ en´ eratrice ? ?p de la suite de Fibonacci d?ordre p est donn´ ee par : ? ?p (z) = n?N ?p (n)zn = zp?1 1 ? z ? z2 ? · · · ? zp . Version 6 f´ evrier 2005 5.2. Tri externe 139 f f f f f f f f f f f f f f m m m m m m m m m m m m m m m m m S5 S4 S3 S2 S1 f: monotonie fantôme m: monotonie réelle m m Figure 2.3: R´ epartition des monotonies fant? omes. Il r´ esulte alors des formules du paragraphe pr´ ec´ edent donnant les fn p et Ts(n) que les fonctions g´ en´ eratrices ? f1 et ? Ts des suites fn 1 et Ts(n) sont respectivement : ? f1(z) = n?N f1(n)zn = 1 1 ? z ? z2 ? · · · ? zp et ? Ts(z) = n?N Ts(n)zn = (s ? 1)z + (s ? 2)z2 + · · · + zs?1 1 ? z ? z2 ? · · · ? zp . Comme les z´ eros du polyn? ome 1?z?z2 ?· · ·?zp sont tous de module strictement plus petit que l?unit´ e, on a Ts(n) = O(an ) o` u a est un rationnel strictement plus grand que l?unit´ e. Si donc m = Ts(n) est le nombre initial de monotonies, le nombre de phases du tri polyphas´ e est en O(log m). Pour ´ evaluer le nombre d?op´ erations d?entr´ ee-sortie qui, rappelons-le, est notre mesure de complexit´ e, nous supposons que toutes les monotonies initiales ont la m? eme taille t et nous introduisons la notion de transfert. Un transfert correspond au passage de t objets d?un support sur un autre. Nous allons compter le nombre de transferts r´ ealis´ es par un tri polyphas´ e ` a partir de la distribution initiale F n s . Notons que ce calcul prend en compte la taille des monotonies construites au cours de l?ex´ ecution du tri. Le tableau ci-dessous, construit pour un exemple ` a huit phases et six supports, montre l?´ evolution de la taille des monotonies sur chaque support, du nombre de monotonies sur chaque support, et du nombre de transferts t par phase. n S1 S2 S3 S4 S5 S6 t 1 [1]61 [1]59 [1]55 [1]47 [1]31 [0] 253 2 [5]31 [1]30 [1]28 [1]24 [1]16 [0] 5 × 31 3 [9]16 [5]15 [1]14 [1]12 [1]8 [0] 9 × 16 4 [17]8 [9]8 [5]7 [1]6 [1]4 [0] 17 × 8 5 [33]4 [17]4 [9]4 [5]3 [1]2 [0] 33 × 4 6 [65]2 [33]2 [17]2 [9]2 [5]1 [0] 65 × 2 7 [129]1 [65]1 [33]1 [17]1 [9]1 [0] 129 × 1 8 [253]1 [0] [0] [0] [0] [0] 253 × 1 Version 6 f´ evrier 2005 140 Chapitre 5. Tris Un ´ el´ ement [a]b du tableau o` u a et b sont deux entiers doit ? etre interpr´ et´ e comme b monotonies de taille a. Les nombres de Fibonacci apparaissent partout dans ce tableau. On montre que d?une mani` ere g´ en´ erale pour n phases et s supports, la premi` ere ligne du tableau central est : ([Ts(0)]fn 1 , [Ts(0)]fn 2 , · · · , [Ts(0)]fn s?1 ) et que la ligne associ´ ee ` a la phase p (hormis le nombre de transferts) est : ([Ts(p ? 1)]fn?p+1 1 , [Ts(p ? 2)]fn?p+1 2 , · · · , [Ts(p ? s + 1)]fn?p+1 s?1 ) en adoptant la convention que Ts(k) = 1 si k ? 0. Il r´ esulte alors de la structure de la ligne g´ en´ erale du tableau central que le nombre de transferts associ´ e ` a la phase p est donn´ e par : fn?p+1 s?1 [Ts(p ? 1) + Ts(p ? 2) + · · · + Ts(p ? s + 1)] ce qui s?´ ecrit encore : fn?p 1 × Ts(p). Le nombre total de transferts, not´ e ?s(n), est donc ´ egal ` a Ts(n)+ n p=1 fn?p 1 ×Ts(p). Il en r´ esulte que ?s(n) est ´ egal ` a la somme de Ts(n) et du coefficient de zn dans ? f1(z) ? Ts(z). Lorsque n tend vers +?, le rapport ?s(n)/Ts(n) est ´ equivalent ` a une fonction lin´ eaire du type As ln(Ts(n)) + Bs o` u As et Bs ne d´ ependent que du nombre s de supports. Ce comportement a ´ egalement ´ et´ e observ´ e exp´ erimentalement pour la r´ epartition issue de la proc´ edure Fibonacci( s, m) lorsque le nombre m de monotonies initiales (de m? eme taille) tend vers +? mais n?est pas n´ ecessairement ´ egal ` a l?une des valeurs de la suite Ts(n). Notes Dans ce chapitre, nous nous sommes limit´ es ` a la pr´ esentation de trois algorithmes classiques de tri interne et un algorithme de tri externe. L?ouvrage le plus complet du domaine est : D. Knuth, The Art of Computer Programming, tome 3 : Sorting and Searching, Addison Wesley, 1973. Exercices 5.1. Le tri bulle d?un tableau t[i..j] de n ´ el´ ements consiste, pour k variant de i ` a j ?1, ` a faire remonter le plus petit ´ el´ ement du sous-tableau t[k..j] en position k par une suite d?´ echanges. La proc´ edure tri-bulle ci-dessous impl´ emente cet algorithme : Version 6 f´ evrier 2005 Exercices 141 proc´ edure tri-bulle(t, i, j); pour k de i ` a j ? 1 faire pour p de j ? 1 ` a k pas ?1 faire si c(p + 1) < c(p) alors ´ echanger(t, p + 1, p) {c(k) est la cl´ e de l?´ el´ ement t(k)} finpour finpour. a) D´ eterminer le nombre de comparaisons ex´ ecut´ ees par le tri bulle sur un tableau ` a n ´ el´ ements. b) D´ eterminer le nombre maximum et le nombre minimum d?´ echanges ex´ ecut´ es par le tri bulle sur un tableau ` a n ´ el´ ements. On suppose maintenant que les cl´ es sont distinctes deux ` a deux et l?on note ?(t) la permutation de {1, . . . , n} associ´ ee au rang des ´ el´ ements du tableau t[i..j]. c) D´ emontrer que le nombre d?´ echanges r´ ealis´ es par le tri bulle est ´ egal au nombre d?inversions de ?. On note In,k le nombre de permutations de {1, . . . , n} ayant k inversions. Exprimer In,k en fonction des In?1,p o` u p ? {max{0, k ? n + 1}, . . . , k}. En d´ eduire que la fonction g´ en´ eratrice In(z) = k?N In,kzk v´ erifie : In(z) = (1 + z + z2 + . . . + zn?1 )In?1(z) En supposant que les permutations ?(t) sont ´ equiprobables, montrer que le nom- bre moyen d?´ echanges du tri bulle est n(n?1) 4 . 5.2. Le tri par s´ election d?un tableau t[i..j] ` a n ´ el´ ements consiste ` a d´ eterminer l?´ el´ ement minimum du tableau, ` a ´ echanger cet ´ el´ ement avec le premier ´ el´ ement du tableau et ` a r´ ealiser r´ ecursivement ces op´ erations sur le tableau t[i + 1..j]. La proc´ edure tri-s´ election ci-dessous impl´ emente cet algorithme : proc´ edure tri-s´ election(t, i, j); si j > i alors soit c(k) = min{c(p) | p ? {i, . . . , j}}; ´ echanger(t, k, i); tri-s´ election(t, i + 1, j) finsi. a) D´ eterminer, en fonction de n, le nombre d?´ echanges r´ ealis´ es par la proc´ edure tri-s´ election. b) D´ eterminer, en fonction de n, le nombre minimum et le nombre maximum de comparaisons r´ ealis´ ees par la proc´ edure tri-s´ election. Version 6 f´ evrier 2005 142 Chapitre 5. Tris c) D´ eterminer le nombre moyen de comparaisons r´ ealis´ ees par la proc´ edure tri- s´ election si les cl´ es sont distinctes deux ` a deux et les permutations des rangs ´ equiprobables. 5.3. Le tri par insertion d?un tableau t[i..j] ` a n ´ el´ ements consiste ` a r´ ealiser un appel r´ ecursif pour le tableau t[i..j?1] et ` a ins´ erer le dernier ´ el´ ement du tableau ` a sa place dans le tableau en d´ ecalant d?une position vers la droite les ´ el´ ements qui le suivent. La proc´ edure tri-insertion ci-dessous impl´ emente cet algorithme : proc´ edure tri-insertion(t, i, j); si j > i alors tri-insertion(t, i, j ? 1); k := j ; tantque k > i etalors c(k) < c(k ? 1) faire ´ echanger(t, k ? 1, k) fintantque {c(k) est la cl´ e de l?´ el´ ement t(k)} finsi. a) D´ eterminer la complexit´ e du tri par insertion en nombre de comparaisons. On suppose que les cl´ es sont distinctes deux ` a deux et que les permutations des rangs sont ´ equiprobables. b) D´ emontrer que pour l?appel r´ ecursif, les permutations des rangs du tableau t[i..j ? 1] sont ´ equiprobables. c) En d´ eduire le nombre moyen de comparaisons du tri par insertion d?un tableau ` a n ´ el´ ements. 5.4. Soit E un ensemble de n ´ el´ ements dont les cl´ es sont des entiers cod´ es avec K chiffres de l?ensemble {0, . . . , 9}. Le tri par champs consiste ` a construire K listes {L1, . . . , LK} o` u la liste Lk est tri´ ee pour les k chiffres de poids faible. La liste LK est donc une liste tri´ ee. On note p(k) , k ? {1, . . . , K}, le ki` eme chiffre de poids faible d?un entier p ` a K chiffres. La proc´ edure tri-champs ci-dessous impl´ emente cet algorithme ` a partir de la liste L des n ´ el´ ements ` a trier : proc´ edure tri-champs(L); pour k de 1 ` a K faire pour i de 1 ` a n faire e :=d´ efiler(L); p := c(e)(k) ; {c(e) est la cl´ e de l?´ el´ ement e} enfiler(e, Lp) finpour; pour q de 0 ` a 9 faire L := L · Lq ; Lq := () finpour finpour. Version 6 f´ evrier 2005 Exercices 143 Les op´ erations d´ efiler et enfiler correspondent ` a la gestion d?une file. a) Montrer que la liste L obtenue en retour de la proc´ edure tri-champs est tri´ ee. b) Exprimer en fonction de n et K la complexit´ e (au sens classique) du tri par champs. c) En d´ eduire une condition pour que ce tri soit lin´ eaire par rapport ` a n. 5.5. Soient L1 et L2 deux listes tri´ ees contenant respectivement n et m entiers et rang´ ees dans deux tableaux T1 et T2. Ecrire un algorithme de complexit´ e en temps O(n + m) pour interclasser de ces deux listes dans un tableau T. 5.6. On utilise une variante de l?algorithme de tri rapide pour d´ eterminer le ki` eme ´ el´ ement d?un ensemble de n ´ el´ ements munis d?une cl´ e. On suppose que les n cl´ es sont distinctes deux ` a deux. On consid` ere dans un premier temps la fonction s´ elect ci-dessous : fonction s´ elect(t, i, j, k) : ´ el´ ement; {on suppose que 1 ? k ? n} p :=pivoter(t, i, j); si k ? p alors s´ elect :=s´ elect(t, i, p, k) sinon s´ elect :=s´ elect(t, p + 1, j, k ? p) finsi. o` u la fonction pivoter retourne un entier p ? {i + 1, . . . , j ? 1} et r´ eorganise en temps O(n) le tableau t[i..j] en deux sous-tableaux t[i..p] et t[p + 1..j] tels qu?un ´ el´ ement quelconque de t[i..p] poss` ede une cl´ e inf´ erieure ou ´ egale ` a celle d?un ´ el´ ement quelconque de t[p + 1..j]. a) D´ emontrer que la proc´ edure s´ elect d´ etermine le ki` eme ´ el´ ement du tableau. b) Montrer que, sans hypoth` ese particuli` ere sur l?algorithme de pivotage, la fonc- tion s´ elect peut r´ ealiser O(n2 ) comparaisons. c) Montrer que si l?algorithme de pivotage garantit que la taille du sous-tableau de l?appel r´ ecursif ne d´ epasse pas ?n o` u ? < 1, la complexit´ e en nombre de com- paraisons de la fonction s´ elect est O(n). On consid` ere l?algorithme de choix du pivot suivant : 1. d´ ecouper le tableau en n/5 blocs {B1, . . . , B n/5 } de cinq ´ el´ ements; les ´ el´ ements restants (au plus 4) ne seront pas consid´ er´ es dans la suite de l?algorithme; 2. d´ eterminer les ´ el´ ements m´ edians mk des Bk, k ? {1, . . . , n/5 }; 3. utiliser la fonction s´ elect pour d´ eterminer l?´ el´ ement d?ordre n+5 10 de la liste (m1, . . . , m n/5 ); (si n/5 est pair, l?´ el´ ement s´ electionn´ e est l?´ el´ ement m´ edian de la liste (m1, . . . , m n/5 )). d) Montrer que le pivot choisi est strictement sup´ erieur ` a au moins 3 n?5 10 ´ el´ ements de t et est inf´ erieur ou ´ egal ` a au moins 3 n?5 10 ´ el´ ements de t. En d´ eduire Version 6 f´ evrier 2005 144 Chapitre 5. Tris que pour n ? 75, le sous-tableau de l?appel r´ ecursif est de taille au plus ´ egale ` a 3n/4. On consid` ere alors la fonction s´ elect suivante : fonction s´ elect(t, i, j, k) : ´ el´ ement; si (j ? i) ? 74 alors trier(t, i, j); extraire l?´ el´ ement d?ordre k de t; exit sinon pour q de 1 ` a n/5 faire m(q) :=m´ edian(t, 5(q ? 1) + i, 5(q ? 1) + i + 4) {m(q) est l?indice dans t de l?´ el´ ement m´ edian} {de {t(5(q ? 1) + i), . . . , t(5(q ? 1) + i + 4)}} finpour; r :=s´ elect(m, 1, n/5 , n+5 10 ); {r est l?indice dans t de l?´ el´ ement} { d?ordre n+5 10 de (tm(1), . . . , tm( n/5 )} p :=partition(t, i, j, r); si p ? k alors s´ elect :=s´ elect(t, i, p, k) sinon s´ elect :=s´ elect(t, p + 1, j, k ? p) finsi finsi. La proc´ edure trier est un algorithme de tri quelconque. La fonction m´ edian fournit l?´ el´ ement de rang 3 d?une liste de 5 ´ el´ ements. La proc´ edure partition r´ eorganise le tableau t en prenant t(r) comme pivot; apr` es son ex´ ecution, un ´ el´ ement quelconque de t[i..p] a une cl´ e inf´ erieure ou ´ egale ` a t(r), un ´ el´ ement quelconque de t[p + 1..j] a une cl´ e strictement sup´ erieure ` a t(r). e) D´ emontrer la validit´ e de la fonction s´ elect. f) Montrer que la complexit´ e de la fonction s´ elect est O(n). Version 6 f´ evrier 2005 145 Chapitre 6 Arbres et ensembles ordonn´ es Ce long chapitre contient la description de plusieurs familles d?arbres binaires de recherche ´ equilibr´ es. Nous commen¸ cons par les arbres AVL, puis nous d´ ecrivons les arbres a?b, avec notamment des op´ erations plus ´ elabor´ ees comme la con- cat´ enation et la scission, et le co? ut amorti d?une suite d?op´ erations. Ensuite, nous pr´ esentons les arbres bicolores, et enfin une r´ ealisation de structures persistantes sur ces arbres. Introduction La manipulation de grands volumes d?informations est une t? ache fr´ equente en algorithmique. Ce chapitre pr´ esente plusieurs structures de donn´ ees pour leur gestion. Les donn´ ees peuvent ? etre tr` es vari´ ees, et organis´ ees diff´ eremment d?une application ` a l?autre. Nous supposons que chaque donn´ ee comporte un champ particulier, appel´ e sa cl´ e qui peut ? etre, par exemple, une cha? ?ne de caract` eres ou un num´ ero. Les cl´ es permettent d?identifier les donn´ ees, et des donn´ ees diff´ erentes ont donc des cl´ es distinctes. Une cl´ e permet d?acc´ eder ` a la donn´ ee qu?elle repr´ esente, selon un m´ ecanisme qui d´ epend de la situation consid´ er´ ee, et que nous ne con- sid´ erons pas ici. Les cl´ es elles-m? emes, et c?est l` a leur int´ er? et, sont prises dans un ensemble totalement ordonn´ e (appel´ e l? univers ). La manipulation des donn´ ees se fait donc ` a travers la manipulation des cl´ es. On peut distinguer trois cat´ egories de structures de donn´ ees, en fonction de leur comportement dans le temps. Une structure statique repr´ esente un ensemble qui ne varie pas (ou tr` es peu) dans le temps. Un exemple typique est un lexique fixe. D?autres exemples sont fournis en g´ eom´ etrie algorithmique; dans le probl` eme de localisation, il s?agit de d´ eterminer dans quelle r´ egion d?une subdivision fixe du plan se trouve un point donn´ e. L?action principale sur une telle structure est la recherche d?informations, les mises ` a jour ´ etant exceptionnelles et de ce fait n´ egligeables. Un soin particulier (et donc un certain temps) peut ? etre consacr´ e ` a Version 6 f´ evrier 2005 146 Chapitre 6. Arbres et ensembles ordonn´ es la construction d?une structure optimale . M? eme si l?ensemble des donn´ ees est statique, la structure de donn´ ees peut ´ evoluer dans le temps, pour am´ eliorer le temps de r´ eponse en fonction de la fr´ equence des interrogations. Les structures dynamiques, qui font l?objet de ce chapitre, permettent en plus des modifications de l?ensemble des donn´ ees repr´ esent´ ees. Il s?agit principalement d?impl´ ementer des dictionnaires, donc de r´ ealiser la recherche, l?insertion et la sup- pression d?informations, ou des listes concat´ enables qui exigent comme op´ erations suppl´ ementaires la concat´ enation et la scission. Les arbres binaires de recherche ´ equilibr´ es r´ ealisent ces op´ erations de mani` ere efficace. Ces structures sont ´ eph´ em` eres dans le sens o` u une mise ` a jour d´ etruit de fa¸ con d´ efinitive la version pr´ ec´ edente. Une structure est persistante si elle est dyna- mique, et si elle conserve ´ egalement les versions ant´ erieures de la structure. On peut distinguer deux degr´ es de persistance : si l?on dispose de la liste des ver- sions pr´ ec´ edentes, on peut rechercher la pr´ esence d?´ el´ ements dans une version ant´ erieure; si de plus on est autoris´ e ` a modifier les versions ant´ erieures, on aboutit ` a un arbre de versions, la plus ´ elabor´ ee des structures persistantes. Nous allons pr´ esenter une r´ ealisation efficace de la liste des versions. Dans ce chapitre, nous proposons des solutions au probl` eme que voici : ´ etant donn´ e un ensemble S, sous-ensemble de l?univers not´ e U, effectuer de mani` ere efficace les op´ erations suivantes, qui caract´ erisent un dictionnaire : rechercher un ´ el´ ement dans S, ins´ erer un ´ el´ ement dans S, supprimer un ´ el´ ement dans S. Nous examinerons aussi d?autres op´ erations, comme la scission et la concat´ enation. Eliminons tout de suite le cas d?un univers qui serait petit . On peut alors impl´ ementer ces op´ erations de fa¸ con tr` es simple. Un ensemble S est repr´ esent´ e par un tableau indic´ e par les ´ el´ ements de U, qui donne sa fonction caract´ eristique, c?est-` a-dire qui indique, pour chaque ´ el´ ement de U, s?il appartient ou non ` a S. Nous supposons dans la suite que l?univers U est tr` es grand, trop grand en tout cas pour permettre cette r´ ealisation, et que S est petit par rapport ` a U. Il appara? ?t que les arbres sont une structure de donn´ ees particuli` erement bien adapt´ ee ` a la r´ ealisation efficace des trois op´ erations de base (recherche, inser- tion, suppression). Lorsque l?arbre est ´ equilibr´ e selon des crit` eres ` a pr´ eciser, on peut ´ eviter qu?il d´ eg´ en` ere en une structure trop proche d?une liste, et on peut alors effectuer les op´ erations en temps logarithmique en fonction du nombre d?´ el´ ements de l?ensemble S. Bien ´ evidemment, l?insertion et la suppression peu- vent d´ es´ equilibrer l?arbre. Une partie substantielle des algorithmes est consacr´ ee aux op´ erations de r´ e´ equilibrage qui doivent ? etre r´ ealis´ ees avec soin. Une premi` ere esp` ece d?arbres binaires ´ equilibr´ es est constitu´ ee des arbres AVL, nomm´ ee ainsi d?apr` es les initiales de leurs deux inventeurs (Adelson-Velskii et Landis). Nous consid´ erons ensuite les arbres a?b qui sont des arbres o` u chaque n?ud a entre a et b fils. Nous pr´ esentons la version balis´ ee (dans le sens d´ efini ci-dessous) de ces arbres, et montrons comment les utiliser pour la concat´ enation et la scission. Les arbres bicolores, que nous introduisons ensuite, sont une autre Version 6 f´ evrier 2005 6.1. Arbres de recherche 147 famille d?arbres ´ equilibr´ es. Ils ont ´ et´ e con¸ cus ` a l?origine en vue de l?impl´ ementation des arbres a?b, mais leur importance d´ epasse ce cadre. Ils nous serviront notam- ment pour la repr´ esentation de structures persistantes, pr´ esent´ ees dans la derni` ere section. 6.1 Arbres de recherche 6.1.1 D´ efinition Nous allons parler d?arbres de recherche, et principalement d?arbres binaires de recherche. Il s?agit d?arbres binaires ´ etiquet´ es aux sommets. L?´ etiquette d?un som- met x est la cl´ e ou le contenu du sommet, et not´ ee c(x). Si A est un arbre binaire non vide, on note Ag et Ad ses sous-arbres gauche et droit. Pour tout sommet x, on note A(x) le sous-arbre de racine x, et Ag(x), Ad(x) les sous-arbres de A(x). Un arbre binaire de recherche est un arbre muni d?une fonction cl´ e c sur l?ensemble de ses sommets v´ erifiant c(y) < c(x) < c(z) pour tout sommet x, et pour tous sommets y de Ag(x) et z de Ad(x). Il revient au m? eme de dire que les cl´ es sont croissantes si on les liste dans l?ordre sym´ etrique. 400 232 300 125 252 363 357 399 702 801 950 825 620 706 720 732 712 Figure 1.1: Un arbre binaire de recherche. Il est commode de disposer de la m? eme notion pour les arborescences ordonn´ ees (un arbre binaire est un arbre positionn´ e au sens du chapitre 4). Dans une arbores- cence ordonn´ ee de recherche, chaque n?ud x, ` a d(x) fils, est muni de d(x)?1 cl´ es c1(x), . . . , cd(x)?1(x), v´ erifiant la propri´ et´ e suivante : soient A1(x), . . . , Ad(x)(x) les sous-arbres de x, et soit yi un sommet de Ai(x) pour 1 ? i ? d(x); alors c(y1) < c1(x) < c(y2) < · · · < cd(x)?1(x) < c(yd(x)). Nous regroupons les notions d?arbre binaire de recherche et d?arborescence or- donn´ ee de recherche sous le nom d?arbre de recherche. On rencontre en fait deux Version 6 f´ evrier 2005 148 Chapitre 6. Arbres et ensembles ordonn´ es cat´ egories d?arbres de recherche, ceux o` u l?information est rang´ ee aux sommets, et ceux o` u elle n?est rang´ ee qu?aux feuilles. Comme nous l?avons dit plus haut, chaque cl´ e est repr´ esentative d?une donn´ ee en g´ en´ eral plus volumineuse et plus lourde ` a manipuler que la cl´ e elle-m? eme. Chaque cl´ e permet un acc` es, direct ou indirect, ` a cette information, et cet acc` es peut ? etre rang´ e, avec la cl´ e correspon- dante, ` a tout sommet de l?arbre, ou aux feuilles seulement. Dans le deuxi` eme cas, les n?uds aussi contiennent des ´ el´ ements de l?ensemble U des cl´ es, mais elles ne servent qu?` a organiser l?arbre. Nous les appelons des balises. Elles permettent de naviguer dans l?arbre, et en particulier elles pilotent la descente dans l?arbre lors d?une recherche. Chaque n?ud contient une balise qui est sup´ erieure ou ´ egale aux cl´ es de son sous-arbre gauche, et inf´ erieure aux cl´ es de son sous-arbre droit (en d?autres termes, les cl´ es et les balises sont croissantes en parcours sym´ etrique). Les arbres a?b sont des arbres balis´ es. 125 252 232 300 357 363 399 402 Figure 1.2: Un arbre sans balises. La diff´ erence de structure entre un arbre binaire de recherche et un arbre binaire balis´ e de recherche, m? eme si elle peut ? etre importante dans certaines applications, est assez faible. Ainsi, pour passer d?un arbre binaire balis´ e ` a un arbre binaire de recherche, on peut proc´ eder en deux ´ etapes comme suit : dans un premier temps, on rebalise l?arbre, en choisissant comme balise d?un n?ud la plus grande cl´ e de son sous-arbre gauche. 232 300 125 252 363 357 399 125 252 232 300 357 363 399 402 Figure 1.3: L?arbre avec balises. Ensuite, on oublie les feuilles, et on ins` ere dans l?arbre obtenu la plus grande cl´ e de l?arbre d?origine. Cet algorithme s?impl´ emente assez facilement en temps lin´ eaire avec une file (voir exercices). Version 6 f´ evrier 2005 6.1. Arbres de recherche 149 232 300 125 252 363 357 399 402 Figure 1.4: L?arbre apr` es insertion de la derni` ere cl´ e. L?op´ eration r´ eciproque, de passage d?un arbre binaire de recherche ` a un arbre balis´ e, peut se faire en ajoutant d?abord des feuilles pour compl´ eter l?arbre (au sens du chapitre 4), puis en munissant ces feuilles des cl´ es appropri´ ees : une feuille re¸ coit la cl´ e du n?ud pour lequel elle est la feuille la plus ` a droite dans le sous-arbre gauche. Il n?est pas difficile de r´ ealiser cette op´ eration avec une pile : proc´ edure Baliser(a); si Est-Feuille(a) alors FixerCl´ e(a, sommet(P)); d´ epiler(P) sinon empiler(cl´ e(a), P); Baliser(G(a)); Baliser(D(a)) finsi. Les op´ erations de dictionnaire se r´ ealisent, sur un arbre binaire balis´ e, de mani` ere tout ` a fait semblable ` a celle expos´ ee pour les arbres binaires de recherche dans le chapitre 3. 9 5 1 3 7 9 5 1 3 7 6 5 Figure 1.5: Insertion de 6 dans l?arbre balis´ e. Ainsi, l?insertion d?une cl´ e se fait comme dans un arbre binaire de recherche, sauf que l?on remplace la feuille d´ ecouverte en descendant dans l?arbre par un n?ud Version 6 f´ evrier 2005 150 Chapitre 6. Arbres et ensembles ordonn´ es qui devient le p` ere de cette feuille et d?une nouvelle feuille contenant la cl´ e (voir figure 1.5). La suppression d?une cl´ e est plus simple que dans un arbre binaire de recherche ordinaire; elle se fait en supprimant la feuille contenant la cl´ e. Le p` ere de cette feuille est remplac´ e par son autre fils (voir figure 1.6). 9 6 1 3 7 9 5 1 3 7 6 5 Figure 1.6: Suppression de 5 dans l?arbre balis´ e. 6.1.2 Rotations Les op´ erations de rotation et de double rotation que nous introduisons main- tenant sont int´ eressantes pour tous les arbres binaires. Elles servent notamment ` a r´ e´ equilibrer les arbres apr` es une insertion ou une suppression. Soit A un arbre binaire non vide. Il est commode d?´ ecrire A = (x, B, C) pour exprimer que x est la racine de A et que B et C sont ses sous-arbres gauche et droit (voir figure 1.7). Nous utilisons cette notation dans la suite de cette section. A : B : x C Figure 1.7: L?arbre A = (x, B, C). Soit donc A = (x, X, B) un arbre non vide, supposons B non vide et posons B = (y, Y, Z). La rotation gauche de A est l?op´ eration : A = (x, X, (y, Y, Z)) ? G(A) = (y, (x, X, Y ), Z) repr´ esent´ ee dans la figure 1.8. La rotation droite est l?op´ eration inverse : A = (y, (x, X, Y ), Z) ? D(A) = (x, X, (y, Y, Z)) Version 6 f´ evrier 2005 6.1. Arbres de recherche 151 x : : y rotation gauche rotation droite Y : y Z X : x Y X Z Figure 1.8: Rotations gauche et droite. Proposition 1.1. Si A est un arbre binaire de recherche, et si la rotation gauche (respectivement droite) est d´ efinie sur A, alors G(A) (respectivement D(A)) est encore un arbre binaire de recherche. X x : : v rotation gauche- droite : u Y Z T X v : : x : u Y Z T Figure 1.9: Rotation gauche-droite. Deux doubles rotations sont utilis´ ees, la rotation gauche-droite et la rotation droite-gauche : elles associent, ` a un arbre A = (x, Ag, Ad) donn´ e, respective- ment l?arbre D(x, G(Ag), Ad) et l?arbre G(x, Ag, D(Ad)) (voir figures 1.9 et 1.10). Ces op´ erations ne sont ´ evidemment d´ efinies que si les sous-arbres requis ne sont pas vides. Ces op´ erations pr´ eservent bien s? ur ´ egalement les arbres binaires de recherche. X x : : y rotation droite- gauche : z Y Z T X y : : z : x Y Z T Figure 1.10: Rotation droite-gauche. Un aspect essentiel de ces op´ erations est qu?elles s?impl´ ementent en temps cons- tant. Lorsque les arbres binaires sont d´ eclar´ es par Version 6 f´ evrier 2005 152 Chapitre 6. Arbres et ensembles ordonn´ es arbre = ^sommet; sommet = RECORD val: element; g, d: arbre END; on obtient la proc´ edure suivante qui r´ ealise la rotation gauche, par un simple ´ echange de pointeurs : PROCEDURE rotationgauche (VAR a: arbre); VAR b: arbre; BEGIN b := a^.d; a^.d := b^.g; b^.g := a; a := b END; Proposition 1.2. Les op´ erations de rotation et de double rotation sur les arbres binaires se r´ ealisent en temps constant. 6.2 Arbres AVL 6.2.1 D´ efinition Les arbres AVL, introduits par Adelson-Velskii et Landis en 1962, constituent une famille d?arbres binaires de recherche ´ equilibr´ es en hauteur. Figure 2.1: Un arbre AVL. Un arbre binaire A est un arbre AVL si, pour tout sommet de l?arbre, les hauteurs des sous-arbres gauche et droit diff` erent d?au plus 1. Plus pr´ ecis´ ement, posons ?(A) = 0 si A est l?arbre vide, et sinon ?(A) = hauteur(Ag) ? hauteur(Ad) o` u Ag et Ad sont les sous-arbres gauche et droit de A. Le nombre ?(A) est appel´ e l?´ equilibre de A (ou de sa racine). Alors A est un arbre AVL si pour tout sommet Version 6 f´ evrier 2005 6.2. Arbres AVL 153 x, on a ?(A(x)) ? {?1, 0, 1}. Par abus, on ´ ecrira aussi ?(x). En particulier, un arbre r´ eduit ` a un seul sommet a un ´ equilibre nul. Les arbres AVL ont une hauteur logarithmique en fonction du nombre de som- mets. Plus pr´ ecis´ ement : Proposition 2.1. Soit A un arbre AVL ayant n sommets et de hauteur h. Alors log2(1 + n) ? 1 + h ? 1, 44 log2(2 + n). Preuve. Pour une hauteur h donn´ ee, l?arbre ayant le plus de sommets est l?arbre complet qui a 2h+1 ?1 sommets. Donc n ? 2h+1 ?1, et par cons´ equent log(1+n) ? 1 + h. Pour l?autre in´ egalit´ e, soit N(h) le minimum des nombres de sommets des arbres AVL de hauteur h. On a N(?1) = 0, N(0) = 1, N(1) = 2, et N(h) = 1 + N(h ? 1) + N(h ? 2), h ? 2 car pour obtenir le minimum, on choisit l?un des sous-arbres minimum de hauteur h ? 1, et l?autre minimum de hauteur h ? 2. Si l?on pose F(h) = N(h) + 1, on a F(0) = 2, F(1) = 3, et F(h) = F(h ? 1) + F(h ? 2), h ? 2 donc N(h) = Fh+3, o` u Fn est le n-i` eme nombre de Fibonacci (voir chapitre 2). Pour tout arbre AVL ` a n sommets et de hauteur h, on a par cons´ equent n + 1 ? F(h) = 1 ? 5 ?h+3 ? ¯ ?h+3 > 1 ? 5 ?h+3 ? 1 d?o` u h + 3 < log2(n + 2) log2 ? + log? ? 5 ? 1, 44 log2(n + 2) + 2 parce que 1/log2 ? ? 1, 44 et log? ? 5 ? 2. Figure 2.2: Arbres de Fibonacci ?k pour k = 2, 3, 4, 5. La borne de la proposition est essentiellement atteinte par les arbres de Fibonacci qui sont d´ efinis comme suit : l?arbre ?0 est l?arbre vide, l?arbre ?1 est r´ eduit ` a un seul sommet; l?arbre ?k+2 a un sous-arbre gauche ´ egal ` a ?k+1, et un sous-arbre droit ´ egal ` a ?k. La hauteur de ?k est k ? 1, et ?k a Fk+2 ? 1 sommets. Version 6 f´ evrier 2005 154 Chapitre 6. Arbres et ensembles ordonn´ es L?impl´ ementation des arbres AVL se fait avantageusement comme celle des ar- bres binaires de recherche (voir chapitre 3). Pour rendre efficaces les op´ erations de r´ e´ equilibrage dont il sera question plus loin, il convient d?ajouter un champ suppl´ ementaire ` a chaque sommet qui contient la hauteur du sous-arbre. Pour un arbre binaire de recherche AVL, les types s?´ ecrivent donc arbre = ^sommet; sommet = RECORD haut: integer; val: element; g, d: arbre END; Certains auteurs recommandent de ne pas conserver la hauteur, mais seulement l?´ equilibre en chaque sommet. Comme l?´ equilibre peut se coder sur deux bits, il en r´ esulte un gain de place. En revanche, les algorithmes sont plus difficiles ` a mettre en ?uvre. Le gain de place est en fait r´ eduit en codant la hauteur sur un octet. On peut alors repr´ esenter des arbres de hauteur 255, donc avec environ 2170 sommets, ce qui suffit en pratique. 6.2.2 Insertion Les arbres AVL sont utilis´ es comme impl´ ementation de dictionnaires. On con- sid` ere donc des arbres binaires de recherche qui sont en plus des arbres AVL. Les op´ erations de recherche, d?insertion et de suppression se font, dans un arbre binaire de recherche, en temps proportionnel ` a la hauteur de l?arbre. Cette hau- teur est logarithmique en fonction du nombre de sommets dans un arbre AVL. Ainsi, la recherche se fait en temps logarithmique. Pour l?insertion et la suppres- sion, il convient de maintenir le caract` ere AVL apr` es l?op´ eration, ce qui se traduit par un r´ e´ equilibrage. Comme on verra, le co? ut du r´ e´ equilibrage est, lui aussi, proportionnel ` a la hauteur, ce qui garantit un co? ut total logarithmique. Soit donc ` a ins´ erer une cl´ e c dans un arbre binaire de recherche AVL A. Si A est vide, le r´ esultat est un arbre A form´ e d?un seul sommet de contenu c, et cet arbre est AVL. Supposons donc A non vide. Dans une premi` ere phase, on utilise l?algorithme d?insertion habituel (voir cha- pitre 3) dans un arbre binaire de recherche : on descend dans A ` a partir de sa racine r, et on cr´ ee une nouvelle feuille s contenant la cl´ e c. Soit A l?arbre ainsi obtenu. Dans une deuxi` eme phase, on remonte le chemin ? entre r et s, en progressant de s vers r, et on teste si l?arbre A est encore AVL. Seuls les sous-arbres dont les racines sont sur le chemin ? peuvent changer de hauteur; cette hauteur ne peut qu?augmenter, et elle ne peut augmenter que de 1. Version 6 f´ evrier 2005 6.2. Arbres AVL 155 r :  ?   ?   ?   ?  Z x : s : u : Figure 2.3: Le chemin ? de r´ e´ equilibrage. Si les racines de ces sous-arbres v´ erifient les conditions d?´ equilibre des arbres AVL, l?arbre A tout entier est AVL. Sinon, il existe un premier sommet x (en partant de s) sur le chemin ? dont l?´ equilibre, dans A vaut 2 ou ?2. Supposons, pour fixer les id´ ees, que le fils gauche u de x est aussi sur ? (voir figure 2.3); alors l?´ equilibre de x est 2. Posons h = hauteur(A(x)). Alors h ? 1 = hauteur(A(u)), h = hauteur(A (u)), h ? 2 = hauteur(Ad(x)). L?arbre Ad(x) peut ? etre vide, voir figure 2.4. x : : u A u ( ) x d A ( ) x: : u x d A ( ) 0 A u ( ) 0 1 2 1 h h h - - Avant insertion Après insertion Figure 2.4: L?arbre de racine x avant et apr` es insertion. Posons A (u) = (u, X, Y ) et Z = Ad(x). Les arbres A (u) et Z sont AVL. Deux cas se pr´ esentent alors : (1) L?insertion s?est faite dans le sous-arbre gauche de u. On a alors hauteur(X) = h ? 1 et hauteur(Y ) = h ? 2 (car A (y) est AVL). Dans ce cas, on effectue une rotation droite de A (x), ce qui donne l?arbre A = (u, X, (x, Y, Z)), voir figure 2.5. L?arbre A est un arbre AVL, et la hauteur de A est ´ egale ` a la hauteur de A(x), c?est-` a-dire de x dans l?arbre avant insertion. Il en r´ esulte qu?apr` es cette rotation, l?arbre tout entier est AVL, et que la phase de r´ e´ equilibrage est termin´ ee. Version 6 f´ evrier 2005 156 Chapitre 6. Arbres et ensembles ordonn´ es x : : u 0 1 2 1 h h h - - X Y Z u : : x X Y Z Figure 2.5: Cas (1) : une rotation simple r´ etablit l?´ equilibre. (2) L?insertion s?est faite dans le sous-arbre droit de u. On a alors hauteur(X) = h?2 et hauteur(Y ) = h?1. Posons Y = (v, V, W). L?un des deux arbres V ou W est de hauteur h?2, et l?autre a pour hauteur h?3. On effectue alors une rotation gauche-droite de A (x), ce qui donne l?arbre A = (v, (u, X, V ), (x, W, Z)), voir figure 2.6. Comme dans le premier cas, l?arbre A est un arbre AVL de m? eme hauteur que A(x). Le r´ e´ equilibrage s?arr? ete donc apr` es cette double rotation. x : : u 0 1 2 1 h h h - - X Z v : : x Z : v V W : u V W X Figure 2.6: Cas (2) : une rotation double r´ etablit l?´ equilibre. Proposition 2.2. L?insertion dans un arbre AVL ` a n sommets se r´ ealise en temps O(log n). Il suffit d?au plus une rotation ou double rotation pour r´ e´ equi- librer l?arbre apr` es insertion. Preuve. Il reste ` a constater que les comparaisons de hauteurs se font, pour chaque sommet du chemin de remont´ ee, en temps constant, ce qui est ´ evident. 6.2.3 Suppression Consid´ erons maintenant la suppression d?une cl´ e c dans un arbre binaire de recherche AVL A. Si A n?a qu?un seul sommet, de contenu c, le r´ esultat est l?arbre vide. On suppose donc que A a au moins deux sommets. Version 6 f´ evrier 2005 6.2. Arbres AVL 157 r :  ?   ?   ?  Z x : s : u : Figure 2.7: Le chemin de r´ e´ equilibrage. Dans une premi` ere phase, on utilise l?algorithme habituel de suppression dans un arbre binaire de recherche (voir chapitre 3) : on descend dans A ` a partir de la racine r ` a la recherche du sommet t contenant la cl´ e c; si t est une feuille, on la supprime, sinon on remplace le contenu de t par le contenu de la feuille la plus ` a droite du sous-arbre gauche de t (respectivement de la feuille la plus ` a gauche du sous-arbre droit de t), et on supprime cette feuille. Dans tous les cas, on supprime donc une feuille dans A. Notons-la s, soit A l?arbre apr` es suppression, et soit ? le chemin de r ` a s. x : : u A u ( ) x d A ( ) x: : u Z A u ( ) 0 1 2 1 h h h - - Avant suppression Après suppression 2 Figure 2.8: L?arbre de racine x avant et apr` es suppression. Dans une deuxi` eme phase, on remonte le chemin ? de s vers r et on teste si l?arbre A est encore AVL. Seuls les sous-arbres dont les racines sont sur le chemin ? peuvent changer de hauteur, et cette hauteur peut diminuer de 1. Si les racines de ces sous-arbres v´ erifient la condition d?´ equilibre, l?arbre A est AVL. Sinon, il existe un premier sommet x (en partant du p` ere de s) dont l?´ equilibre vaut 2 ou ?2. Supposons, pour fixer les id´ ees, que le fils gauche u de x n?est pas sur le chemin ? (voir figure 2.7), donc que la suppression s?est faite dans le sous-arbre droit de x. Apr` es suppression, ce sous-arbre est transform´ e en un arbre AVL ´ eventuellement Version 6 f´ evrier 2005 158 Chapitre 6. Arbres et ensembles ordonn´ es vide que nous notons Z. L?´ equilibre de x est 2. Posons h = hauteur(A(x)). Alors (voir figure 2.8) h ? 1 = hauteur(A(u)), h ? 2 = hauteur(Ad(x)), h ? 3 = hauteur(Z). Posons A(u) = (u, X, Y ). Deux cas se pr´ esentent alors : x : : u 0 1 2 1 h h h - - X Z u : : x X Z 2 Y Y Figure 2.9: Une rotation simple sur le chemin de r´ e´ equilibrage. (1) La hauteur de X est h?2. Dans ce cas, la hauteur de Y est h?2 ou h?3. On effectue une rotation droite de A (x), ce qui donne l?arbre A = (u, X, (x, Y, Z)) qui est AVL, voir figure 2.9. L?arbre A a hauteur h ou h?1, selon que Y a hauteur h ? 2 ou h ? 3. Dans le premier cas, A a donc la m? eme hauteur que A(x), et le processus de r´ e´ equilibrage s?arr? ete; dans le deuxi` eme cas, il faut continuer en remontant vers la racine. x : : u 0 1 2 1 h h h - - X Z v : : x Z : v V W : u V W X 2 Figure 2.10: Une rotation double sur le chemin de r´ e´ equilibrage. (2) La hauteur de X est h ? 3. Alors la hauteur de Y est h ? 2, parce que A(u) est un arbre AVL. Posons Y = (v, V, W). On effectue une rotation gauche-droite donnant l?arbre A = (v, (u, X, V ), (X, W, Z)), voir figure 2.10. Cet arbre est AVL, mais sa hauteur est h ? 1. En d?autres termes, le processus de r´ e´ equilibrage doit continuer, en remontant vers la racine. Proposition 2.3. La suppression dans un arbre AVL ` a n sommets se r´ ealise en temps O(log n). Version 6 f´ evrier 2005 6.2. Arbres AVL 159 1 2 3 4 5 6 7 8 9 10 11 12 Figure 2.11: Arbre de Fibonacci avant la suppression de la cl´ e 12. Exemple. Consid´ erons l?arbre (de Fibonacci) de la figure 2.11. La suppression de la cl´ e 12 am` ene une premi` ere rotation autour du sommet de cl´ e 11, puis une deuxi` eme autour de la racine (figure 2.12). 1 2 3 4 5 6 7 8 9 10 11 Figure 2.12: Apr` es suppression et r´ e´ equilibrage. 6.2.4 Arbres balis´ es Comme nous l?avons d´ ej` a dit dans l?introduction, il existe deux variantes des arbres binaires de recherche : ceux o` u tous les sommets contiennent des cl´ es (et les informations associ´ ees), et ceux o` u seules les feuilles contiennent des cl´ es. Les n?uds de ces arbres contiennent alors des balises (qui sont en g´ en´ eral aussi des ´ el´ ements de l?ensemble des cl´ es) permettant de naviguer dans l?arbre. Les arbres AVL balis´ es nous seront utiles plus loin. Chaque feuille d?un tel arbre contient donc une cl´ e, et les cl´ es sont croissantes de la gauche vers la droite. Nous avons d´ ej` a d´ ecrit comment on r´ ealise l?insertion et la suppression dans un arbre balis´ e. Il n?est pas difficile de se convaincre que le r´ e´ equilibrage par rotations se transpose sans grand changement aux arbres balis´ es, puisque seuls les n?uds changent de fils. L?analyse du r´ e´ equilibrage dans les arbres AVL se transpose ´ egalement dans les arbres balis´ es. On peut donc, au choix, utiliser des arbres AVL ou des arbres AVL balis´ es. Version 6 f´ evrier 2005 160 Chapitre 6. Arbres et ensembles ordonn´ es 6.3 Arbres a?b Les arbres a?b sont des arbres dont toutes les feuilles ont m? eme profondeur, et le nombre de fils d?un n?ud varie entre a et b. Nous montrons ici comment r´ ealiser les op´ erations de recherche, d?insertion, de suppression, de scission et de con- cat´ enation en temps logarithmique en fonction du nombre de sommets de l?arbre. Les r´ e´ equilibrages sont en fait assez rares, puisqu?en moyenne deux op´ erations de r´ e´ equibrage insertion et suppression suffisent dans le cas des arbres 2?4. Les arbres a?b constituent ainsi une impl´ ementation efficace des listes concat´ enables. 6.3.1 D´ efinition Soient a et b deux entiers, avec a ? 2, et b ? 2a ? 1. Un arbre a?b est un arbre A v´ erifiant les conditions suivantes : (i) les feuilles ont toutes la m? eme profondeur; (ii) la racine a au moins 2 et au plus b fils; (iii) les autres n?uds ont au moins a et au plus b fils. On note d(x) le nombre de fils d?un n?ud x, et Ai(x) le i-i` eme sous-arbre de x, pour i = 1, . . . , d(x). Soit S un ensemble de cl´ es. Un arbre A est un arbre a?b pour S si les ´ el´ ements de S sont rang´ es aux feuilles de A en ordre croissant de la gauche vers la droite, et si de plus, chaque n?ud x de A contient une suite de d(x)?1 cl´ es k1 < · · · < kd(x)?1, appel´ ees les balises de x et v´ erifiant les conditions : ? les cl´ es des feuilles de Ai(x) sont inf´ erieures ou ´ egales ` a ki, pour i = 1, . . . , d(x) ? 1; ? les cl´ es des feuilles de Ai(x) sont strictement sup´ erieures ` a ki?1, pour i = 2, . . . , d(x). En d?autres termes, si ci est une cl´ e d?une feuille de Ai(x), on a c1 ? k1 < c2 ? k2 < · · · ? kd(x)?1 < cd(x). Il est commode de noter ki(x) la i-i` eme balise du n?ud x. Lorsque b = 2a ? 1, un arbre a?b est appel´ e un B-arbre d?ordre a ? 1. L?arbre vide est un arbre a?b, de m? eme que l?arbre form´ e d?un seul sommet qui est une feuille. 8 20 40 4 7 6 42 41 50 11 14 12 10 14 18 12 21 26 30 21 25 36 30 Figure 3.1: Un arbre 2?4. Version 6 f´ evrier 2005 6.3. Arbres a?b 161 Proposition 3.1. Soit A un arbre a?b avec n feuilles (n > 0) de hauteur h. Alors 2ah?1 ? n ? bh ou encore log n/ log b ? h ? 1 + log(n/2)/ log a. Preuve. Tout n?ud a au plus b fils, donc A a au plus bh feuilles. Tout n?ud autre que la racine a au moins a fils, et la racine au moins 2; au total, il y a au moins 2ah?1 feuilles. Le deuxi` eme encadrement en d´ ecoule. 6.3.2 Recherche d?un ´ el´ ement Soit A un arbre a?b pour un ensemble S. La recherche d?une cl´ e c dans A est dite positive si c ? S, elle est n´ egative sinon. Si A est vide, la recherche est n´ egative; dans les autres cas, elle se fait comme suit : Rechercher (c, A); x =racine(A); tantque x est un n?ud faire i := 1; tantque c > ki(x) etalors i < d(x) faire i := i + 1; poser x := le i-i` eme fils de x fintantque; si c = cle(x) alors retourner(recherche positive) sinon retourner(recherche negative). La recherche du sous-arbre Ai(x) susceptible de contenir la cl´ e c se fait en comparant c aux balises ki(x). Ceci se r´ ealise en temps constant, c?est-` a-dire ind´ ependant de la taille de A. On a donc Proposition 3.2. Soit A un arbre a?b pour un ensemble S ` a n ´ el´ ements (n > 0). La recherche d?une cl´ e dans A se fait en temps O(log n). 6.3.3 Insertion d?un ´ el´ ement L?insertion d?une cl´ e c dans un arbre a?b pose, comme nous allons le voir, le probl` eme du r´ e´ equilibrage. Il se peut en effet qu?apr` es insertion, un n?ud de l?arbre ait b + 1 fils. Dans ce cas, on ´ eclate ce n?ud en deux n?uds fr` eres qui se partagent ces b + 1 fils. Il se peut que leur p` ere, ` a son tour, ait trop de fils; on Version 6 f´ evrier 2005 162 Chapitre 6. Arbres et ensembles ordonn´ es r´ ep` ete alors cette proc´ edure. Plus pr´ ecis´ ement, l?insertion se fait en deux phases. On suppose que A a au moins 2 sommets, les autres cas ´ etant faciles. Dans la premi` ere phase, on descend dans l?arbre ` a partir de la racine ` a la recherche d?une feuille y susceptible de contenir la cl´ e c. Si la recherche est positive, la cl´ e c figure d´ ej` a dans A et il n?y a pas lieu de l?ajouter; sinon, soit x le p` ere de y. Soient c1, . . . , cd les cl´ es des fils de x, avec d = d(x), et soient k1, . . . , kd?1 les balises du n?ud x. On a donc c1 ? k1 < c2 ? · · · ? kd?1 < cd. La recherche de c parmi les fils de x d´ etermine un indice i tel que ki?1 < c ? ki (si i = 1, on a seulement c ? k1, et si i = d, seulement kd?1 < c). c k i k - i 1 c i c - i 1 c k i k - i 1 i c - i 1 c Figure 3.2: Insertion d?une feuille, cas c < ci. On cr´ ee alors une feuille de cl´ e c, et on l?ins` ere comme i-i` eme fils de x si c < ci, et comme i + 1-i` eme fils de x si ci < c. On ins` ere ´ egalement la cl´ e min(c, ci) comme i-i` eme balise au n?ud x. Les figures 3.2 et 3.3 d´ ecrivent les deux transformations. k i k - i 1 c i c - i 1 c k i k - i 1 i c - i 1 c i c Figure 3.3: Insertion d?une feuille, cas c > ci. Dans la deuxi` eme phase, on r´ e´ equilibre l?arbre si c?est n´ ecessaire. Si le n?ud x a au plus b fils apr` es insertion, aucun r´ e´ equilibrage n?est n´ ecessaire, et l?algorithme est termin´ e. Sinon, d(x) = b + 1, et on ´ eclate le n?ud x. L?´ eclatement de x est l?op´ eration suivante : on cr´ ee deux n?uds fr` eres x et x , et on partage les b + 1 fils de x en deux groupes, respectivement de (b + 1)/2 et (b + 1)/2 ´ el´ ements, le premier fournissant les fils de x , le second les fils de x . Comme b ? 2a ? 1, on a (b + 1)/2 ? a, donc x et x v´ erifient les contraintes d?un arbre a?b. Si x a un p` ere, soit z, les fr` eres x et x sont d´ eclar´ es fils de z ` a la place de x. Sinon, on cr´ ee un nouveau n?ud z (qui devient la nouvelle racine de l?arbre) dont x et x sont les seuls fils. C?est de cette mani` ere que l?arbre prend de la hauteur. Les b balises k1(x), . . . , kb(x) du n?ud x sont r´ eparties comme suit : les balises d?indice 1 ` a (b + 1)/2 ? 1 deviennent les balises de x , les balises d?indice (b + 1)/2 + 1 ` a b deviennent les balises de x ; quant ` a la balise dont l?indice est Version 6 f´ evrier 2005 6.3. Arbres a?b 163 (1 + b)/2 , elle devient la balise qui, dans le p` ere commun z de x et x , s´ epare x de x . L?´ eclatement peut se repr´ esenter de mani` ere sch´ ematique par la r` egle suivante : Figure 3.4: R` egle d?´ eclatement. Revenons ` a l?insertion. L?´ eclatement d?un n?ud x augmente le nombre de fils de son p` ere. Si n´ ecessaire, on r´ ep` ete l?´ eclatement sur le p` ere, puis sur le p` ere de celui-ci, etc. A la fin, l?arbre est ` a nouveau a?b. Proposition 3.3. Soit A un arbre a?b pour un ensemble S ` a n ´ el´ ements (n > 0). L?insertion d?une cl´ e dans A se fait en temps O(log n). Preuve. La localisation de l?endroit o` u ins´ erer la cl´ e prend un temps proportionnel ` a la hauteur h de A. L?insertion de la feuille est suivie d?au plus h ´ eclatements de n?uds. Chaque ´ eclatement prend un temps constant. 4 7 6 42 41 50 11 8 12 10 12 21 26 30 21 25 36 30 14 18 15 14 15 20 40 Figure 3.5: L?arbre apr` es insertion de 15. Exemple. L?insertion de la cl´ e 15 dans l?arbre de la figure 3.1 provoque d?abord l?´ eclatement du deuxi` eme fils de la racine, puis de la racine elle-m? eme. L?arbre entier prend donc la forme donn´ ee dans la figure 3.5. 6.3.4 Suppression d?un ´ el´ ement La suppression d?une cl´ e dans un arbre a?b est plus compliqu´ ee. Le r´ e´ equilibrage fait appel ` a l?op´ eration inverse de l?´ eclatement, la fusion. Il est utile d?introduire Version 6 f´ evrier 2005 164 Chapitre 6. Arbres et ensembles ordonn´ es une op´ eration suppl´ ementaire, appel´ ee partage qui, m? eme si elle n?est pas indis- pensable, facilite la suppression. Soient x et x deux n?uds fr` eres d?un arbre a?b, et soit z leur p` ere. On suppose de plus que x et x sont des fils cons´ ecutifs de z, disons x ` a gauche de x . Si le nombre total de fils de x et x est au plus b, on peut fusionner x et x en un seul n?ud x, fils de z, qui prend comme fils l?ensemble des fils de x et x . Sch´ ematiquement, la fusion, op´ eration inverse de l?´ eclatement, peut se repr´ esenter par la r` egle suivante : Figure 3.6: R` egle de fusion. Pour la deuxi` eme op´ eration, le partage, consid´ erons ` a nouveau deux fr` eres adja- cents x et x , fils d?un n?ud z, avec disons x ` a gauche de x . Si x a moins de b fils, et x a plus de a fils, le partage consiste ` a transf´ erer le sous-arbre le plus ` a gauche de x , soir A1(x ), vers le n?ud x , qui le re¸ coit donc comme sous-arbre le plus ` a droite : A1+d(x )(x ) := A1(x ). Ce transfert se sch´ ematise comme suit : B B Figure 3.7: R` egle du partage. L?algorithme de suppression d?une cl´ e c dans un arbre a?b A est le suivant : on cherche la feuille contenant la cl´ e c. Soit x le p` ere de cette feuille; on supprime la feuille et la cl´ e, dans x, de m? eme indice (ou d?indice d(x) ? 1 si la feuille est le fils le plus ` a droite de x). Consid´ erons d?abord le cas o` u x est la racine de l?arbre. Si x a plus de deux fils, l?arbre est un arbre a?b, sinon x a un fils unique; on supprime alors x et son fils unique devient la racine de l?arbre (sa hauteur diminue donc de 1). Si x n?est pas la racine, et si x a au moins a fils apr` es cette suppression, l?arbre r´ esultant est encore un arbre a?b et l?op´ eration est termin´ ee. Sinon, x a a ? 1 fils, et il faut r´ e´ equilibrer l?arbre. Soit z le p` ere de x. Version 6 f´ evrier 2005 6.3. Arbres a?b 165 Si x a un fr` ere gauche ou un fr` ere droit y qui a exactement a fils, on fusionne x et y en un fils de z qui a 2a ? 1 ? b fils. Si x a un fr` ere gauche ou droit y qui a plus de a fils, on fait un partage entre x et y : le n?ud x re¸ coit un fils suppl´ ementaire, donc en a maintenant a, et y en perd un, mais en a encore au moins a, et z garde les m? emes fils : l?arbre est a?b. Dans le cas d?une fusion, le n?ud z perd un fils; il se peut qu?il n?ait plus que a?1 fils. Il convient alors de continuer le r´ e´ equilibrage. En revanche, une op´ eration de partage met fin au r´ e´ equilibrage. En r´ esum´ e, les cas suivants se pr´ esentent, en fonction du nombre de fils des fr` eres gauche et droit du n?ud x (en supposant bien s? ur que x ait deux fr` eres adjacents) : (i) les deux fr` eres ont a fils : seule une fusion est possible; (ii) l?un des deux fr` eres a a fils, l?autre en a plus de a : un partage et une fusion sont possibles; (iii) les deux fr` eres ont plus de a fils : un partage est possible, et une fusion aussi, si le nombre total de fils ne d´ epasse pas b. Dans certaines situations, on peut donc choisir entre une fusion ou un partage. Comme un partage arr? ete le r´ e´ equilibrage, on a int´ er? et ` a privil´ egier les partages. Un partage s?apparente ` a une fusion suivie d?un ´ eclatement (modifi´ e). En effet, si un partage est possible, une fusion donne un n?ud qui a assez de fils pour ? etre ´ eclat´ e, et on obtient le r´ esultat du partage en ´ eclatant le sommet, mais avec une r´ epartition des fils qui n?est pas aussi ´ equilibr´ ee que celle d´ ecrite plus haut. On peut donc remplacer un partage par une fusion suivie d?un ´ eclatement, et c?est en ce sens que le partage n?est pas indispensable au r´ e´ equilibrage. 8 20 4 7 6 11 10 12 21 26 30 21 25 36 30 Figure 3.8: Un arbre 2?4. Exemple. Consid´ erons l?arbre de la figure 3.8. Apr` es suppression de 12, l?arbre n?est plus ´ equilibr´ e (figure 3.9). Le n?ud sans balise peut ? etre r´ e´ equilibr´ e par un partage avec son fr` ere droit. On obtient l?arbre de la figure 3.10. Il peut aussi ? etre r´ e´ equilibr´ e par fusion avec son fr` ere gauche. On obtient alors l?arbre de la figure 3.11. Proposition 3.4. Soit A un arbre a?b pour un ensemble S ` a n ´ el´ ements (n > 0). La suppression d?une cl´ e dans A se fait en temps O(log n). Version 6 f´ evrier 2005 166 Chapitre 6. Arbres et ensembles ordonn´ es 8 20 4 7 6 10 21 26 30 21 25 36 30 Figure 3.9: Apr` es suppression de 12 et avant r´ e´ equilibrage. 8 4 7 6 21 20 10 21 26 30 25 36 30 Figure 3.10: Apr` es partage avec le fr` ere droit. 20 8 4 7 6 10 21 26 30 21 25 36 30 Figure 3.11: Apr` es fusion avec le fr` ere gauche. D?autres op´ erations simples sur les ensembles de cl´ es peuvent ? etre consid´ er´ ees, comme par exemple : Min(S); d´ etermine le plus petit ´ el´ ement de S ; Supprimer-Min(S); supprime le plus petit ´ el´ ement de S. La premi` ere op´ eration se r´ ealise en descendant dans la branche gauche de l?arbre, et pour la deuxi` eme, il suffit d?appliquer ensuite l?op´ eration de suppression. On traite de mani` ere analogue Max(S) et Supprimer-Max(S). Th´ eor` eme 3.5. Si un ensemble S est repr´ esent´ e par un arbre a?b, les op´ erations Rechercher(c, S), Ins´ erer(c, S), Supprimer(c, S), Min(S), Max(S), Sup- primer-Min(S) et Supprimer-Max(S) se r´ ealisent toutes en temps O(log(1 + |S|)). Version 6 f´ evrier 2005 6.3. Arbres a?b 167 6.3.5 Concat´ enation et scission On consid` ere maintenant deux op´ erations suppl´ ementaires tr` es utiles sur les en- sembles ordonn´ es qui se r´ ealisent de fa¸ con efficace ` a l?aide d?arbres a?b. Ce sont : Concat´ ener(S1, S2, S); est d´ efini lorsque max(S1) < min(S2), le r´ esultat est S = S1 ? S2. Scinder(S, c, S1, S2); d´ efinit une d´ ecomposition S = S1 ? S2, avec S1 = {u ? S | u ? c} et S2 = {u ? S | u > c} = S ? S1. Proposition 3.6. Soient S1 et S2 deux ensembles repr´ esent´ es par des arbres a?b. L?op´ eration Concat´ ener(S1, S2, S) peut se r´ ealiser en temps O(log(1 + max(|S1|, |S2|))). Pour un ensemble S repr´ esent´ e par un arbre a?b, l?op´ eration Scinder(S, c, S1, S2) peut se r´ ealiser en temps O(log(1 + |S|)). Preuve. Soit Ai un arbre a?b pour Si, et soit hi la hauteur de Ai, pour i = 1, 2. On suppose h1 ? h2, l?autre cas se traite de la m? eme mani` ere. Soit c une cl´ e telle que max(S1) ? c < min(S2). On peut calculer une telle cl´ e en temps O(h1), en calculant Max(S1) sur A1. La concat´ enation se r´ ealise comme suit. Partant de la racine de A1, on descend sa branche la plus ` a droite jusqu?au n?ud x de profondeur h1 ?h2. Ainsi, le sous-arbre A1(x) de racine x a la m? eme hauteur que A2. On fusionne alors ce sommet x et la racine r2 de A2 en un n?ud unique disons z, en ajoutant la cl´ e c=Max(S1) comme cl´ e centrale dans la liste des balises du n?ud z. Si z a moins de b fils, c?est termin´ e; sinon, z a au plus 2b fils et un ´ eclatement donne deux n?uds ayant chacun au plus b fils. Une remont´ ee vers la racine permet de r´ e´ equilibrer l?arbre par des ´ eclatements successifs. Moyennant la connaissance de c, l?op´ eration de concat´ enation se fait donc en temps O(1+|h1 ?h2|). Pour d´ eterminer c, un temps O(log(1+|S1|)) est suffisant. Dans la suite, la cl´ e c sera disponible au moment de la concat´ enation. Venons-en ` a la scission. Soit A un arbre a?b pour l?ensemble S, et soit c une cl´ e; on descend dans l?arbre ` a la recherche de la cl´ e c; soit y la feuille d´ etect´ ee. En cas de recherche positive, la cl´ e de y est c; en cas de recherche n´ egative, la cl´ e de y est la plus grande cl´ e dans S qui est inf´ erieure ` a c (ou la plus petite cl´ e de S sup´ erieure ` a c). En d?autres termes, l?ensemble S1 est form´ e des cl´ es de toutes les feuilles ` a gauche de y, et S2 est form´ e des cl´ es des feuilles ` a droite de y. La cl´ e de y appartient ` a S1 ou S2, selon les cas. On consid` ere maintenant le chemin menant de la racine ` a la feuille y. On sup- prime les ar? etes de ce chemin et on ´ eclate les sommets sur le chemin. Toutefois, l?´ eclatement est modifi´ e comme suit : si l?ar? ete supprim´ ee dans un n?ud x est la k-i` eme, le n?ud x est ´ eclat´ e en deux n?uds x qui re¸ coit les k ? 1 premiers fils et Version 6 f´ evrier 2005 168 Chapitre 6. Arbres et ensembles ordonn´ es les k ? 1 premi` eres balises, et x qui re¸ coit les autres fils et les balises de droite, y compris la k-i` eme. Chacun de ces n?uds a donc une balise suppl´ ementaire qui servira ensuite, et chacun des arbres est a?b, sauf peut-? etre en sa racine. Enfin, si k = 1, seul le n?ud x est cr´ e´ e, et de m? eme si k = d(x), seul x est cr´ e´ e.     ??? ??? ????????????? ????????????? ????????????? ????????????????? ????????????????? ????????????????? ????????????????? ??????????????????????? ??????????????????????? ??????????????????????? ??????????????????????? 26 28 30 32 34 36 38 40 42 44 26 30 34 38 42 28 33 40 44 52 46 48 50 52 54 56 58 60 47 50 55 58 56 48 24 10 12 14 16 18 20 22 24 12 15 20 23 12 20 16 60 Figure 3.12: Un arbre 2?4 avant la scission par la cl´ e 36. On obtient alors deux for? ets F1 et F2, o` u F1 est la suite d?arbres ` a gauche du chemin, et F2 la suite d?arbres ` a droite du chemin. 36 34 34 26 28 30 32 26 30 28 33 44 52 46 48 50 52 54 56 58 60 47 50 55 58 56 48 24 10 12 14 16 18 20 22 24 12 15 20 23 12 20 16 60 42 44 42 40 38 40 36 38 Figure 3.13: Les deux for? ets F1 et F2 apr` es la s´ eparation. Soient D1, . . . , Dm les arbres constituant F1, num´ erot´ es de la gauche vers la droite. Notons que m ? h, o` u h est la hauteur de A. Chaque arbre Di est un arbre a?b sauf peut-? etre pour la racine qui peut n?avoir qu?un fils. Par ailleurs, max(Di) < min(Di+1), et l?on conna? ?t une cl´ e ci telle que max(Di) ? ci < min(Di). C?est la balise qui se trouve dans le champ le plus ` a droite de la racine de Di. Enfin, on a hi > hi+1, o` u hi est la hauteur de Di. On effectue alors la s´ equence Concat´ ener(Dm?1, Dm, Dm?1); Concat´ ener(Dm?2, Dm?1, Dm?2); . . . Concat´ ener(D1, D2, D1). Concat´ ener des arbres qui sont des arbres a?b sauf ´ eventuellement pour la racine qui n?a qu?un seul fils donne un arbre de m? eme nature. Si D1 a une racine n?ayant qu?un fils, on supprime la racine, et on obtient un arbre a?b. Version 6 f´ evrier 2005 6.3. Arbres a?b 169 24 10 12 14 16 18 20 22 24 12 15 20 23 12 20 16 36 34 34 26 28 30 32 26 30 28 33 36 34 34 26 28 30 32 26 30 28 33 36 34 34 Figure 3.14: Reconstitution de l?arbre ` a partir de la for? et F1. Analysons le co? ut de la reconstruction. Soit hi la hauteur de Di. Le co? ut est O(|hm?1 ? hm| + m?2 i=1 |hi ? hi+1| + m). Or, on a hi+1 ? hi+1 ? 1 + hi+1 ? hi . En effet, seule l?in´ egalit´ e centrale doit ? etre prouv´ ee. Pour cela, observons que hm?1 ? 1 + max(hm?1, hm) = 1 + hm?1, et, en raisonnant par r´ ecurrence descen- dante, hi+1 ? 1 + max(hi+1, hi+2) = 1 + hi+1. Il en r´ esulte que |hm?1 ? hm| + m?2 i=1 |hi ? hi+1| + m ? hm?1 ? hm + m?2 i=1 (hi ? hi+1) + m ? hm?1 ? hm + m?2 i=1 (hi ? hi+1) + m ? h1 ? hm?1 + hm?1 ? hm + m ? 2h = O(log |S|). Ceci ach` eve la preuve. 6.3.6 Co? ut amorti des arbres 2?4 Nous analysons maintenant le co? ut du r´ e´ equilibrage non pas sur une seule modifi- cation d?un arbre a?b, mais sur une s´ equence d?insertions et de suppressions. Dans ce cas, une analyse fine du co? ut est possible, car les op´ erations de r´ e´ equilibrage se r´ epercutent sur plusieurs insertions ou suppressions cons´ ecutives. Le r´ esultat que nous ´ etablissons montre que le co? ut total des r´ e´ equilibrages est lin´ eaire en fonction du nombre d?insertions et de suppressions, si l?on commence avec un arbre vide. Un corollaire de ce r´ esultat remarquable est qu?en moyenne, le co? ut du r´ e´ equilibrage est constant dans un arbre 2?4. Proposition 3.7. On consid` ere une suite quelconque de i insertions et de d suppressions dans un arbre 2?4 initialement vide, et on pose n = i + d; alors P ? d ? n et E + F ? n + (i ? d ? 1)/2, o` u P est le nombre de partages, E le nombre d?´ eclatements, et F le nombre de fusions de sommets. Version 6 f´ evrier 2005 170 Chapitre 6. Arbres et ensembles ordonn´ es En particulier, la proposition pr´ ec´ edente admet le corollaire suivant : Th´ eor` eme 3.8. On consid` ere une suite quelconque de n insertions ou suppres- sions dans un arbre 2?4 initialement vide. Alors le nombre total d?op´ erations de r´ e´ equilibrage est au plus 3n/2. Ce r´ esultat montre en particulier qu?il y a en moyenne 3/2 op´ erations de r´ e´ equili- brage par insertion ou suppression. Ce nombre est ind´ ependant de la taille de la structure, et est remarquablement faible. Preuve du th´ eor` eme. En vertu de la proposition, on a E + F + P ? n + (i ? d ? 1)/2 + d = n + (i + d ? 1)/2 ? 3n/2 parce que i + d = n. La preuve de la proposition repose sur une mesure d?´ equilibre d?un arbre 2?4 que nous allons introduire maintenant. Cette mesure indique, pour tout n?ud de l?arbre, s?il est bien ´ equilibr´ e, c?est-` a-dire en fait s?il a 3 fils. Cette mesure sera d´ efinie et ´ etudi´ ee pour des arbres qui ne sont pas des arbres 2?4, mais des arbres en cours de r´ e´ equilibrage. Un couple (A, s), o` u s est un sommet de l?arbre A, est un arbre 2?4 partiellement ´ equilibr´ e si 1 ? d(s) ? 5, 2 ? d(x) ? 4 pour x = s. L?´ equilibre d?un sommet x d?un arbre partiellement ´ equilibr´ e est le nombre e(x) d´ efini par e(x) = min (d(x) ? 2, 4 ? d(x)). Il est imm´ ediat que e(x) = ? ? ? ?1 si d(x) = 1 ou d(x) = 5, 0 si d(x) = 2 ou d(x) = 4, 1 si d(x) = 3. L?´ equilibre de l?arbre A est la somme des ´ equilibres de ses n?uds : e(A) = x?noeuds(A) e(x). L?id´ ee de la construction, et de la preuve de l?estimation, est que toute op´ eration d?insertion ou de suppression de feuille dans l?arbre le d´ es´ equilibre, au sens de la mesure introduite, alors qu?une op´ eration de fusion, d?´ eclatement ou de partage le r´ e´ equilibre. Proposition 3.9. Soit A un arbre 2?4 et soit A obtenu par l?insertion ou la suppression d?une feuille sans r´ e´ equilibrage; alors e(A ) ? e(A) ? 1. Proposition 3.10. Soit A un arbre 2?4 ` a m feuilles; alors 0 ? e(A) ? (m?1)/2. Version 6 f´ evrier 2005 6.3. Arbres a?b 171 Preuve. On note mi le nombre de n?uds ayant i fils. Alors e(A) = m3. Par ailleurs, le nombre d?ar? etes de l?arbre A est 2m2 + 3m3 + 4m4, et il est aussi ´ egal ` a m + m2 + m3 + m4 ? 1, puisque chaque sommet, ` a l?exception de la racine, a un p` ere. Il r´ esulte de l?´ egalit´ e de ces expressions que m2 + 2m3 + 3m4 = m ? 1 d?o` u le r´ esultat. Lemme 3.11 (´ eclatement). Soit (A, s) un arbre 2?4 partiellement ´ equilibr´ e, et supposons que le sommet s a 5 fils; soit A l?arbre obtenu par ´ eclatement du sommet s. Alors e(A ) ? 1 + e(A). Preuve. Notons d?abord que A est partiellement ´ equilibr´ e. Si s n?est pas la racine de A, soit x le p` ere de s dans A. Dans l?arbre A , le sommet x a deux fils s et s ` a la place de s; ces deux sommets se partagent les 5 fils de s (voir figure 3.15). x s0 s0 0 x s Figure 3.15: Eclatement de x. Notons e l?´ equilibre de sommets dans l?arbre A . Alors e (x) ? e(x) ? 1, et e (s ) = 0, e (s ) = 1 ou vice-versa, d?o` u e (x) + e (s ) + e (s ) = e (x) + 1 ? e(x) = 1 + e(x) + e(s) et comme l?´ equilibre des autres sommets n?est pas modifi´ e, ceci montre que e(A ) ? 1 + e(A). Si s est la racine de A, alors A a une nouvelle racine, soit r, ayant deux fils s et s qui se partagent les 5 fils de s. On obtient e (r) + e (s ) + e (s ) = 1 > 1 + e(s) donc ici encore e(A ) ? 1 + e(A). Lemme 3.12 (partage). Soit (A, s) un arbre 2?4 partiellement ´ equilibr´ e dont le sommet s a un seul fils, et supposons que s poss` ede un fr` ere voisin t ayant au moins 3 fils. Soit A l?arbre obtenu par partage entre s et t. Alors e(A ) ? e(A). Preuve. Notons e l?´ equilibre de sommets dans l?arbre A . Comme e (t) ? e(t)?1, e (s) = 0, e(s) = ?1, on obtient e (t) + e (s) ? e(t) ? 1 = e(t) + e(s). Les autres sommets ne sont pas modifi´ es; il en r´ esulte que e(A ) ? 1 + e(A). Version 6 f´ evrier 2005 172 Chapitre 6. Arbres et ensembles ordonn´ es x s t x s t Figure 3.16: Partage entre les fr` eres s et t. Lemme 3.13 (fusion). Soit (A, s) un arbre 2?4 partiellement ´ equilibr´ e dont le sommet s a un seul fils. Soit A l?arbre obtenu en supprimant s, si s est la racine, et l?arbre obtenu par fusion de s et t, si s n?est pas la racine, et si s poss` ede un fr` ere voisin t ayant 2 fils. Alors e(A ) ? 1 + e(A). Preuve. Consid´ erons d?abord le cas o` u s est la racine. Si s est le sommet unique de A, alors l?arbre A est vide, et on a e(A ) = 0 = 1 + e(A). Sinon, soit t le fils de s; alors A est l?arbre de racine t, et on a encore e(A ) = 1 + e(A). Si s n?est pas la racine de A, soit x le p` ere de s et t; dans A , les deux fils s et t de x sont remplac´ es par un unique fils s r´ eunissant les fils de s et t (figure 3.17). x s t s0 x Figure 3.17: Fusion des fr` eres s et t. Notons e l?´ equilibre de sommets dans A . Comme e (x) ? e(x) ? 1 et e (s ) = 1, on obtient e (x) + e (s ) ? e(x) ? 1 + e(x) + e(s) + e(t). Les autres sommets n?´ etant pas modifi´ es, on a e(A ) ? 1 + e(A). Preuve de la proposition 3.7. Il y a au plus un partage par suppression et aucun par insertion; les in´ egalit´ es sur P sont donc ´ evidentes. Pour prouver l?autre in´ egalit´ e, soit A l?arbre obtenu, ` a partir de l?arbre vide apr` es les n op´ erations d?insertion ou suppression. L?arbre vide a pour ´ equilibre 0. Par ailleurs, chacune des n insertions ou suppressions diminue l?´ equilibre d?au plus 1 (Prop 3.9), chaque ´ eclatement ou fusion l?augmente d?au moins 1, et chaque partage l?augmente ou le laisse invariant. Il en r´ esulte que e(A) ? F + E ? n. Or, d?apr` es la proposition 3.10, on a e(A) ? (i?d?1)/2, parce que A a i?d feuilles. La proposition 3.7 r´ esulte de ces deux in´ egalit´ es. Version 6 f´ evrier 2005 6.4. Arbres bicolores 173 6.4 Arbres bicolores 6.4.1 Pr´ esentation Les arbres bicolores, dus ` a Guibas et Sedgewick, constituent une structure d?ar- bres binaires de recherche particuli` erememt efficace. Traditionnellement appel´ es arbres rouge-noir, nous les colorons en blanc et noir pour des raisons ´ evidentes. Ces arbres sont efficaces pour plusieurs raisons. C?est une structure souple car elle permet de r´ ealiser ais´ ement de nombreuses op´ erations telles que recherche, insertion, suppression, mais aussi des op´ erations plus sophistiqu´ ees comme la scission ou la concat´ enation. G L P S (a) (b) N B G L P S V N B V Figure 4.1: Un arbre bicolore : (a) avec ses feuilles, (b) sans feuilles. Un arbre bicolore est un couple (A, c) o` u A est un arbre binaire complet et c est une application qui associe ` a chaque sommet une couleur (blanc ou noir) de fa¸ con que : (a) toutes les feuilles sont noires; (b) la racine est noire; (c) le p` ere d?un sommet blanc est noir; (d) les chemins issus d?un m? eme sommet et se terminant en une feuille ont le m? eme nombre de sommets noirs. Un arbre bicolore pour un ensemble ordonn´ e E est un arbre bicolore qui est un arbre de recherche pour E, avec la restriction que seuls les n?uds contiennent des ´ el´ ements de E. Notons que la condition (b) n?est pas toujours exig´ ee, mais il est plus pratique pour la suite de ne consid´ erer que des arbres bicolores ayant des racines noires. Exemple. Dans la figure 4.1, les feuilles sont repr´ esent´ ees par des carr´ es. On conviendra en g´ en´ eral de ne pas les repr´ esenter. Ainsi l?arbre de la figure 4.1(a) devient celui de la figure 4.1(b). Remarque. Notons que dans un arbre bicolore effeuill´ e , le grand-p` ere d?un sommet est n´ ecessairement un sommet complet, ainsi l?arbre, d?une certaine fa¸ con, est presque complet. Version 6 f´ evrier 2005 174 Chapitre 6. Arbres et ensembles ordonn´ es Nous allons donner imm´ ediatement une propri´ et´ e caract´ eristique des arbres bico- lores, car selon les circonstances, la d´ efinition donn´ ee ci-dessus ou la propri´ et´ e ci-dessous sera plus adapt´ ee. Une fonction rang sur un arbre binaire complet A est une application rg de l?ensemble S des sommets de A dans l?ensemble N des entiers naturels v´ erifiant les conditions suivantes (p d´ esignant la fonction p` ere sur S) : (i) pour toute feuille x, rg(x) = 0 et si x a un p` ere rg(p(x)) = 1; (ii) pour tout sommet x, rg(x) ? rg(p(x)) ? rg(x) + 1; (iii) pour tout sommet x, rg(x) < rg(p2 (x)). Proposition 4.1. Tout arbre bicolore poss` ede une fonction rang. Preuve. Soit (A, c) un arbre bicolore, et d´ efinissons le rang d?un sommet comme le nombre de sommets noirs situ´ es sur un chemin quelconque allant de ce sommet (exclu) ` a une feuille de A. Notons que cette d´ efinition du rang est consistante en vertu de la condition (d) dans la d´ efinition d?un arbre bicolore . D´ emontrons que l?application rg que nous venons de d´ efinir satisfait les propri´ et´ es (i), (ii), (iii). Par d´ efinition du rang d?un sommet on a imm´ ediatement que (a)=? (i). Il est clair aussi que rg(x) ? rg(p(x)) pour tout sommet x, et que par ailleurs si x est blanc alors rg(p(x)) = rg(x), et si x est noir alors rg(p(x)) = rg(x) + 1. Donc rg(p(x)) ? rg(x) + 1. Ainsi (ii) est v´ erifi´ e. Reste ` a prouver (iii). On a rg(x) ? rg(p(x)) ? rg(p2 (x)) pour tout x. Supposons que rg(x) = rg(p2 (x)). Alors x est blanc ainsi que p(x), ce qui contredit (c). Donc (c)=?(iii). Proposition 4.2. Si A est un arbre binaire poss` ede une fonction rang, alors il existe une affectation de couleurs c aux sommets de A telle que (A, c) soit un arbre bicolore. Preuve. R´ ealisons l?affectation des couleurs aux sommets de A de la fa¸ con sui- vante : tout sommet ayant m? eme rang que son p` ere est d´ eclar´ e blanc, les autres ´ etant d´ eclar´ es noirs (donc aussi la racine). Montrons que (A, c) est bicolore. Par d´ efinition m? eme de la fonction c, les conditions (a) et (b) sont imm´ ediates. V´ erifions (c). Soit x un sommet blanc, x n?est donc pas la racine, et son p` ere p(x) a m? eme rang que lui. Si p(x) ´ etait blanc, alors p(x) aurait un p` ere de m? eme rang, ce qui contredirait (iii). Donc (iii) =?(c). Il reste ` a prouver (d). Pour ce faire, on prouve par induction sur la hauteur du sommet x la propri´ et´ e (d?) : tous les chemins issus de x et menant ` a une feuille ont m? eme nombre de sommets noirs (x non compris) et ce nombre est ´ egal ` a rg(x). Si x est une feuille, (d?) est vraie pour x. Soit x un n?ud qui n?est pas une feuille, alors par hypoth` ese d?induction, (d?) est vraie pour les fils y et z de x. Il y a trois cas ` a envisager : Version 6 f´ evrier 2005 6.4. Arbres bicolores 175 (?) rg(x) = rg(y) = rg(z) (?) rg(x) = rg(y) + 1 = rg(z) + 1 (?) rg(x) = rg(y) + 1 = rg(z). Sur la figure 4.2 on a repr´ esent´ e les trois cas, le sommet dont la couleur n?est pas connue est repr´ esent´ e par deux demi-disques de couleurs diff´ erentes. x y z r r r r r r+1 r+1 z z y r r+1 (?) ( ?) (?) y x x Figure 4.2: Affectation d?une couleur ` a un n?ud en fonction du rang. Dans le cas (?), y et z sont blancs, et puisque y et z v´ erifient (d?), x v´ erifie (d?). Dans le cas (?), y et z sont noirs, donc pour les m? emes raisons qu?en (?), x v´ erifie (d?). Dans le cas (?), y est noir et z est blanc. Mais puisque y et z v´ erifient (d?) et que rg(y) + 1 = rg(z), tous les chemins issus de x et allant ` a une feuille ont le m? eme nombre de sommets noirs (x non compris) et ce nombre est ´ egal ` a rg(x), donc x v´ erifie (d?). G L P S N B V 2 2 1 1 1 1 1 0 0 0 0 0 0 0 0 Figure 4.3: Attribution d?un rang aux sommets de l?arbre de la premi` ere figure. Nous avons repr´ esent´ e sur la figure 4.3 les rangs des sommets de l?arbre bicolore de la figure 4.1. On laisse au lecteur le soin de v´ erifier en exercice que la corres- pondance que l?on vient d?´ etablir entre les arbres bicolores et les arbres binaires ayant une fonction rang est une bijection, ` a savoir que (A, c) ´ etant donn´ e, la seule fonction rg sur A qui v´ erifie (i), (ii), (iii) est celle que nous avons d´ efinie, et de m? eme pour la r´ eciproque, la seule coloration possible est celle qui a ´ et´ e donn´ ee. 6.4.2 Hauteur d?un arbre bicolore L?efficacit´ e des op´ erations ´ el´ ementaires, en particulier de la recherche, d´ epend essentiellement de la hauteur de l?arbre binaire de recherche. C?est pourquoi il est Version 6 f´ evrier 2005 176 Chapitre 6. Arbres et ensembles ordonn´ es n´ ecessaire d?´ evaluer de fa¸ con pr´ ecise la hauteur d?un arbre bicolore en fonction du nombre de ses sommets. Lemme 4.3. Soit A un arbre bicolore ` a n sommets, et soit x un sommet dans A de rang k et de hauteur h. Alors h ? 2k et n ? 2k ; de plus, si x est blanc, les deux in´ egalit´ es sont strictes. Preuve. Par induction sur la hauteur du n?ud x. Si x est une feuille, la propri´ et´ e est trivialement vraie car x est noir et k est nul. Supposons que la hauteur h de x soit strictement positive. Soient y et z les fils de x. Les trois cas possibles aux sym´ etries pr` es sont repr´ esent´ es sur la figure 4.4. On notera h(x) et n(x) respectivement la hauteur et le nombre de sommets du sous-arbre de A de ra- cine x. x y z z z y y (a) (b) (c) k k k k k-1 k-1 k-1 x k k x Figure 4.4: Les trois cas possibles. Cas (a) Ici, x est noir et y et z sont blancs. Par hypoth` ese d?induction, on a : h(y) < 2k, h(z) < 2k, n(y) > 2k et n(z) > 2k . Donc h(x) ? 2k et n(x) = 1+n(y)+n(z) ? 2k . Or x est noir et de rang k. Les in´ egalit´ es sont donc correctes. Cas (b) Les fils y et z sont noirs et x est blanc ou noir. Par induction, on a h(y) ? 2(k ? 1), h(z) ? 2(k ? 1), n(y) ? 2k?1 et n(y) ? 2k?1 . Donc h(x) ? 2(k ? 1) + 1 < 2k et n(x) ? 2k + 1 > 2k . Comme x est blanc ou noir, le lemme est v´ erifi´ e dans ce cas. Reste le dernier cas : Cas (c) Un des fils, disons y est noir et l?autre blanc et le p` ere x est noir. On a alors h(y) ? 2(k ? 1), h(z) < 2k, n(y) ? 2k?1 et n(z) > 2k . Donc h(x) ? 2k et n(x) > 2k?1 + 2k + 1 > 2k . Comme x est noir, le lemme est v´ erifi´ e. Proposition 4.4. Un arbre bicolore ayant n sommets (n > 0) et de hauteur h v´ erifie : log n ? h ? 2 log n Preuve. La preuve d´ ecoule directement du lemme pr´ ec´ edent et du fait qu?un arbre binaire ` a n > 0 sommets est de hauteur au moins log n . Corollaire 4.5. La recherche d?un ´ el´ ement dans un arbre bicolore prend un temps O(log n) o` u n est le nombre de sommets de l?arbre. Version 6 f´ evrier 2005 6.4. Arbres bicolores 177 6.4.3 Insertion dans un arbre bicolore Soit m un nouvel ´ el´ ement ` a ins´ erer dans un arbre bicolore A. Comme dans un arbre binaire de recherche ordinaire, on descend dans l?arbre en partant de la racine. On cr´ ee un nouveau sommet blanc x contenant m dont les fils sont des feuilles noires. Soit A l?arbre obtenu; cet arbre n?est plus n´ ecessairement un arbre bicolore (figure 4.5). P L V S G B insérer A P L V S G B A A A' Figure 4.5: Premi` ere phase de l?insertion de A dans A. En fait, seules les propri´ et´ es (b) ou (c) de la d´ efinition peuvent ne plus ? etre respect´ ees dans A , ` a savoir : la racine est blanche (parce que x est la racine) ou bien : un sommet et son p` ere sont blancs (parce que le p` ere de x est blanc). Proc´ edure de r´ e´ equilibrage Nous allons donner 3 r` egles (et leurs sym´ etriques) qui permettent de r´ e´ equilibrer l?arbre apr` es insertion. Si A ´ etait vide avant l?insertion (cas o` u (b) n?est pas respect´ e), il suffit de colorer x en noir, et c?est termin´ e (r` egle (?) de la figure 4.6). x x racine ? Figure 4.6: R´ e´ equilibrage apr` es une insertion : r` egle ?. Sinon, le p` ere y de x est blanc, donc y n?est pas la racine et son p` ere z est noir. Supposons, pour fixer les id´ ees, que y est fils gauche de z, et notons t le fils droit de z. Appliquons l?algorithme suivant, o` u x est le sommet courant qui au d´ epart est le sommet nouvellement cr´ e´ e (le sommet courant est indiqu´ e par une fl` eche sur la figure) : ? si y a un fr` ere blanc on applique ?1 ou ?2 selon l?´ eloignement de x et t, i.e. selon que x est un fils gauche ou droit (si y est un fils droit, il faut prendre la r` egle Version 6 f´ evrier 2005 178 Chapitre 6. Arbres et ensembles ordonn´ es z x y t z x y t 1 z x y t z x y t 2 Figure 4.7: R´ e´ equilibrage apr` es une insertion : r` egles ?. sym´ etrique qui revient ` a consid´ erer effectivement l?´ eloignement des deux sommets x et t); le sommet courant devient z (?1 ou ?2 ne sont que des changements de couleur). Alors si l?arbre obtenu n?est pas bicolore, c?est qu?` a nouveau l?une des propri´ et´ es (b) ou (c) n?est pas respect´ ee au sommet z, on it` ere donc le processus. z x y t y z x t 2 z x y t y z x t 1 A B A B A A Figure 4.8: R´ e´ equilibrage apr` es une insertion : r` egles ?. ? si y a un fr` ere noir t, on fait une rotation simple (?1) dans le cas o` u x et t sont ´ eloign´ es et une rotation double (?2) dans le cas o` u ils sont proches; dans les deux cas, l?arbre obtenu est bicolore et le processus de r´ e´ equilibrage est termin´ e. Puisque les r` egles ? diminuent de deux la profondeur du sommet courant et que les r` egles ? et ? sont des r` egles d?arr? et, il est clair que l?it´ eration se termine et fournit un arbre de recherche bicolore. Proposition 4.6. Une insertion dans un arbre bicolore ` a n sommets prend un temps O(log n) et n´ ecessite au plus deux rotations. Preuve. La descente avant insertion prend un temps O(log n). Puis dans la proc´ edure de r´ e´ equilibrage, ` a chaque op´ eration ´ el´ ementaire, le sommet courant Version 6 f´ evrier 2005 6.4. Arbres bicolores 179 a une profondeur qui diminue strictement, sauf en cas de r` egle d?arr? et, donc le nombre total d?op´ erations ´ el´ ementaires est O(log n), par ailleurs chaque op´ eration ´ el´ ementaire prend un temps O(1), d?o` u la premi` ere assertion. Par ailleurs, les r` egles n´ ecessitant des rotations sont terminales, il s?agit de (?1) (une rotation) et (?2) (une rotation double) donc le r´ esultat est d´ emontr´ e. P L V S G B A P L V S B A (? ) 1 G A' Figure 4.9: R´ e´ equilibrage apr` es insertion de A. 6.4.4 Suppression d?un ´ el´ ement dans un arbre bicolore Consid´ erons maintenant le probl` eme de la suppression. On proc` ede en deux ´ etapes. La premi` ere phase consiste ` a appliquer l?algorithme de suppression d?un ´ el´ ement dans un arbre de recherche binaire classique. En descendant dans l?arbre on trouve le sommet x dans lequel est rang´ e l?´ el´ ement m que l?on veut supprimer. ? si le fils droit de x est une feuille, alors on supprime x et on le remplace par son sous-arbre gauche de racine y; notons que ce sous-arbre gauche, du fait qu?on a affaire ` a un arbre bicolore, est soit une feuille, soit un arbre de hauteur 1 dont la racine est blanche et dont les fils sont des feuilles; ? si x ´ etait blanc, l?arbre reste un arbre bicolore et on peut remarquer que dans ce cas y est une feuille (figure 4.10 (a)); ? si x ´ etait noir, il y a deux cas ` a envisager selon la couleur du sommet y qui a remplac´ e x : ? si y est blanc, ses fils sont des feuilles, on colore y en noir (figure 4.10 (b)) et l?algorithme est termin´ e; ? si y est noir, y est une feuille et y devient d´ egrad´ e ce que l?on note sur la figure par un signe ?, nous expliquerons dans un instant ce que cela signifie pr´ ecis´ ement (figure 4.10 (c)); ? si le fils droit de x n?est pas une feuille, alors on recherche le sommet y contenant le pr´ ed´ ecesseur l de m; ce sommet y a pour fils droit une feuille; on remplace m par l dans x et on supprime le sommet y par l?algorithme ci-dessus. Version 6 f´ evrier 2005 180 Chapitre 6. Arbres et ensembles ordonn´ es (b) x y y (a) x y (c) y y x y Figure 4.10: Premi` ere phase de suppression d?un ´ el´ ement dans un arbre bicolore . Pr´ ecisons la signification d?un sommet d´ egrad´ e : lorsqu?un sommet x est d´ egrad´ e, cela signifie que le nombre de sommets noirs sur un chemin de x ` a une feuille quelconque, x compris, est inf´ erieur d?une unit´ e au nombre de sommets noirs sur un chemin de y (fr` ere de x) ` a une feuille quelconque, y compris, et donc le p` ere de x, s?il existe, ne respecte pas la condition (d) de la d´ efinition des arbres bicolores. La deuxi` eme phase consiste ` a r´ e´ equilibrer l?arbre dans le cas o` u il contient un sommet d´ egrad´ e. Les sch´ emas des figures 4.11 et 4.12 donnent l?algorithme ` a appliquer. Le sommet courant x est le sommet d´ egrad´ e, il est indiqu´ e par une fl` eche et on suppose que si x a un p` ere y alors x est un fils gauche, et on appelle z son fr` ere (on obtient toutes les r` egles par sym´ etrie, on notera par des lettres prim´ ees les r` egles sym´ etriques des r` egles indiqu´ ees). Plusieurs remarques sont ` a faire pour justifier la validit´ e de l?algorithme. Tout d?abord, si z existe, alors, par d´ efinition d?un sommet d´ egrad´ e, puisque x est d´ egrad´ e, z ne peut ? etre une feuille, donc z a deux fils. Ensuite, on peut noter que tous les cas sont examin´ es : ? soit x est la racine (r` egle (a1)); ? soit x a un fr` ere noir z qui a lui m? eme deux fils noirs (r` egles (a2) ou (a3) selon que le p` ere y est noir ou blanc); ? soit x a un fr` ere noir z dont l?un des deux fils est blanc (r` egles (b2) ou (b3) selon qu?il s?agit d?un fils gauche ou droit; notons que si les deux fils de z sont blancs on peut appliquer l?une ou l?autre r` egle); ? soit x a un fr` ere blanc (r` egle (b1)). On peut noter que la profondeur du sommet courant diminue strictement ` a chaque application d?une r` egle sauf pour la r` egle (b1), mais cette r` egle est suivie de Version 6 f´ evrier 2005 6.4. Arbres bicolores 181 racine (a ) 2 (a ) 1 (a ) 3 Figure 4.11: R´ e´ equilibrage apr` es une suppression : r` egles (a1), (a2), (a3). l?application d?une r` egle (a3), (b2) ou (b3) qui sont des r` egles d?arr? et. Donc le nombre de r` egles appliqu´ ees est au plus O(log n) et chacune prend un temps O(1). Enfin, il est facile de v´ erifier que les r` egles appliqu´ ees sont correctes, i.e. que si le sommet courant est d´ egrad´ e avant application de (a2) ou (b1), alors le sommet courant apr` es application de la r` egle est bien un sommet d´ egrad´ e , et que, apr` es application de l?une des autres r` egles, qui sont des r` egles d?arr? et, l?arbre obtenu est un arbre bicolore. Proposition 4.7. Une suppression dans un arbre bicolore ` a n sommets (n > 0) prend un temps O(log n) et n´ ecessite au plus trois rotations. Preuve. La premi` ere assertion d´ ecoule imm´ ediatement des remarques ci-dessus, chaque phase prenant un temps O(log n). Quant aux rotations, elles apparaissent dans les r` egles (b1) (une rotation), (b2) (une rotation) et (b3)) (une rotation dou- ble). Or la r` egle (b1) est suivie de l?une des r` egles (a3), (b2), (b3), qui sont toutes les trois terminales, la preuve est donc termin´ ee. Exemple. Dans l?exemple de la figure 4.13, on supprime le contenu p de la racine. La premi` ere phase consiste ` a mettre dans la racine la plus grande cl´ e du sous-arbre gauche, ` a savoir n, et ` a supprimer le sommet qui contient cette cl´ e, ce qui d´ egrade une feuille. On doit alors proc´ eder au r´ e´ equilibrage de l?arbre. On applique alors la r` egle (b1), puis la r` egle (b3). Version 6 f´ evrier 2005 182 Chapitre 6. Arbres et ensembles ordonn´ es A x y z t x y z t u x y z t u A B A B A x y z t x y z x y z A A (b ) (b ) (b ) 1 2 3 Figure 4.12: R´ e´ equilibrage apr` es une suppression : r` egles (b1), (b2), (b3). phase 1 B L P V S N G B L V S N G B L V S N G phase 2 (b' ) B V S N phase 2 (d) (a' ) G L W W W W 1 3 Figure 4.13: Suppression de p. 6.5 Enrichissement Dans les sections pr´ ec´ edentes, nous avons d´ ecrit trois familles d?arbres ´ equilibr´ es qui impl´ ementent, de fa¸ con efficace, les op´ erations d?un dictionnaire (recherche, insertion et suppression). Nous avons ´ egalement constat´ e que la scission et la concat´ enation pouvaient ? etre r´ ealis´ ees en temps logarithmique. Dans cette section, nous montrons comment impl´ ementer d?autres op´ erations, comme la recherche du k-i` eme ´ el´ ement, ou du m´ edian, en temps logarithmique. Pour cela, il convient d?augmenter la structure (de l?enrichir) par quelques don- n´ ees additionnelles aux sommets. Le but de cette section est de montrer qu?un Version 6 f´ evrier 2005 6.5. Enrichissement 183 arbre ´ equilibr´ e enrichi de cette mani` ere poss` ede ` a la fois la souplesse d?un arbre et d?une liste cha? ?n´ ee. P` ere Soit A un arbre, et consid´ erons la fonction p` ere(x : sommet; A : arbre) qui donne le p` ere de x dans A, et qui est ind´ efini si x est la racine de A. Le calcul de cette fonction n?est pas facile si l?on ne dispose pas d?un champ suppl´ ementaire dans les sommets. Enrichissons donc la structure en associant, ` a chaque sommet, un pointeur suppl´ ementaire qui donne son p` ere (ce pointeur vaut nil pour la racine). La valeur de ce pointeur est facile ` a maintenir lors d?une insertion ou d?une suppression d?un sommet. On se convainc ais´ ement que la mise ` a jour de ces pointeurs, lors d?une rotation ou d?une double rotation, se fait en temps constant. Voisins Soit A un arbre binaire de recherche pour un ensemble de cl´ es S. Le parcours en ordre sym´ etrique (voir chapitre 4) de l?arbre fournit ses cl´ es en ordre croissant. On peut donc d´ efinir les fonctions suivant et pr´ ec´ edent sur les sommets de A, comme dans une liste : suivant(x : sommet; A : arbre) : sommet; Donne le sommet contenant la cl´ e qui suit la cl´ e de x; ind´ efini si la cl´ e de x est la plus grande cl´ e dans A. pr´ ec´ edent(x : sommet; A : arbre) : sommet; Donne le sommet contenant la cl´ e qui pr´ ec` ede la cl´ e de x; ind´ efini si la cl´ e de x est la plus petite cl´ e dans A. La r´ ealisation en temps constant de ces deux op´ erations sur un arbre balis´ e (qu?il soit binaire, ou a?b) est particuli` erement facile. On munit pour cela chaque feuille de deux pointeurs suppl´ ementaires, l?un pointant vers son voisin de gauche (dont la cl´ e est justement la cl´ e pr´ ec´ edente), l?autre vers son voisin de droite. Cela revient ` a plaquer, sur la suite des feuilles, une structure de liste doublement cha? ?n´ ee. La gestion de ces pointeurs, lors d?une insertion ou d?une suppression, se fait comme pour les listes, et le surco? ut par op´ eration est donc constant. Dans le cas particulier des arbres a?b (et plus g´ en´ eralement des arbres dont toutes les feuilles sont ` a la m? eme profondeur), on peut continuer cette construction et cr´ eer une liste doublement cha? ?n´ ee non seulement aux feuilles, mais ` a tous les niveaux de l?arbre. La structure qui en r´ esulte est un arbre ` a liaisons par niveau ( level-linked tree ). Ces arbres ont des propri´ et´ es remarquables; en particulier, la recherche d?une feuille qui se trouve ` a distance d d?une feuille donn´ ee peut se faire en temps O(log d) (exercice). Lorsque l?arbre n?est pas balis´ e, donc lorsque les informations se trouvent sur les sommets, la m? eme structure de liste doublement cha? ?n´ ee est utilis´ ee (voir figure Version 6 f´ evrier 2005 184 Chapitre 6. Arbres et ensembles ordonn´ es Figure 5.1: Un arbre 2?3 ` a liaisons par niveau. 5.2). On se convainc facilement que les rotations et doubles rotations laissent cette liste inchang´ ee. En ce qui concerne la suppression d?une cl´ e, on est amen´ e, rappelons-le, ` a supprimer une feuille. C?est cette feuille qui est aussi supprim´ ee dans la liste. 400 232 300 125 252 357 702 801 620 Figure 5.2: Une liste doublement cha? ?n´ ee sur les sommets d?un arbre. Proposition 5.1. Dans un arbre de recherche ´ equilibr´ e, on peut, moyennant des pointeurs suppl´ ementaires, impl´ ementer les op´ erations suivant et pr´ ec´ edent en temps constant. Num´ ero d?ordre Le num´ ero d?ordre ou le rang d?une cl´ e dans un ensemble S est le nombre de cl´ es qui lui sont inf´ erieures ou ´ egales. C?est le num´ ero que re¸ coit la cl´ e quand elles sont num´ erot´ ees, ` a partir de 1, en ordre croissant. Consid´ erons le probl` eme de la recherche de la cl´ e de num´ ero d?ordre k dans un ensemble repr´ esent´ e par un arbre binaire de recherche A. Bien entendu, il ne s?agit pas de faire un parcours sym´ etrique de l?arbre. Dotons chaque sommet x d?un champ suppl´ ementaire dont la valeur n(x) est le nombre de sommets dans le sous-arbre A(x) de racine x (la taille). En particulier, pour la racine r, le nombre n(r) est le nombre de sommets de A. Notons ?(x) le num´ ero d?ordre de x dans la num´ erotation infixe. Posons ng(x) = n(y) si y est le fils gauche de x; 0 si x n?a pas de fils gauche. Version 6 f´ evrier 2005 6.5. Enrichissement 185 9 3 2 1 5 3 1 2 1 1 2 3 4 5 6 7 8 9 Figure 5.3: Les num´ eros d?ordre (en blanc) et les tailles (en noir). et de m? eme pour nd. On cherche le k-i` eme sommet comme suit : on compare k au nombre m = 1 + ng(r), o` u r est la racine de l?arbre. L?entier m est le num´ ero d?ordre de la racine. Si k < m, le sommet cherch´ e est dans le sous-arbre gauche; si k > m, il est dans le sous-arbre droit, et il est le sommet de num´ ero k ? m dans la num´ erotation de ce sous-arbre. D?o` u la proc´ edure : proc´ edure Sommet-d?ordre(k, A); m := 1 + ng(racine(A)); si m = k alors retourner racine(A) sinon si k < m alors retourner Sommet-d?ordre(k, Ag) sinon retourner Sommet-d?ordre(m ? k, Ad) finsi. Il reste ` a ´ etudier les r´ epercussions des op´ erations d?insertion, de suppression, et de r´ e´ equilibrage. Consid´ erons par exemple les arbres AVL. Une insertion ou sup- pression doit ? etre suivie d?une remont´ ee vers la racine, pour ajuster les tailles n(x) sur chaque n?ud x du chemin entre la racine et la feuille ajout´ ee ou supprim´ ee. Quant aux rotations et doubles rotations, l?ajustement se r´ eduit ` a une ou deux additions ou soustractions. Dans le cas d?un arbre a?b, on proc` ede essentiellement de la m? eme mani` ere : en plus des balises, on range dans chaque n?ud le nombre de feuilles dans le sous- arbre rep´ er´ e par la balise. On proc` ede ensuite comme pour les arbres binaires. On a donc : Proposition 5.2. Dans un arbre de recherche on peut, moyennant un champ suppl´ ementaire, trouver la cl´ e de num´ ero d?ordre donn´ e en temps logarithmique en fonction du nombre de cl´ es pr´ esentes. Version 6 f´ evrier 2005 186 Chapitre 6. Arbres et ensembles ordonn´ es M´ edian Etant donn´ e un ensemble de n cl´ es S, on cherche ` a le partager en deux parties S1 et S2 de m? eme taille (` a 1 pr` es) telles que les cl´ es de S1 soient inf´ erieures aux cl´ es de S2. Pour cela, il suffit de conna? ?tre la cl´ e m´ ediane, c?est-` a-dire la cl´ e dont le num´ ero d?ordre est n/2 , puis d?appliquer un algorithme de scission. Si, pour chaque sommet, on conna? ?t le nombre de sommets de son sous-arbre, on peut calculer le num´ ero d?ordre de la cl´ e m´ ediane en temps constant. En temps logarithmique, on rep` ere ensuite le sommet m´ edian, puis ` a nouveau en temps logarithmique, on effectue la scission. On a donc Corollaire 5.3. Dans un arbre a?b, on peut effectuer la recherche du m´ edian en temps logarithmique, donc aussi scinder un arbre en deux parts ´ egales (` a 1 pr` es) en temps logarithmique. 6.6 Arbres persistants 6.6.1 Ensembles ordonn´ es persistants Le probl` eme ` a r´ esoudre est le suivant : il s?agit de g´ erer un ensemble totale- ment ordonn´ e E qui ´ evolue dans le temps en ayant pour souci de ne pas perdre d?information sur les ´ etats pass´ es de cet ensemble ordonn´ e. En particulier, on veut ? etre en mesure de savoir si ` a un instant t pass´ e l?ensemble E poss´ edait un ´ el´ ement donn´ e x. On peut prendre connaissance du pass´ e bien s? ur, mais on ne peut pas modifier ce pass´ e, par contre on peut modifier l?´ etat pr´ esent de l?ensemble c?est-` a-dire sa version la plus r´ ecente. Nous formaliserons le probl` eme de la fa¸ con suivante : le temps ou plut? ot une chronologie est repr´ esent´ ee par une suite T = (t0, · · · , tm) strictement croissante de nombres r´ eels appel´ es instants. A l?instant t, on peut effectuer deux types d?actions sur l?ensemble E qui consistent ` a ajouter ou supprimer un ´ el´ ement dans E : ins´ erer(p, E) : consiste ` a ins´ erer l?´ el´ ement p dans l?ensemble ordonn´ e E (ne peut ? etre r´ ealis´ e que si p n?y est pas d´ ej` a); supprimer(p, E) : consiste ` a supprimer l?´ el´ ement p de E (ne peut ? etre r´ ealis´ e que si p figure dans E). Etant donn´ ee une chronologie T = (t0, · · ·, tm), et une suite d?actions h = (a0, . . . , am), on appelle ensemble ordonn´ e persistant E, d?histoire h et de chrono- logie T la suite d?ensembles (E0, E1, . . . , Em) telle que E0 = ? et pour tout i < m, l?ensemble Ei+1 est obtenu en ex´ ecutant l?action ai sur l?ensemble Ei (la suite d?actions doit bien s? ur ? etre ex´ ecutable). L?entier m est la longueur de l?histoire Version 6 f´ evrier 2005 6.6. Arbres persistants 187 h. L?instant pr´ esent est l?instant tm. Pour all´ eger les notations, on note encore E au lieu de Em l?´ etat de l?ensemble ordonn´ e ` a l?instant tm. A cet instant pr´ esent, on peut poser des questions sur le pass´ e ou avancer dans la chronologie, c?est ` a dire faire une nouvelle mise ` a jour de E. Les questions sur le pass´ e sont de la forme suivante : chercher(a, E, tj) : retourne l?´ el´ ement de cl´ e a contenu dans Ej ` a l?instant tj, j ? m s?il y figure, un message d?´ echec sinon. En revanche, la mise ` a jour de E, c?est-` a-dire l?insertion ou la supprssion d?un ´ el´ ement, se fait en ajoutant : ? un nouvel instant tm+1 ` a la chronologie T ; ? une nouvelle action am+1 ` a l?histoire h. La structure de donn´ ees que nous allons pr´ esenter pour impl´ ementer ces op´ e- rations est due ` a N. Sarnak et R. Tarjan. Ses performances sont les suivantes : Si l?histoire est de longueur m, et si Ei contient ` a chaque instant au plus n ´ el´ ements (notons que n´ ecessairement n ? m), alors la recherche se fait en temps O(log m), la mise ` a jour de E en temps et en espace O(log n). Nous donnerons ensuite une version am´ elior´ ee de l?algorithme qui garde la m? eme complexit´ e en temps, et a une complexit´ e amortie lin´ eaire en fonction de m en espace, c?est-` a-dire que la complexit´ e amortie en espace d?une mise ` a jour est O(1). Nous nous pla¸ cons dans le cadre naturel o` u l?ensemble Ei est repr´ esent´ e par un arbre Bi. L?id´ ee la plus simple qui vient ` a l?esprit pour la mise ` a jour ` a l?instant tm+1 est de recopier l?arbre binaire Bm avant de le transformer en arbre Bm+1 qui repr´ esente l?ensemble E ` a l?instant tm+1. On r´ ealise alors chercher(x, E, ti) comme suit : gr? ace ` a un tableau de pointeurs (figure 6.1) sur les racines des arbres Bi on peut (par une recherche dichotomique) trouver en temps O(log m) le pointeur sur l?arbre Bi, puis en temps O(log n) trouver si l?´ el´ ement x figure dans Bi. B1 2 m t B B 1 t t 2 m ................ Figure 6.1: Persistance par recopie int´ egrale. Bien s? ur, la mise ` a jour prend sous cette forme un temps O(n) pour la recopie de l?arbre, et un espace O(n), donc ne r´ epond pas aux exigences formul´ ees plus haut. Version 6 f´ evrier 2005 188 Chapitre 6. Arbres et ensembles ordonn´ es Notons ici que si la chronologie est repr´ esent´ ee par des entiers cons´ ecutifs (ce qui est fr´ equent) la recherche de l?arbre Bi peut se faire en temps O(1) si on utilise un tableau de pointeurs sur les arbres Bi (figure 6.1). Une autre id´ ee, oppos´ ee ` a la premi` ere, est de ne jamais recopier un sommet. A chaque mise ` a jour de la structure, un sommet concern´ e re¸ coit l?information n´ ecessaire (changement de cl´ e, de fils) pour repr´ esenter la nouvelle version. Un sommet grossit alors, ` a chaque modification qui le concerne, d?un nombre cons- tant de cellules, les sommets n?´ etant pas concern´ es par la modification restant inchang´ es. L?inconv´ enient majeur de cette technique r´ eside dans le temps consid´ erable que prend la recherche. En effet, ` a chaque sommet, il convient de parcourir la liste des versions pour d´ eterminer les informations relevantes ` a la version consid´ er´ ee, et le temps de ce parcours n?est pas ind´ ependant du nombre de versions existantes. Nous allons pr´ esenter ici deux m´ ethodes efficaces pour repr´ esenter la liste des versions; la premi` ere est inspir´ ee de la m´ ethode de recopie, mais ` a chaque mise ` a jour, on ne recopie que les sommets sur le chemin de la racine du sommet concern´ e. La deuxi` eme est inspir´ ee de la m´ ethode du grossissement des sommets. Toutefois, on se limite ` a un grossissement born´ e, et en cas de d´ ebordement, on d´ edouble les sommets. Les deux m´ ethodes sont int´ eressantes et efficaces, la premi` ere plus simple, et la deuxi` eme plus ´ economique en place. 6.6.2 Duplication de chemins Pour gagner du temps et de l?espace dans la mise ` a jour, on observe que l?arbre Bi+1 diff` ere peu de l?arbre Bi ; on ne recopie que ce qui est n´ ecessaire, ainsi Bi+1 et Bi vont partager une structure commune. C?est la technique que nous allons exposer maintenant et que l?on cite habituellement comme la m´ ethode de la duplication de chemins. Nous la d´ eveloppons avec des arbres bicolores mais elle peut s?effectuer sur les autres arbres binaires de recherche ´ equilibr´ es. La strat´ egie consiste ` a dupliquer tout sommet dont le contenu a ´ et´ e modifi´ e ou dont un des fils a ´ et´ e dupliqu´ e (ou modifi´ e). Ainsi l?ensemble des sommets dupliqu´ es constitue effectivement un ensemble de chemins partant de la racine de la nouvelle version. Notons que les couleurs des sommets sont seulement utiles pour la mise ` a jour de l?arbre et donc ne concernent que la derni` ere mise ` a jour, ainsi il n?est pas n´ ecessaire de dupliquer un sommet dont on change simplement la couleur. La r` egle de duplication est donc la suivante : R` egle de duplication. Dupliquer tout sommet dont le contenu (qu?on appelle encore la cl´ e) a ´ et´ e modifi´ e. Dupliquer le p` ere d?un sommet dupliqu´ e. Le p` ere Version 6 f´ evrier 2005 6.6. Arbres persistants 189 dupliqu´ e a deux pointeurs gauche et droit, un sur le fils dupliqu´ e, l?autre sur le fils qui n?a pas ´ et´ e dupliqu´ e. Figure 6.2: Duplication de chemin. La duplication du p` ere d?un sommet dupliqu´ e se r´ epercute donc jusqu?` a la racine. Le but de cette r` egle est de ne pas modifier Bm, sauf ´ eventuellement les couleurs des sommets, mais celles-ci sont d´ esormais inutiles; en partant du pointeur associ´ e ` a l?instant tm, on retrouve toujours le m? eme arbre. Examinons en d´ etail comment on proc` ede ` a une insertion ou une suppression sur la version courante (c?est-` a- dire la derni` ere version) de E. Mais auparavant, pour comprendre pourquoi le m´ ecanisme de r´ e´ equilibrage est plus complexe dans le cas d?une suppression que dans celui d?une insertion, il faut observer quels sont les pointeurs modifi´ es dans une op´ eration de rotation. x y z u z y x u Figure 6.3: Modifications de pointeurs dans une rotation gauche. La figure 6.3 montre ` a gauche en pointill´ es les pointeurs qui disparaissent, et ` a droite en gras les pointeurs nouvellement cr´ e´ es. Si l?on se reporte alors aux r` egles de r´ e´ equilibrage dans les arbres bicolores, on observe que dans le cas d?une inser- tion, les r` egles qui font intervenir des rotations (les r` egles ?) ne modifient que des pointeurs issus de sommets qui, dans la structure persistante, sont des sommets d´ ej` a dupliqu´ es, le r´ e´ equilibrage s?effectue donc simplement . Par contre, pour ce qui est d?une suppression dans un arbre bicolore, les r` egles qui font intervenir des rotations (r` egles b1, b2, b3) modifient des pointeurs de sommets non encore dupliqu´ es, ces sommets doivent donc ? etre dupliqu´ es, nous verrons cela en d´ etail un peu plus loin. Version 6 f´ evrier 2005 190 Chapitre 6. Arbres et ensembles ordonn´ es Cas d?une insertion Soit Bm la derni` ere version de E et p l?´ el´ ement ` a ins´ erer ` a l?instant tm+1. L?inser- tion se fait en deux phases. Phase 1 La descente dans l?arbre Bm ` a partir de sa racine permet de cr´ eer une feuille x colori´ ee en rouge pour y placer p. Cette feuille appartient ` a Bm+1 mais pas ` a Bm bien s? ur. Puis on duplique tous les sommets situ´ es sur le chemin allant de la racine ` a x non compris, chaque sommet dupliqu´ e ayant un pointeur sur son fils situ´ e dans Bm et un pointeur sur son fils nouvellement cr´ e´ e (figure 6.4). t m t m t m+1 Figure 6.4: Premi` ere phase de l?insertion. Expliquons l?exemple de la figure 6.5. Nous nous autorisons ici ` a confondre les n?uds et leur contenu (car cela ne porte pas ` a cons´ equence), et nous parlerons d?ancien et de nouveau pour un sommet et son dupliqu´ e. L?insertion de J modifie le fils droit de I (qui ´ etait vide). On duplique donc le fils droit de I en un sommet J, et l?on duplique tout le chemin de J ` a la racine. On a alors un nouveau chemin (O, G, K, I, J). Le nouvel O est racine de l?arbre Bm+1 que l?on compl` ete en donnant comme fils manquant ` a chaque nouveau sommet du chemin dupliqu´ e, le fils correspondant de l?ancien sommet associ´ e : par exemple le nouveau K a pour fils droit le fils droit de l?ancien K, i.e. M. Phase 2 On a ainsi cr´ e´ e un nouvel arbre Bm+1 dont la racine est la dupliqu´ ee de la racine de Bm. Il ne reste plus qu?` a r´ e´ equilibrer l?arbre Bm+1 en appliquant toujours la r` egle de duplication ci-dessus; mais il se trouve que dans le cas d?une insertion, le r´ e´ equilibrage ne n´ ecessite pas de nouvelle duplication car les pointeurs modifi´ es dans les rotations sont issus de sommets d´ ej` a dupliqu´ es, donc les pointeurs issus des n?uds de l?arbre Bm ne sont pas modifi´ es. On aura par exemple dans le cas Version 6 f´ evrier 2005 6.6. Arbres persistants 191 O G C A E I M K S P W O O G G S C A E I I J M K K P W insertion de J (phase 1) t t m m+1 Figure 6.5: Insertion d?un nouvel ´ el´ ement ? phase 1. d?une rotation gauche le sch´ ema suivant (les sommets dupliqu´ es sont indiqu´ es par des lettres prim´ ees) : z y x avant après x y z u u x' y' z' Figure 6.6: R´ e´ equilibrage par rotation gauche lors d?une insertion. La phase 2 consiste donc simplement en un r´ e´ equilibrage de l?arbre Bm+1. Notons que dans cette phase, la couleur d?un sommet commun ` a Bm et Bm+1 peut ? etre modifi´ ee. Dans l?exemple donn´ e (figure 6.7), la phase 2 consiste en un r´ e´ equilibrage de l?arbre Bm+1 par application de la r` egle ?2 suivie de la r` egle ?2. La couleur de M a ´ et´ e modifi´ ee, mais cela n?est pas g? enant car la couleur des n?uds ne sert que dans la derni` ere version. Cas d?une suppression Soient q l?´ el´ ement ` a supprimer dans la derni` ere version Bm de E et x le sommet contenant q. Phase 1 Version 6 f´ evrier 2005 192 Chapitre 6. Arbres et ensembles ordonn´ es J O O G G C A E I I M K K S P W J O G G C A E I M K I K O S P W insertion de J (phase 2) t t m m+1 t t m m+1 Figure 6.7: Insertion d?un nouvel ´ el´ ement ? phase 2. On applique dans un premier temps l?algorithme classique de suppression dans un arbre binaire de recherche. Si x a un fils gauche, on d´ etermine le sommet y contenant le pr´ ed´ ecesseur de q, soit p. Ce sommet y n?a pas de fils droit autre qu?une feuille. On duplique tous les sommets allant de la racine ` a y non compris, le dupliqu´ e de x contenant p, et chaque sommet dupliqu´ e ayant un pointeur sur son fils qui est dans Bm et un pointeur sur son fils dupliqu´ e. Soit z le p` ere de y. Son dupliqu´ e a un pointeur droit (figure 6.8 (a)) sur le fils gauche t de y si z = x, et un pointeur gauche (figure 6.8 (b)) sur le fils gauche t de y sinon. Si y est rouge, la couleur de t est inchang´ ee, si y est noir alors si t est rouge il devient noir sinon il est d´ egrad´ e. x z y p q x z y x' z' t t q (a) (b) x p y q x p y q x' q z Figure 6.8: Suppression d?un ´ el´ ement - phase 1. Version 6 f´ evrier 2005 6.6. Arbres persistants 193 Si x a un fils droit, la proc´ edure est sym´ etrique de la pr´ ec´ edente. Si x n?a pas de fils (autre que des feuilles), on applique la proc´ edure pr´ ec´ edente o` u x joue le r? ole de y. La figure 6.9 donne un exemple d?ex´ ecution de cette premi` ere phase. A C E G I K M O A C E G K M suppression de O (phase 1) t t m m+1 P W S J P W S I J K O M Figure 6.9: Suppression de O - phase 1. Phase 2 Il reste ` a r´ e´ equilibrer l?arbre Bm+1 obtenu dans la phase pr´ ec´ edente. Mais les proc´ edures de r´ e´ equilibrage des arbres bicolores utilis´ ees dans la suppression mo- difient ´ eventuellement des pointeurs sur des sommets de Bm qu?il faut donc du- pliquer. Ainsi le r´ e´ equilibrage s?effectue selon les nouvelles r` egles d´ ecrites dans les figures 6.10 et 6.11. On a repr´ esent´ e les sommets de Bm par un cercle et ceux de Bm+1 qui sont des copies de sommets de Bm par un double cercle. Les n?uds affect´ es d?un signe ? sont les n?uds d´ egrad´ es. La deuxi` eme phase de suppression appliqu´ ee ` a l?exemple de la figure 6.9 donne le r´ esultat de la figure 6.12, apr` es application de la r` egle (d). Il est ` a noter que dans la structure d´ ecrite, chaque sommet a des pointeurs vers ses fils seulement et non vers ses p` eres. En effet, par nature m? eme de l?arbre persistant, un sommet peut avoir plusieurs p` eres correspondant ` a des instants diff´ erents de l?histoire de l?ensemble persistant, ce qui rend l?impl´ ementation de pointeurs vers les p` eres difficile. Donc, pour pouvoir r´ ealiser les proc´ edures de r´ e´ equilibrage, il est n´ ecessaire d?avoir m´ emoris´ e le chemin dupliqu´ e lors de la descente. Th´ eor` eme 6.1. La structure d?arbre persistant repr´ esentant un ensemble E de taille au plus n et ayant une histoire de longueur m, utilisant la duplica- tion de chemins permet d?effectuer chacune des op´ erations Inserer(p, E) et Version 6 f´ evrier 2005 194 Chapitre 6. Arbres et ensembles ordonn´ es (a) (b) (c) y' x' z z' y' x' z y' x' z x' y' z y' x' z x' y' z Figure 6.10: R´ e´ equilibrage dans une suppression, r` egles (a), (b), (c). (d) (e) x' y' z' z t x' y' t z u z' y' t' x' t z u y' x' z t Figure 6.11: R´ e´ equilibrage dans une suppression, r` egles (d), (e). Supprimer(p, E) en temps et espace O(log n) et l?op´ eration Chercher(p, E, ti) en temps O(log m). Si la chronologie est la suite (0, 1, · · ·, m) alors Chercher (p, E, ti) se calcule en temps O(log n). Preuve. Il est clair que l?insertion ou la suppression d?un ´ el´ ement dans l?arbre persistant prend un temps proportionnel ` a celui pris par une insertion ou une suppression dans un arbre bicolore ordinaire. Quant au nombre de sommets du- pliqu´ es, il est major´ e par la hauteur de l?arbre Bm augment´ e dans le cas d?une sup- pression du nombre de rotations qui est au plus trois. Le r´ esultat est donc prouv´ e pour la premi` ere assertion. Pour ce qui est de la recherche, une premi` ere recherche Version 6 f´ evrier 2005 6.6. Arbres persistants 195 A C E G K M t t m m+ 1 P W S I J K O M t t m m+1 suppression de O (phase 2) A C E G P W S I J K O M S M K I Figure 6.12: Suppression d?un ´ el´ ement-phase 2 (r` egle (d)). dichotomique permet d?obtenir en temps O(log m) le pointeur sur l?arbre Bi dans lequel la recherche doit s?effectuer. Cette recherche prend alors un temps O(log n), mais n ? m. Si les instants sont les entiers de 1 ` a m, alors on a acc` es en temps O(1) ` a la racine de l?arbre Bi. 6.6.3 M´ ethode de duplication des sommets pleins Nous allons voir maintenant comment rendre la structure performante en espace, c?est-` a-dire lin´ eaire en fonction du nombre de mises ` a jour. Il suffit de remarquer que dans une mise ` a jour d?un arbre bicolore ordinaire, qui peut ? etre une insertion ou une suppression, le nombre de n?uds pour lesquels le contenu est modifi´ e (modifications autres que celle de la couleur) et le nombre de pointeurs modifi´ es est O(1). La solution consiste ` a munir chaque sommet d?un nombre fixe k de pointeurs suppl´ ementaires libres qui vont ? etre utilis´ es pour une nouvelle mise ` a jour et ´ eviter des duplications. Ces pointeurs sont munis d?un champ contenant l?instant auquel ils sont activ´ es, c?est ` a dire auquel ils cessent d?? etre libres, et d?un champ pr´ ecisant s?il s?agit d?un pointeur gauche ou droit (notons qu?on peut se passer de ce dernier champ car la nature gauche ou droite du pointeur peut se d´ eterminer en comparant les cl´ es des sommets reli´ es par ce pointeur, mais ce qu?on gagne en place d?un c? ot´ e est perdu en temps de l?autre). Lorsque tous les pointeurs libres d?un n?ud sont activ´ es (le sommet est alors plein ) et qu?un pointeur du n?ud doit ? etre modifi´ e, ou lorsque le contenu du sommet lui-m? eme est modifi´ e, alors seulement le sommet est dupliqu´ e en un nouveau sommet qui dispose ` a nouveau de k pointeurs libres. Nous allons d´ etailler la structure ainsi obtenue pour k = 1; elle ne diff` ere pas dans son principe du cas g´ en´ eral. Nous renvoyons le lecteur int´ eress´ e par le probl` eme Version 6 f´ evrier 2005 196 Chapitre 6. Arbres et ensembles ordonn´ es g´ en´ eral aux notes de fin de chapitre. Chaque sommet est donc muni en tout de trois pointeurs, poss´ edant un champ qui indique s?il s?agit d?un pointeur gauche ou droit, et d?un champ indiquant la date d?activation du pointeur qu?on appellera simplement date du pointeur. A un instant donn´ e tout sommet a au moins deux pointeurs activ´ es, un gauche et un droit, le troisi` eme pouvant ? etre activ´ e ou libre. Ce troisi` eme pointeur est repr´ esent´ e sur les figures par une fl` eche lorsqu?il est libre et d´ ebute par un triangle bicolore dont le c? ot´ e noir indique s?il s?agit d?un pointeur gauche ou droit, ceci pour une plus grande lisibilit´ e des figures Compte tenu de la nouvelle structure des sommets, nous d´ ecomposons les proc´ e- dures d?insertion et de suppression persistantes en op´ erations ´ el´ ementaires que nous d´ ecrivons ci-dessous. Phase 1 Dans la phase 1, les op´ erations ´ el´ ementaires r´ ealis´ ees sont (1) descente dans un sommet (lors d?une insertion, d?une recherche, ou d?une suppression); (2) modification du contenu d?un sommet (lors d?une suppression ou d?une insertion); (3) modification d?un pointeur (lors d?une duplication). (1) Descente dans un sommet Soit p l?´ el´ ement ` a ins´ erer ou ` a supprimer dans la version la plus r´ ecente, ou que l?on recherche dans la version Bk ` a l?instant tk. Si x est le sommet courant (au d´ epart x est la racine de l?arbre correspondant ` a l?instant voulu), l?op´ eration g´ en´ erique est la suivante : ? s?il s?agit d?une mise ` a jour, descendre dans la direction appropri´ ee par le poin- teur le plus r´ ecent; ? s?il s?agit d?une recherche, descendre dans la direction appropri´ ee par le poin- teur le plus r´ ecent parmi ceux qui dans cette direction ont une date d?activation inf´ erieure ou ´ egale ` a tk. Exemple. Supposons que l?on cherche ` a d´ eterminer si l?´ el´ ement F figure dans la version B4. Arriv´ ee au sommet contenant L qui est plein, la descente doit se poursuivre ` a gauche; or il y a deux pointeurs gauches, l?un activ´ e ` a l?instant 3, l?autre ` a l?instant 7; la descente ` a gauche se fait donc vers C par le pointeur de date 3 (figure 6.13). (2) Modification du contenu d?un sommet Cette op´ eration est r´ ealis´ ee lors d?une suppression ou d?une insertion ` a l?ins- tant tm+1. Rappellons qu?on ne consid` ere pas comme modification du contenu la modification de la couleur d?un sommet. Version 6 f´ evrier 2005 6.6. Arbres persistants 197 N D L C 3 5 7 Figure 6.13: Recherche de F ` a l?instant 4. On duplique le sommet x en un sommet x ayant m? eme couleur et ayant un nouveau contenu. Le pointeur gauche (respectivement droit) de x pointe sur le m? eme sommet que le pointeur gauche (respectivement droit) de x le plus r´ ecent. Ces deux pointeurs ont pour date d?activation tm+1. Le sommet x a un pointeur libre (figure 6.14). Si x n?est pas une racine, alors y p` ere de x dans la derni` ere version doit subir l?op´ eration modification de pointeur d´ ecrite ci-apr` es . N D L C 3 5 7 G 8 8 ? Figure 6.14: Le sommet contenant L a ´ ete dupliqu´ e pour contenir G. (3) Modification d?un pointeur Soit x un sommet dont un des fils y (le fils gauche par exemple) est dupliqu´ e au cours de la mise ` a jour ` a l?instant tm+1. Si x n?est pas plein alors le pointeur libre de x est activ´ e, pointe ` a gauche sur le nouveau fils y et a pour date d?activation tm+1 (figure 6.15 (a)). Si x est plein, on duplique x en un sommet x dont le pointeur gauche pointe sur y et le pointeur droit sur le fils droit le plus r´ ecent de x, ces deux pointeurs ont pour date d?activation tm+1. Si x n?est pas une racine, alors le p` ere de x doit ` a nouveau subir l?op´ eration de modification de pointeur (figure 6.15 (b)). Phase 2 La phase 2 proc` ede au r´ e´ equilibrage de la nouvelle version. Il suffit ici de pr´ eciser comment s?effectue l?op´ eration ´ el´ ementaire de rotation. Dans une rotation, cer- tains pointeurs changent de destination. Si leur date d?activation est pr´ ecis´ ement la date de mise ` a jour, on change leur destination, en gardant leur date d?activa- tion. Par contre si leur date d?activation est ant´ erieure ` a la date de mise ` a jour, alors il faut faire un traitement sp´ ecial, i.e. appliquer la r` egle (3) de la phase 1. Prenons le cas d?une rotation droite, les autres cas s?en d´ eduisent. L?algorithme Version 6 f´ evrier 2005 198 Chapitre 6. Arbres et ensembles ordonn´ es N L C 3 N L C 3 5 5 7 D (a) N L C 3 5 (b) N L C 3 7 M D M L ? 6 5 7 6 Figure 6.15: Le fils gauche de L est dupliqu´ e ` a l?instant t7. ` a appliquer est donn´ e dans les figures 6.16 (le n?ud z n?est pas plein) et 6.17 (le n?ud z est plein). a b c d x t e a b c d x t e y et z non pleins y plein, z non plein y y z z a b c d x t e n ? n n y z a b c d x e t n n n n ? y' z y Figure 6.16: Cas o` u z n?est pas plein. Ne sont indiqu´ es ` a gauche que les pointeurs les plus r´ ecents dans une direction donn´ ee. Les nouveaux pointeurs sont en traits ´ epais. Soit n la date de mise ` a jour, et d la date d?activation du pointeur sur le n?ud z avant r´ e´ equilibrage. L?exemple est trait´ e dans le cas o` u toutes les dates d?activation sont strictement inf´ erieures ` a n. Le point d?interrogation signifie qu?il faut appliquer au p` ere de l?ancien z dans l?arbre gauche le traitement modification de pointeur , qui donnera un r´ esultat diff´ erent selon que ce p` ere est plein ou non. Ainsi, si le n?ud z (resp. y) est plein, z (resp. y) est dupliqu´ e en z (resp. y ). Si certaines dates autres que d sont ´ egales ` a n, l?algorithme est plus simple car les pointeurs de date n ont simplement ` a changer de destination s?il y a lieu. Si d = n, il suffit de supprimer dans tous les Version 6 f´ evrier 2005 6.6. Arbres persistants 199 z plein, y non plein a b c d x t e n ? n n n z z' y z et y pleins a b c d x e n n n n ? n n z y' y z' a b c d x t e y z a b c d x t e z y t Figure 6.17: Cas o` u z est plein. arbres obtenus ` a droite le pointeur sur z de date d. O G C A E I M K S P W O G S C A E I J M K P W insertion de J (phase 1) 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 Figure 6.18: Insertion d?un nouvel ´ el´ ement-phase 1. Les figures 6.18, 6.19, 6.20traitent l?exemple des figures 6.5, 6.7, 6.9, 6.12 par la m´ ethode de duplication des n?uds pleins, puis nous donnons les r´ esultats de la suite d?op´ erations insertion de J, suppression de O par la m´ ethode de duplication de chemin (a), et par la m´ ethode de duplication des n?uds pleins (b) pour l?arbre initial de la figure 6.5, en appelant les instants successifs 1, 2, 3 (figure 6.21). Il nous reste ` a calculer la complexit´ e en temps et en espace d?une mise ` a jour dans cette nouvelle structure de donn´ ees. Il est clair que la complexit´ e en temps d?une insertion, suppression ou recherche est ´ equivalente ` a celle de la structure plus simple pr´ ec´ edemment ´ etudi´ ee, et reste Version 6 f´ evrier 2005 200 Chapitre 6. Arbres et ensembles ordonn´ es O G S C A E I J M K P W 1 2 1 1 1 1 1 1 1 1 1 1 2 O G S C A E I J M K P W 1 2 1 1 1 1 1 1 1 1 1 1 2 insertion de J (phase 2) K 2 2 2 2 Figure 6.19: Insertion d?un nouvel ´ el´ ement-phase 2. O G S C A E I J M K P W 1 2 1 1 1 1 1 1 1 1 1 1 2 K 2 2 2 2 suppression de O (phase 1) M 3 3 3 3 O G S C A E I J M K P W 1 2 1 1 1 1 1 1 1 1 1 1 2 K 2 2 2 2 Figure 6.20: Suppression d?un ´ el´ ement-phase 1. O(log m). Complexit´ e amortie en espace d?une mise ` a jour Nous allons d´ efinir un potentiel pour chaque ´ etat de la structure de donn´ ees qui va nous permettre de calculer la complexit´ e amortie en espace d?une mise ` a jour. Soit tm l?instant de la derni` ere mise ` a jour de l?ensemble persistant E. On appelle sommet actif tout sommet accessible ` a partir de la racine de l?arbre Bm par un Version 6 f´ evrier 2005 6.6. Arbres persistants 201 G K O K P W M J I O G C A E I M K S 1 2 3 (a) S (b) O G C A E I J M K 1 2 1 1 1 1 1 1 S P W 1 1 1 1 2 K 2 2 2 2 3 3 3 M 3 Figure 6.21: Comparaison des deux m´ ethodes. pointeur valide, i.e. de date d?activation la plus r´ ecente dans la direction corres- pondante (ce sont les sommets de l?arbre Bm). Les sommets non actifs sont dits passifs. Au cours du temps, un sommet passif reste passif, un sommet actif peut devenir passif. Le potentiel Pm de E ` a l?instant tm (instant de la derni` ere mise ` a jour) est le nombre ?m de sommets actifs diminu´ e du nombre ?m de pointeurs libres dans les sommets actifs : Pm = ?m ? ?m pour m > 0 Initialement, le potentiel P0 de la structure vide est nul. Comme chaque sommet a au plus un pointeur libre, on a clairement : ?m ? ?m et donc Pm ? 0. On d´ efinit le co? ut amorti en espace ?m de la mise ` a jour ` a l?instant tm comme ´ etant le nombre (´ eventuellement n´ egatif) cm de sommets cr´ e´ es par l?action am, augment´ e de la diff´ erence de potentiel de E entre l?instant tm et tm?1 : ?m = cm + (Pm ? Pm?1) Ainsi le nombre de sommets cr´ e´ es au cours de l?histoire (at0 , · · ·, atm ) de E est : m i=1 ci = m i=1 ?i ? m i=1 (Pi ? Pi?1) = m i=1 ?i ? Pm ? m i=1 ?i Donc le co? ut total en espace est major´ e par la somme des co? uts amortis de chaque mise ` a jour. Calculons la complexit´ e amortie d?une mise ` a jour, en ´ evaluant la complexit´ e amortie de chaque op´ eration ´ el´ ementaire. Dans le tableau ci-dessous sont ´ evalu´ ees Version 6 f´ evrier 2005 202 Chapitre 6. Arbres et ensembles ordonn´ es successivement les quantit´ es cm, ?(?m), ?(?m), ?m (o` u ? repr´ esente la variation de la quantit´ e exprim´ ee), pour chaque op´ eration ´ el´ ementaire : ? la cr´ eation d?un n?ud qui s?effectue au cours d?une insertion : cm augmente d?une unit´ e, ainsi que ?m et ?m car le n?ud cr´ e´ e a un pointeur libre; ? la suppression d?un n?ud qui s?effectue au cours d?une suppression : cm diminue d?une unit´ e ainsi que ?m, quant ` a ?m le r´ esultat varie selon que le n?ud supprim´ e ´ etait plein ou non; ? la duplication d?un n?ud (ne prend en compte que la duplication simple sans la cr´ eation de pointeur vers le n?ud dupliqu´ e qu?elle implique) : cm augmente d?une unit´ e, ?m ne varie pas car le n?ud qui a ´ et´ e dupliqu´ e est devenu passif, ?m augmente d?une unit´ e car le nouveau n?ud a un pointeur libre; ? l?activation d?un pointeur qui rend un n?ud plein : cm et ?m ne changent pas, par contre ?m diminue d?une unit´ e; ? la rotation simple : l` a encore, cm et ?m ne changent pas, et la variation du nombre de pointeurs libres d´ epend des cas de figure selon que les n?uds concern´ es par la rotation sont pleins ou non. op´ eration ´ el´ ementaire ?(cm) ?(?m) ?(?m) ?m cr´ eation d?un n?ud +1 +1 +1 +1 suppression d?un n?ud -1 -1 0 ou -1 -2 ou -1 duplication d?un n?ud +1 0 +1 0 activation d?un pointeur 0 0 -1 +1 rotation simple 0 0 de -1 ` a +3 de -1 ` a +3 Une insertion a pour op´ erations ´ el´ ementaires de co? ut amorti non nul : une cr´ eation de sommet, une activation de pointeur (si le sommet cr´ e´ e n?est pas la racine) et au plus deux rotations. Son co? ut amorti est donc O(1). Une suppression a pour op´ erations ´ el´ ementaires de co? ut amorti non nul : une suppression de sommet, deux activations de pointeurs (une pour la modification de contenu du sommet contenant l?´ el´ ement ` a supprimer, l?autre faisant suite ` a la suppression d?un sommet), et au plus trois rotations au cours du r´ e´ equilibrage. Le co? ut amorti d?une suppression est donc aussi O(1). Th´ eor` eme 6.2. La structure d?arbre persistant repr´ esentant un ensemble E de taille au plus n et ayant une histoire de longueur m, utilisant la m´ ethode de duplication des n?uds pleins permet d?effectuer chacune des op´ erations In- serer (p, E) et Supprimer(p, E) en temps O(log n) et l?op´ eration Chercher (p, E, ti) en temps O(log m). Le co? ut amorti en espace d?une mise ` a jour est O(1). Si les instants sont repr´ esent´ es par les entiers 1, 2, · · ·, m, alors Chercher (p, E, ti) se calcule en temps O(log n). Version 6 f´ evrier 2005 Notes 203 Notes La litt´ erature sur les arbres de recherche est tr` es vaste. De nombreux compl´ ements figurent notamment dans : K. Mehlhorn, Data Structures and Algorithms Vol. 1, Springer-Verlag, 1984. G. H. Gonnet, R. Baeza-Yates, Handbook of Algorithms and Data Structures, Addison-Wesley, deuxi` eme ´ edition, 1991 contient des programmes en Pascal et en C. Une synth` ese sur les structures de donn´ ees avec une abondante bibliographie, est K. Mehlhorn, A. Tsakalidis, Data structures, in : J. van Leeuwen, ed., Handbook of Theoretical Computer Science, Vol. A, North-Holland, 1990, 301?341. Les structures de donn´ ees persistantes sont trait´ ees, avec de nombreuses variantes, dans l?article original de leurs inventeurs : J. Driscoll, N. Sarnak, D. Sleator, R. Tarjan, Making data structures persistent, J. Comput. Syst. Sci. 38 (1989), 86?124. Les files binomiales sont dues ` a J. Vuillemin; un expos´ e d´ etaill´ e est donn´ e dans : T.H. Cormen, C.E. Leiserson, R.L. Rivest, Introduction to Algorithms, MIT Press, McGraw-Hill, 1990. Les arbres ´ evas´ es ont ´ et´ e introduits et ´ etudi´ es par Sleator et Tarjan. On peut consulter ` a ce propos le livre de Mehlhorn. Exercices 6.1. D´ ecrire les op´ erations de dictionnaire sur les arbres binaires de recherche balis´ es, et r´ ealiser les programmes correspondants. 6.2. D´ ecrire la proc´ edure qui permet de passer d?un arbre binaire balis´ e ` a un arbre binaire de recherche. 6.3. D´ evelopper les op´ erations de dictionnaire sur les arbres AVL balis´ es. 6.4. D´ ecrire les op´ erations de passage entre arbres de recherche et arbres de recherche balis´ es dans le cas d?arborescences ordonn´ ees. Appliquer ces op´ erations pour traduire les algorithmes des arbres a?b en leur version non balis´ ee. 6.5. Soit A un arbre 2?3 de hauteur h, dont tous les n?uds ont 3 fils. Soit c une cl´ e strictement plus grande que les cl´ es figurant dans A. a) Montrer que l?insertion de c dans A, suivie de la suppression de c, redonne l?arbre A. b) En d´ eduire qu?une suite de n insertions/suppressions de c dans A exige O(nh) op´ erations de r´ e´ equilibrage, et en conclure que le co? ut amorti du r´ e´ equilibrage dans un arbre 2?3 n?est pas constant. Version 6 f´ evrier 2005 204 Chapitre 6. Arbres et ensembles ordonn´ es 6.6. Un arbre ` a pointeur ( finger tree ) est un arbre balis´ e muni d?un pointeur vers une feuille. Montrer que dans un arbre ` a pointeur ` a liaisons par niveau, la recherche d?une cl´ e qui est ` a distance d de la feuille point´ ee peut se faire en temps O(log d). 6.7. On consid` ere un arbre binaire de recherche A qui, pour chaque sommet, dispose d?un pointeur vers son p` ere, ainsi que du nombre de sommets dans son sous-arbre. Montrer comment on peut calculer son num´ ero d?ordre ` a partir de ces informations. 6.8. On peut impl´ ementer les arbres 2?4 au moyen d?arbres bicolores balis´ es comme suit : ` a chaque n?ud d?un arbre 2?4 on associe un n?ud noir s?il a 2 fils, un n?ud noir dont un fils est blanc s?il a trois fils, et un n?ud noir dont les deux fils sont blancs s?il a 4 fils (figure 6.22). Figure 6.22: Transformation d?un arbre 2?4 en arbre bicolore. a) D´ ecrire comment les op´ erations d?´ eclatement, de fusion et de partage se trans- portent sur les arbres bicolores. b) D´ ecrire la r´ ealisation de l?algorithme de scission sur les arbres bicolores. 6.9. Un arbre 1?2 fraternel ( 1?2 brother tree ) est un arbre dont tous les n?uds ont 1 ou 2 fils, et tel qu?un n?ud ` a 1 fils poss` ede un fr` ere qui a deux fils. De plus, toutes les feuilles sont ` a la m? eme profondeur. a) Montrer que si l?on supprime les n?uds ` a 1 fils dans un arbre fraternel, on obtient un arbre AVL, et montrer que cette correspondance est une bijection des arbres 1?2 fraternels sur les arbres AVL. b) Un arbre fraternel de recherche est un arbre fraternel dont les sommets, sauf ceux ayant un fils unique, sont munis d?une cl´ e, les cl´ es ´ etant croissantes en ordre sym´ etrique. D´ ecrire et impl´ ementer les op´ erations de dictionnaire en temps logarithmique sur les arbres fraternels. 6.10. Un arbre ´ evas´ e ( splay tree ) est un arbre binaire de recherche A muni d?une op´ eration d´ efinie comme suit : Evaser(x, A); donne un arbre A qui repr´ esente le m? eme ensemble de cl´ es que A; si x est une cl´ e qui figure dans A, alors x est la cl´ e de la racine de A ; sinon, la racine de A est soit x? soit x+ , o` u x? est la plus grande cl´ e dans A inf´ erieure ` a x, et x+ est la plus petite cl´ e sup´ erieure ` a x. Cette op´ eration est r´ ealis´ ee en localisant, par une descente classique dans A, le sommet contenant x (ou x? ou x+ si x ne figure pas dans A). Ce sommet est Version 6 f´ evrier 2005 Exercices 205 ensuite remont´ e vers la racine en appliquant des doubles rotations gauche- gauche, gauche-droite, droite-gauche, droite-droite (et ´ eventuellement une simple rotation ` a la fin). A B C D s t u A B C D s t u A B C D s t u A B C D s t u A B C D s t u dd gg gd dg Figure 6.23: Les quatre double-rotations. a) Montrer comment r´ ealiser les op´ erations Ins´ erer(x, A) et Supprimer(x, A) en temps constant lorsqu?elles sont pr´ ec´ ed´ ees de Evaser(x, A). b) Montrer que Concat´ ener(S1, S2, S3) ainsi que Scinder(S, x, S1, S2) se r´ ea- lisent ´ egalement en temps constant par des arbres ´ evas´ es si elles sont pr´ ec´ ed´ ees d?un appel appropri´ e d?Evaser. H I J g h i A B G d f e C D E F c b a C D c A B E f d b H I J h g i F G e a Figure 6.24: Effet de l?op´ eration Evaser(a, A). On suppose que chaque cl´ e x est munie d?un poids positif p(x). c) Pour tout sommet s, on appelle rang de s le nombre r(s) = log n(s), o` u n(s) est la somme des poids des cl´ es dans le sous-arbre de racine s, et on d´ efinit le potentiel de A comme la somme des rangs des sommets de A. Montrer que le co? ut amorti de l?op´ eration Evaser(x, A), relativement au potentiel, est major´ e par Version 6 f´ evrier 2005 206 Chapitre 6. Arbres et ensembles ordonn´ es 1 + 3(r(A) ? r(s)), o` u r(A) est le rang de la racine de A, et o` u s est le sommet localis´ e par la descente dans A. d) On consid` ere une suite de m op´ erations Evaser dans un arbre ` a n sommets; montrer que le co? ut total de ces op´ erations est major´ e par O((m+n) log(m+n)). e) Pour chaque cl´ e x, soit q(x) le nombre de fois o` u l?´ evasion porte sur x. Montrer qu?alors le temps total est major´ e par O m + n i=1 q(x) log m q(x) 6.11. (Tri adaptatif.) On consid` ere une suite x1, . . . , xn de nombres distincts ` a trier en ordre croissant; on suppose la suite presque tri´ ee , c?est-` a-dire que le nombre d?inversions F = Card{(i, j) | i < j et xi > xj} est petit . Plus pr´ ecis´ ement, on demande de prouver que l?algorithme ci-dessous trie la suite en temps O(n + n log((1 + F)/n)). L?algorithme ins` ere successivement xn, xn?1, . . . , x1 dans un arbre 2?4 initiale- ment vide. Pour l?insertion de xi, on remonte la branche gauche de l?arbre con- tenant d´ ej` a xi+1, . . . , xn jusqu?` a rencontrer un n?ud si dont la balise gauche est sup´ erieure ` a xi, puis on ins` ere xi dans le sous-arbre gauche de si. a) Montrer que la hauteur de si est O(log(1+fi)), o` u fi = Card{j > i | xi > xj}. b) En d´ eduire que le co? ut total de l?algorithme est major´ e par O( n i=1 log(1 + fi) + E), o` u E est le nombre total d?´ eclatements de n?uds, et conclure. 6.12. (Arbres binomiaux.) On d´ efinit une suite (Bn)n?0 d?arborescences or- donn´ ees par r´ ecurrence sur n comme suit : B0 est l?arbre (arborescence) ` a un seul sommet; Bn+1 est form´ e de la r´ eunion de deux copies disjointes B (g) n et B (d) n de l?arbre Bn ; sa racine est la racine de B (d) n , et il y a un arc de la racine de B (d) n vers la racine de B (g) n . Cet arc est le plus petit (le plus ` a gauche) des arcs issus de la racine. L?arbre Bn est l?arbre binomial d?ordre n. B0 = B1= B2= B3= B4= Figure 6.25: Arbres binomiaux. a) D´ emontrer que dans Bn, il y a exactement n k sommets de profondeur k. b) D´ emontrer qu?un seul sommet de Bn a n fils, et que 2n?k?1 sommets ont k fils pour 0 ? k < n. Version 6 f´ evrier 2005 Exercices 207 On num´ erote les sommets de Bn de 0 ` a 2n ?1 de la gauche vers la droite en ordre postfixe (fils avant le p` ere). c) Montrer qu?un sommet est de profondeur n ? k si et seulement si son num´ ero a k ?1? en ´ ecriture binaire. d) Montrer que le nombre de fils d?un sommet est ´ egal au nombre de ?1? qui suivent le dernier ?0? dans l?´ ecriture binaire de son num´ ero. Etant donn´ e un entier n, soit n = i?0 bi2i , bi ? {0, 1} sa d´ ecomposition en base 2, soit In = {i | bi = 1}, et soit ?(n) = Card(In). La for? et binomiale d?ordre n est l?ensemble Fn = {Bi | i ? In}. La composante d?indice i de Fn est Bi, si i ? In, et ? sinon. e) Montrer que Fn a n ? ?(n) ar? etes. Une file binomiale est une for? et binomiale dont chaque sommet x est muni d?une cl´ e c(x), ´ el´ ement d?un ensemble totalement ordonn´ e, v´ erifiant : si y est fils de x, alors c(y) > c(x). f) Montrer que la recherche du sommet de cl´ e minimale dans une file binomiale Fn peut se faire en ?(n) ? 1 comparaisons. 6.13. (Suite.) Soient Fn et Fn deux files binomiales ayant des ensembles de cl´ es disjointes. On d´ efinit l?op´ eration Union(Fn, Fn ) qui retourne une file binomiale ayant pour cl´ es l?union des ensembles de cl´ es comme suit : (1) Si n = n = 2p , alors Fn = {Bp}, Fn = {Bp}, et Union(Bp, Bp) est l?arbre Bp+1 pour lequel B (g) p = Bp et B (d) p = Bp si la cl´ e de la racine de Bp est plus grande que la cl´ e de la racine de Bp ; et B (g) p = Bp et B (d) p = Bp dans le cas contraire. (2) Dans le cas g´ en´ eral, on proc` ede en commen¸ cant avec les composantes d?indice minimal des deux files, et en construisant une suite d?arbres report. L?arbre report R0 est vide, et ` a l?´ etape k > 0, l?arbre report Rk est soit vide, soit un arbre binomial d?ordre k. Etant donn´ es l?arbre report Rk, la composante Ck de Fn et la composante Ck de Fn , on d´ efinit la composante Ck d?ordre k de Union(Fn, Fn ) et l?arbre report Rk+1 comme suit : (1) Si Rk = Ck = Ck = ?, alors Ck = Rk+1 = ?; (2) Si l?un exactement des trois op´ erandes est non vide, il devient Ck , et Rk+1 = ?; (3) Si deux op´ erandes sont non vides, alors Ck = ? et Rk+1 est l?Union des deux op´ erandes; Version 6 f´ evrier 2005 208 Chapitre 6. Arbres et ensembles ordonn´ es R O S Z K A B D C N L X T E J Y U F12 = F5 = Figure 6.26: Deux files binomiales, (4) Si les trois op´ erandes sont non vides, l?un devient Ck , et Rk+1 est l?Union des deux autres. Par exemple, l?union des deux files binomiales de la figure 6.26 donne la file de la figure 6.27. F17 = K N L X T E J Y U R O S Z A B D C Figure 6.27: . . . et leur union. a) En supposant que l?Union de deux arbres binomiaux de m? eme ordre prend un temps constant, donner une majoration logarithmique en n et n du temps de Union(Fn, Fn ). b) Proposer une structure de donn´ ees qui permet de faire l?union de deux arbres binomiaux en temps constant. c) Montrer que le nombre de comparaisons de cl´ es pour construire Union(Fn, Fn ) est ?(n)+?(n )??(n+n ). (On pourra prouver que ce nombre est ´ egal au nombre de reports dans l?addition usuelle en base 2 de n et de n .) d) Montrer comment l?insertion, dans une file binomiale, d?une cl´ e qui n?y figure pas d´ ej` a peut se ramener ` a une union. e) En d´ eduire un algorithme de construction d?une file binomiale pour un ensemble de n cl´ es, et montrer que cela demande au total n ? ?(n) comparaisons. f) Montrer que la suppression de la plus petite cl´ e dans une file binomiale Fn peut se faire en O(log n) op´ erations, y compris les op´ erations n´ ecessaires pour reconstruire une file binomiale Fn?1 pour les cl´ es restantes. g) En d´ eduire un algorithme de tri d?une suite de n cl´ es en temps O(n log n). Version 6 f´ evrier 2005 Exercices 209 6.14. Appelons arbre relativement ´ equilibr´ e un arbre binaire de recherche tel que le facteur d?´ equilibre en tout sommet soit compris entre ?2 et +2. Soit Nh le nombre de sommets minimal d?un arbre relativement ´ equilibr´ e de hauteur h. a) Montrer que la suite (Nh)h?N satisfait une ´ equation de r´ ecurrence lin´ eaire que l?on r´ esoudra. b) En d´ eduire que la hauteur d?un arbre relativement ´ equilibr´ e ` a n sommets est ?(log n). c) Elaborer des algorithmes d?insertion, suppression et recherche qui se r´ ealisent en temps O(log n), o` u n est le nombre de sommets de l?arbre. 6.15. Construire une variante des arbres bicolores en rempla¸ cant la condition tout sommet blanc a un p` ere noir par tout sommet blanc dont le p` ere est blanc a un grand-p` ere noir . 6.16. On consid` ere la version des arbres persistants avec recopie des n?uds pleins. On modifie la nature des n?uds de la fa¸ con suivante : chaque n?ud poss` ede non pas un seul pointeur suppl´ ementaire mais k pointeurs suppl´ ementaires. Don- ner les algorithmes d?insertion, suppression et recherche adapt´ es, et analyser leur complexit´ e. 6.17. Montrer que la m´ ethode de duplication de chemins des arbres persis- tants donn´ ee dans ce chapitre s?adapte aux arbres AVL et donner les algorithmes d?insertion, suppression, recherche correspondants. Version 6 f´ evrier 2005 210 Chapitre 6. Arbres et ensembles ordonn´ es Version 6 f´ evrier 2005 211 Chapitre 7 Graphes valu´ es Ce chapitre traite deux probl` emes fondamentaux de l?optimisation combinatoire. La premi` ere section est consacr´ ee ` a la recherche d?un arbre couvrant de co? ut minimum dans un graphe valu´ e non orient´ e. Nous pr´ esentons un algorithme tr` es g´ en´ eral fond´ e sur une r` egle des cycles et une r` egle des cocycles puis nous d´ eveloppons deux impl´ ementations particuli` eres conduisant aux algorithmes de Kruskal et de Prim. La seconde section d´ ecrit la recherche des chemins de co? ut minimum issus d?un sommet dans un graphe orient´ e valu´ e. Nous exposons l?it´ era- tion fondamentale de Ford, l?algorithme de Dijkstra pour des co? uts positifs et sa variante A?, l?algorithme de Bellman pour un graphe sans circuit et enfin l?algorithme Paps lorsque aucune hypoth` ese particuli` ere n?est faite sur le graphe valu´ e. Introduction La notion d?arbre de co? ut minimum intervient chaque fois que l?on doit relier au moindre co? ut des objets entre eux de telle sorte que tous les objets soient connect´ es directement ou non. La notion de chemin de co? ut minimum intervient chaque fois que l?on doit trouver un cheminement orient´ e d?un point ` a un autre au moindre co? ut. Ces deux probl` emes sont bien r´ esolus par des algorithmes polynomiaux efficaces qui utilisent des propri´ et´ es structurelles fortes des solutions optimales. Ces propri´ et´ es concernent les cycles et les cocycles pour le probl` eme de l?arbre couvrant de co? ut minimum, les arborescences partielles pour le probl` eme des chemins de co? ut minimum. Version 6 f´ evrier 2005 212 Chapitre 7. Graphes valu´ es 7.1 Arbre couvrant de co? ut minimum 7.1.1 D´ efinition du probl` eme Soit G = (S, A) un graphe non orient´ e connexe et c : A ? R une valuation de ses ar? etes. Si H = (S, F) est un arbre couvrant de G, son co? ut not´ e c(H) est d´ efini par f?F c(f). Le probl` eme est de d´ eterminer dans l?ensemble non vide (car G est connexe) des arbres couvrants de G un arbre couvrant de co? ut minimum. La figure 1.1 repr´ esente un ´ enonc´ e du probl` eme qui nous servira ` a illustrer les propri´ et´ es et les algorithmes qui vont suivre. Pour simplifier l?´ ecriture, nous identifierons dans ce chapitre un graphe partiel (S, U) de G avec l?ensemble U de ses ar? etes, on parlera alors du graphe partiel U. a b c d e f g h i 2 1 1 2 3 2 1 2 1 1 1 2 2 2 1 1 Figure 1.1: Un graphe valu´ e. 7.1.2 Propri´ et´ es des arbres optimaux On appelle approximant d?un arbre optimal un couple (X, Y ) form´ e par deux sous-ensembles d?ar? etes X et Y tels qu?il existe un arbre couvrant de co? ut mini- mum H contenant X et disjoint de Y . L?ensemble X contient les ar? etes admises, l?ensemble Y contient les ar? etes ´ ecart´ ees et l?ensemble Z = A ? (X ? Y ) contient les ar? etes libres. Etant donn´ e un approximant (X, Y ), nous allons montrer que : a) l?existence dans G d?un cycle candidat ne contenant aucune ar? ete de Y per- met d?´ ecarter une ar? ete suppl´ ementaire appartenant au cycle, c?est-` a-dire de d´ eterminer un meilleur approximant (X, Y ) o` u Y contient une ar? ete de plus que Y . b) l?existence dans G d?un cocycle candidat ne contenant aucune ar? ete de X permet d?admettre une ar? ete suppl´ ementaire appartenant au cocycle, c?est-` a-dire de d´ eterminer un meilleur approximant (X , Y ) o` u X contient une ar? ete de plus que X. Une fois ces propri´ et´ es ´ etablies, la construction d?un arbre couvrant de co? ut mini- mum sera r´ ealis´ ee en maintenant un approximant et en l?am´ eliorant ` a chaque it´ eration. La figure 1.2 illustre les notions de cycle et de cocycle candidats pour un Version 6 f´ evrier 2005 7.1. Arbre couvrant de co? ut minimum 213 approximant (X, Y ) o` u les ar? etes de X sont ´ epaisses et les ar? etes de Y en pointill´ e. Le cocycle ?({e}) est candidat, donc X = X ? {{e, d}}. Le cycle (h, b, c, h) est candidat, donc Y = Y ? {{b, c}}. a b c d e f g h i 2 1 1 2 3 2 1 2 1 1 1 2 2 2 1 1 Figure 1.2: Cycle et cocycle candidats. Lemme 1.1. Soient (X, Y ) un approximant, ? un cocycle de G ne contenant aucune ar? ete de X et e une ar? ete libre de co? ut minimal dans ?; le couple (X ? {e}, Y ) est un approximant. Preuve. Soit H un arbre couvrant minimal contenant X et disjoint de Y . Soit T tel que ? = ?(T). Si ? ne contient aucune ar? ete de X, il contient au moins une ar? ete libre de Z car dans le cas contraire, l?arbre H ne serait pas connexe puisque ne contenant aucune ar? ete incidente ` a T. Si H contient l?ar? ete e, alors l?arbre H lui-m? eme r´ epond aux conditions. Sinon l?ar? ete e ferme une cha? ?ne ´ el´ ementaire de H qui contient n´ ecessairement une ar? ete e de ? distincte de e. Le graphe K obtenu ` a partir de H en substituant e ` a e est un arbre couvrant de G de co? ut inf´ erieur ou ´ egal ` a c(H) et donc ´ egal ` a c(H) puisque H est optimal. De plus K contient les ar? etes de X ? {e} et est disjoint de Y . Lemme 1.2. Soient (X, Y ) un approximant, ? un cycle ´ el´ ementaire de G ne contenant pas d?ar? ete de Y et f une ar? ete libre de co? ut maximal dans ? ; le couple (X, Y ? {f}) est un approximant. Preuve. Soit H un arbre couvrant minimal contenant X et disjoint de Y . Le cycle ? ne contenant aucune ar? ete de Y contient au moins une ar? ete libre de Z car dans le cas contraire, l?arbre H contiendrait un cycle. Soit f l?ar? ete libre de co? ut maximal de ce cycle. Si H ne passe pas par f, l?arbre H lui-m? eme r´ epond ` a la question. Sinon le graphe H ? {f} contient deux composantes connexes dont les graphes induits sont des arbres. La cha? ?ne ´ el´ ementaire obtenue ` a partir de ? apr` es suppression de f contient une ar? ete f non contenue dans H et incidente ` a chacune des deux composantes connexes. Le graphe K obtenu ` a partir de H par substitution de f ` a f est un arbre couvrant de G de co? ut inf´ erieur ou ´ egal ` a c(H) et donc de co? ut ´ egal c(H) puisque H est un arbre optimal. De plus K contient X et est disjoint de Y ? {f}. Version 6 f´ evrier 2005 214 Chapitre 7. Graphes valu´ es 7.1.3 Algorithme g´ en´ eral Les deux lemmes pr´ ec´ edents nous permettent d?´ enoncer deux r` egles, la r` egle des cycles et la r` egle des cocycles, et de construire un algorithme glouton qui d´ etermine un arbre couvrant de co? ut minimum en admettant ou en rejetant un ar? ete suppl´ ementaire ` a chaque it´ eration. Comme dans le paragraphe pr´ ec´ edent, (X, Y ) est un approximant d?un arbre optimal H. R` egle des Cycles : Soit ? un cocycle candidat; choisir dans ? une ar? ete libre e de co? ut minimal; Z := Z ? {e}; X := X ? {e} . R` egle des Cocycles : Soit ? un cycle candidat; choisir dans ? une ar? ete libre e de co? ut maximal; Z := Z ? {e}; Y := Y ? {e}. L?algorithme Arbremin(G, c) induit par ces deux r` egles est alors le suivant : proc´ edure Arbremin(G, c); (X, Y ) := (?, ?); Z := A; tantque G poss` ede un cocycle ou un cycle candidat appliquer la r` egle correspondante fintantque. La terminaison de l?algorithme est assur´ ee puisqu?` a chaque it´ eration l?ensemble X ? Y contient un ´ el´ ement de plus. Nous montrons qu?` a l?issue de la derni` ere it´ eration le graphe partiel X est un arbre couvrant de co? ut minimum. Th´ eor` eme 1.3. L?algorithme Arbremin(G, c) d´ etermine un arbre couvrant de co? ut minimum du graphe G pour la valuation c. Preuve. (Induction sur le num´ ero d?it´ eration) Notons Xk et Yk les sous-ensembles X et Y ` a l?issue de l?it´ eration k. En utilisant les deux lemmes pr´ ec´ edents, il est ais´ e de montrer par induction sur k que (Xk, Yk) est un approximant. Notons maintenant K le num´ ero de la derni` ere it´ eration. Si K = m, le graphe partiel XK est un arbre couvrant de co? ut minimum car aucune ar? ete n?est libre. Si K < m, il subsiste dans ZK une ar? ete libre e. L?ar? ete e ne peut fermer une cha? ?ne d?une composante connexe du graphe partiel XK car la r` egle des cycles aurait pu ? etre appliqu´ ee une fois de plus; l?ar? ete e ne peut non plus lier deux composantes connexes du graphe partiel XK car la r` egle des cocycles aurait pu ? etre appliqu´ ee une fois de plus. D?o` u la contradiction. 7.1.4 Algorithmes sp´ ecifiques Nous avons choisi de pr´ esenter, parmi les nombreux algorithmes de recherche d?un arbre couvrant de co? ut minimum, l?algorithme de Kruskal et l?algorithme de Prim. Version 6 f´ evrier 2005 7.1. Arbre couvrant de co? ut minimum 215 Ces deux algorithmes rel` event de l?algorithme g´ en´ eral pr´ esent´ e au paragraphe pr´ ec´ edent mais utilisent chacun une strat´ egie sp´ ecifique pour l?ordre d?application de la r` egle des cocycles ou de la r` egle des cycles. Nous constaterons ´ egalement que moyennant l?utilisation de structures de donn´ ees ad´ equates, leur complexit´ e dans le plus mauvais cas est assez faible. Comme dans le paragraphe pr´ ec´ edent, le couple (X, Y ) est un approximant. Pour chacun des deux algorithmes, une it´ eration consiste ` a introduire une ar? ete suppl´ ementaire dans X ou dans Y . Nous noterons ` a cet effet Xk, Yk et Zk les valeurs de X, Y et Z ` a l?issue de la ki` eme it´ eration. Par convention nous aurons : X0 = Y0 = ? et Z0 = A. Algorithme de Kruskal Le principe g´ en´ eral de l?algorithme de Kruskal est d?´ etablir une liste des ar? etes ordonn´ ee par co? ut croissant au sens large et d?introduire successivement chaque ar? ete de la liste dans l?ensemble X ou dans l?ensemble Y en appliquant soit la r` egle des cocycles soit la r` egle des cycles. proc´ edure Kruskal(G, c); d´ eterminer une liste (e1, . . . , em) des ar? etes ordonn´ ee par co? ut croissant; (X, Y ) := (?, ?); pour i de 1 ` a m faire si ei lie deux composantes connexes du graphe partiel X alors X := X ? {ei} sinon Y := Y ? {ei} finsi finpour. Nous prouvons maintenant que la proc´ edure Kruskal(G, c) d´ etermine effective- ment un arbre couvrant de co? ut minimum de G. Th´ eor` eme 1.4. Soit G = (S, A) un graphe connexe et c : E ? R une valuation de ses ar? etes, la proc´ edure Kruskal(G, c) d´ etermine un arbre couvrant de co? ut minimum de G pour la valuation c. Preuve. Nous montrons par induction sur le num´ ero d?it´ eration k que chaque it´ eration consiste ` a appliquer soit la r` egle des cocycles soit la r` egle des cycles si l?une des deux est appliquable. A l?issue de la premi` ere it´ eration, e1 = {a, b} lie deux composantes connexes du graphe partiel vide d?ar? etes et est une ar? ete libre de co? ut minimal du cocycle ?({a}). La premi` ere it´ eration applique donc la r` egle des cocycles. Supposons que (Xk?1, Yk?1) soit un approximant. Si ek lie deux composantes connexes C et C du graphe partiel Xk?1, l?ar? ete ek est libre et de Version 6 f´ evrier 2005 216 Chapitre 7. Graphes valu´ es co? ut minimal dans le cocycle candidat ?(C ) puisque Xk?1?Yk?1 = {e1, . . . , ek?1}, l?it´ eration k applique donc la r` egle des cocycles. Sinon, l?ar? ete ek lie deux sommets d?une m? eme composante connexe C du graphe partiel Xk?1 et le graphe induit par C est un arbre. L?ar? ete ek ferme donc une cha? ?ne du graphe partiel Xk?1 et est la seule ar? ete libre (donc de co? ut maximal) du cycle ainsi cr´ e´ e; l?it´ eration k applique alors la r` egle des cycles. Puisque Xm ? Ym = A et Zm = ?, le graphe partiel Xm est un arbre couvrant de co? ut minimum de G pour la valuation c. La figure 1.3 montre l?arbre couvrant (ar? etes ´ epaisses) de co? ut minimum calcul´ e par l?algorithme de Kruskal. a b c d e f g h i 2 1 1 2 3 2 1 2 1 1 1 2 2 2 1 1 Figure 1.3: Arbre couvrant de co? ut minimum. Impl´ ementation de l?algorithme de Kruskal L?algorithme de Kruskal manipule essentiellement les composantes connexes du graphe partiel X ` a travers les op´ erations de recherche de la composante con- nexe ` a laquelle appartient un sommet (chaque extr´ emit´ e de l?ar? ete ei) et d?union de deux composantes connexes (si l?ar? ete ei lie ces deux composantes). Il s?agit donc de g´ erer ces deux op´ erations sur une collection d?ensembles disjoints. Une structure de donn´ ees adapt´ ee consiste ` a repr´ esenter chaque ensemble par une anti- arborescence dont les sommets repr´ esentent les ´ el´ ements de l?ensemble et dont la racine est le repr´ esentant de l?ensemble. Si l?on note V cette collection, l?op´ erateur Cr´ eer(v, V) ajoute le nouvel ensemble {v} ` a V ; l?op´ erateur Trouver(v, V) d´ etermine le repr´ esentant de l?ensemble de V auquel appartient v; enfin si u et v sont les repr´ esentants de deux ensembles distincts, l?op´ erateur Unir(u, v, V) remplace l?ensemble repr´ esent´ e par u par l?union des ensembles repr´ esent´ es par u et par v, et d´ etruit l?ensemble repr´ esent´ e par v. La derni` ere section du chapitre 3 traite de l?impl´ ementation efficace de ces op´ erateurs et montre en particulier que la complexit´ e amortie d?une suite de m op´ erations comportant n op´ erations Cr´ eer est O(m?(m, n)) o` u ?(m, n) est une fonction r´ eciproque de la fonction d?Ackermann. En utilisant cette structure de donn´ ees, une impl´ ementation de l?algorithme de Kruskal est la suivante : Version 6 f´ evrier 2005 7.1. Arbre couvrant de co? ut minimum 217 proc´ edure Kruskal(G, c); d´ eterminer une liste (e1, . . . , em) des ar? etes ordonn´ ee par co? ut croissant; {On note ai et bi les extr´ emit´ es de ei } V := ?; X := ?; pour tout s de S faire Cr´ eer(s, V) finpour; pour i de 1 ` a m faire u :=Trouver(ai, V); v :=Trouver(bi, V); si (u = v) alors Unir(u, v, V); X := X ? {ei} finsi finpour. La complexit´ e du tri initial est O(m log n). Suivent alors m op´ erations Cr´ eer et au plus 2m Trouver et m Unir. Il r´ esulte des propri´ et´ es de la fonction ?(m, n) que la complexit´ e globale est celle du tri des ar? etes, soit O(m log n). L?algorithme de Prim Le principe de l?algorithme de Prim est d?appliquer n?1 fois la r` egle des cocycles ` a une suite de n?1 cocycles candidats associ´ es ` a des sous-ensembles embo? ?t´ es de sommets. Le graphe partiel X ainsi obtenu, qui est sans cycles par construction et poss` ede n ? 1 ar? etes, est un arbre couvrant de co? ut minimum. proc´ edure Prim (G, c); T := {a}; X := ?; Z := A; {a est un sommet quelconque de S} pour i de 1 ` a n ? 1 faire choisir une ar? ete {x, y} de co? ut minimal dans ?(T); {on suppose : x ? T et y ? S ? T} X := X ? {{x, y}}; T := T ? {y} finpour; retourner(X). Th´ eor` eme 1.5. Soit G = (S, A) un graphe connexe et c : A ? R une valua- tion de ses ar? etes, la proc´ edure Prim(G, c) d´ etermine un arbre couvrant de co? ut minimum de G pour la valuation c. Preuve. Durant son ex´ ecution, l?algorithme n?´ ecarte aucune ar? ete. Donc, lors de chaque it´ eration, le cocycle ?(T) est candidat pour la r` egle des cocycles puisque G est connexe et X est inclus dans l?ensemble des ar? etes du sous-graphe induit par T ; l?ar? ete {x, y} est alors l?ar? ete libre de co? ut minimal du cocycle ?(T). Chaque it´ eration applique donc la r` egle des cocycles. Version 6 f´ evrier 2005 218 Chapitre 7. Graphes valu´ es La figure 1.4 montre l?arbre couvrant de co? ut minimum (ar? etes ´ epaisses) calcul´ e par l?algorithme de Prim. a b c d e f g h i 2 1 1 2 3 2 1 2 1 1 1 2 2 2 1 1 Figure 1.4: Arbre couvrant de co? ut minimum. Impl´ ementation de l?algorithme de Prim L?op´ eration fondamentale de l?algorithme de Prim est la recherche d?une ar? ete de co? ut minimal d?un cocycle. Cette op´ eration est appliqu´ ee ` a une suite de cocycles pour laquelle chaque sous-ensemble contient un sommet de plus que le pr´ ec´ edent. Une impl´ ementation efficace de ces op´ erations utilise un tas (voir chapitre 3, section 3.4) pour g´ erer les sommets de la bordure B(T) de T o` u chaque sommet y de B(T) est affect´ e d?une priorit´ e not´ ee p(y) ´ egale au co? ut minimal d?une ar? ete de ?(T) d?extr´ emit´ e y. Un sommet de B(T) est promouvable s?il est de priorit´ e minimale. Nous utilisons les op´ erateurs suivants : Cr´ eer, Ins´ erer, Extrairemin, Pri- orit´ e, Est-´ el´ ement qui sont respectivement les op´ erateurs de cr´ eation d?un tas, d?insertion d?un ´ el´ ement, de suppression d?un ´ el´ ement de priorit´ e minimum, d?affectation d?une nouvelle priorit´ e ` a un ´ el´ ement et de test d?appartenance d?un ´ el´ ement. Soit ?(T) le cocycle courant ` a l?issue d?une it´ eration de l?algorithme de Prim et T le tas associ´ e ` a B(T). Nous supposons que le n?ud de T associ´ e ` a un sommet y de B(T) contient outre la priorit´ e p(y) de y une ar? ete de ?(T) d?extr´ emit´ e y et de co? ut p(y). Une ar? ete de co? ut minimal de ?(T) est ainsi stock´ ee ` a la racine de T . Soit {x, y} l?ar? ete s´ electionn´ ee lors de l?it´ eration suivante (x ? T, y ? B(T)), la mise ` a jour de T et de B(T) lors de la promotion du sommet y est r´ ealis´ ee par la proc´ edure Promotion ci-dessous : Version 6 f´ evrier 2005 7.2. Chemins de co? ut minimum 219 proc´ edure Promotion(y, T); pour tout voisin z de y dans S ? T faire si Est-´ el´ ement(z, T ) alors si p(z) > c({y, z}) alors Priorit´ e(z, c({y, z}, T )) finsi sinon Ins´ erer(z, c({z, y}), T ) finsi finpour; T := T ? {y}. L?utlisation d?un tableau bool´ een permet de r´ ealiser l?op´ eration Est-´ el´ ement en temps constant. L?op´ eration Priorit´ e se r´ ealise facilement si la file de priorit´ e est impl´ ement´ ee par un tas. Elle prend alors un temps O(log n) o` u n est le nombre d?´ el´ ements du tas. Il est alors possible d?impl´ ementer l?algorithme de Prim en utilisant la promotion comme suit : proc´ edure Prim-avec-promotion(G, c); Cr´ eer(T ); choisir un sommet a de S ; T := {a}; pour tout voisin v de a faire Ins´ erer(v, c({a, v}), T ) finpour; pour i de 1 ` a n ? 1 faire y :=Extrairemin(T ); soit {x, y} l?ar? ete rang´ ee au n?ud de T contenant y; X := X ? {{x, y}}; Promotion(y, T) finpour. Chaque it´ eration sur i supprime la racine (complexit´ e O(log n)), met X ` a jour (complexit´ e O(1)) et r´ ealise la promotion d?un sommet. Pour cette derni` ere, et dans le plus mauvais cas, il faudra ex´ ecuter pour chaque voisin le test d?appar- tenance au tas et soit une insertion soit une affectation de priorit´ e. Donc le nombre total de mises ` a jour du tas T dues aux promotions est en O(m). Il en r´ esulte que la complexit´ e globale de la proc´ edure Prim(G, c) est O(m log n). 7.2 Chemins de co? ut minimum Lorsque les arcs d?un graphe orient´ e sont ´ etiquet´ es par des nombres r´ eels qui peuvent repr´ esenter des co? uts, des distances, des dur´ ees . . ., on d´ efinit de mani` ere naturelle le co? ut d?un chemin comme la somme des ´ etiquettes des arcs successive- ment emprunt´ es par ce chemin. Un probl` eme important est le calcul efficace d?un Version 6 f´ evrier 2005 220 Chapitre 7. Graphes valu´ es chemin de co? ut minimum entre deux sommets donn´ es. Comme on peut l?imaginer ais´ ement, ce probl` eme intervient dans de tr` es nombreuses applications et joue de plus un r? ole central dans la r´ esolution de certains probl` emes plus difficiles tels que les flots, les ordonnancements, la programmation dynamique. Dans cette section, nous montrerons, suivant en cela la d´ emarche unificatrice de Tarjan, que les prin- cipaux algorithmes de r´ esolution sont issus d?une m? eme it´ eration fondamentale, que leur efficacit´ e est li´ ee ` a l?ordre dans lequel ces it´ erations sont ex´ ecut´ ees et que pour obtenir une complexit´ e faible, cet ordre doit d´ ependre des hypoth` eses faites sur les donn´ ees. La plupart des algorithmes de r´ esolution d´ eterminent en fait pour tout sommet accessible ` a partir de l?origine un chemin de co? ut minimum de l?origine ` a ce sommet. Nous sp´ ecifierons donc le probl` eme sous cette forme. Dans cette section, le seul algorithme pr´ esent´ e sp´ ecifique ` a un sommet origine et un sommet destination est l?algorithme appel´ e A? . Il s?agit d?une variante de l?algorithme de Dijkstra qui utilise une ´ evaluation par d´ efaut suppos´ ee connue a priori du co? ut minimum d?un chemin de tout sommet au sommet destination. Cet algorithme est tr` es utilis´ e pour des graphes de grande taille d´ efinis de mani` ere implicite (probl` emes de recherche en intelligence artificielle, programmation dy- namique), car il permet d?obtenir la solution sans pour autant d´ evelopper tous les sommets accessibles ` a partir de l?origine. 7.2.1 D´ efinition du probl` eme Soient G = (S, A) un graphe orient´ e, c : A ? R une valuation des arcs de G et s un sommet du graphe G appel´ e origine. On suppose que tout sommet est accessible ` a partir de s. On appelle co? ut de l?arc (x, y) la valeur c(x, y). Le co? ut du chemin ? = (z0, . . . , zq) est la somme c(?) = q k=1 c(zk?1, zk). L?objet du probl` eme est de d´ eterminer, pour chaque sommet x, le co? ut minimum not´ e l(s, x) de s ` a x. La figure 2.1 repr´ esente un graphe valu´ e muni d?un sommet origine (en gris´ e). Etant donn´ es deux chemins ? = (x0, . . . , xp) et ? = (y0, . . . , yq) tels que 2 1 4 1 5 3 -3 -2 2 1 -1 1 2 -1 2 3 1 2 1 3 3 5 1 Figure 2.1: Un graphe valu´ e. y0 = xp, nous appelons concat´ enation des deux chemins ? et ? le chemin not´ e ??=(x0, . . . , xp?1, y0, . . . , yq). Version 6 f´ evrier 2005 7.2. Chemins de co? ut minimum 221 7.2.2 Existence d?une solution La question de l?existence d?une solution repose sur la notion de circuit absorbant, c?est-` a-dire ici de circuit de co? ut strictement n´ egatif. Si un tel circuit existe, alors pour tout sommet x accessible ` a partir d?un sommet du circuit, il existe un chemin de s ` a x de co? ut arbitrairement petit obtenu en parcourant le circuit autant de fois que n´ ecessaire. Le circuit (1, 2, 3, 1) est absorbant pour le graphe de la figure 2.2. La proposition suivante pr´ ecise la condition d?existence d?une solution. s=0 1 2 3 4 5 1 1 -3 1 1 -1 1 2 1 2 Figure 2.2: Un circuit absorbant. Proposition 2.1. Il existe un chemin de co? ut minimum de l?origine ` a tout autre sommet si et seulement si le graphe ne poss` ede pas de circuit de co? ut strictement n´ egatif. Preuve. La condition est bien s? ur n´ ecessaire. R´ eciproquement, soit x un sommet quelconque. L?ensemble des chemins ´ el´ ementaires de s ` a x est dominant pour le probl` eme car le co? ut d?un chemin ´ el´ ementaire extrait d?un chemin ? de s ` a x est au plus ´ egal au co? ut de ?. Les chemins ´ el´ ementaires de s ` a x ´ etant en nombre fini, il existe un chemin ´ el´ ementaire de co? ut minimum. La proposition pr´ ec´ edente n?est pas constructive et ne met pas en lumi` ere la propri´ et´ e structurelle fondamentale d?un chemin de co? ut minimum. Proposition 2.2. Soit ? = (z0, . . . , zq) un chemin de co? ut minimum de x = z0 ` a y = zq, tout chemin (zk, zk+1, . . . , zl), 0 ? k ? l ? q, est un chemin de co? ut minimum de zk ` a zl. Preuve. Notons ? le chemin (zk, zk+1, . . . , zl) et soit µ un chemin de zk ` a zl tel que c(µ) < c(?). Le chemin obtenu ` a partir de ? en rempla¸ cant ? par µ est de co? ut strictement inf´ erieur au co? ut de ?. Contradiction. La propri´ et´ e pr´ ec´ edente qui est ´ el´ ementaire pour les chemins de co? ut minimum, est la base de la programmation dynamique , une technique fondamentale pour r´ esoudre certains probl` emes d?optimisation combinatoire et de contr? ole optimal. Ici, cette propri´ et´ e induit une seconde condition n´ ecessaire et suffisante fond´ ee sur l?existence d?une arborescence partielle constitu´ ee de chemins de co? ut minimum. A cet effet, nous appellerons arborescence de chemins minimaux une arborescence partielle de G dont la racine est s et dont chaque chemin de s ` a x est un chemin de co? ut minimum de s ` a x dans G. Version 6 f´ evrier 2005 222 Chapitre 7. Graphes valu´ es Proposition 2.3. Si G n?a pas de circuits absorbants, G poss` ede une arbores- cence des chemins minimaux. Preuve. Appelons pr´ e-arborescence des chemins minimaux un sous-graphe A = (T, B) de G qui est une arborescence de racine s telle que pour tout sommet t de T, le chemin dans A de s ` a t est de co? ut minimum dans G. Nous montrons la condition par construction it´ erative d?une arborescence des chemins minimaux, ` a partir de la pr´ e-arborescence des chemins minimaux A0 = ({s}, ?). On d´ etermine ` a l?´ etape k une pr´ e-arborescence des chemins minimaux Ak qui couvre au moins un sommet de plus que Ak?1. Soient donc (voir figure 2.3) Arborescence A Arborescence B s=z z y=z x=z p q 1 0 Figure 2.3: Construction d?une arborescence des chemins minimaux. A = (T, B) une pr´ e-arborescence des chemins minimaux telle que S ?T = ?, x un sommet de S ? T, ? = (z0, . . . , zq) un chemin (´ el´ ementaire) de co? ut minimum de s = z0 ` a x = zq dans G, y = zp le dernier sommet de ? appartenant ` a T, ? le sous-chemin (z0, . . . , zp), ? le sous-chemin (zp, . . . , zr) (r ? {p + 1, .., q}), ? le chemin de s ` a y dans A. Les deux chemins ? et ? ont le m? eme co? ut d?apr` es la proposition 2.2. Donc, pour tout r ? {p + 1, .., q}, le chemin ?? est de co? ut minimum dans G. De plus si T = T ? {zp+1, . . . , zq} et B = B ? {(zj, zj+1) | j = p, .., (q ? 1)}, alors le sous-graphe A = (T , B ) est une pr´ e-arborescence des chemins minimaux qui couvre au moins un sommet de plus que A. Il en r´ esulte qu?apr` es au plus n ? 1 it´ erations, on obtient une arborescence des chemins minimaux. La plupart des algorithmes de recherche d?un chemin de co? ut minimum cherchent ` a construire par ajustements successifs une arborescence des chemins minimaux. Version 6 f´ evrier 2005 7.2. Chemins de co? ut minimum 223 En chaque sommet x, ils font d´ ecro? ?tre une ´ evaluation par exc` es ?(x) du co? ut minimum d?un chemin de s ` a x qui est ´ egale ` a la valeur d?un chemin de s ` a x. Le pr´ ed´ ecesseur de x sur ce chemin, appel´ e p` ere de x et not´ e p(x), est ´ egalement maintenu. Lors de la terminaison de l?algorithme, les arcs de l?ensemble {(p(x), x) | x ? S ? {s}} constituent une arborescence des chemins minimaux de G. Ces algorithmes utilisent comme test d?arr? et la caract´ erisation suivante d?une arborescence des chemins minimaux : Proposition 2.4. Soit A une arborescence partielle de racine s et soit ?(x) le co? ut du chemin de s ` a x dans A. L?arborescence A est une arborescence des chemins minimaux si et seulement si pour tout arc (x, y) de G on a : ?(x) + c(x, y) ? ?(y). Preuve. La condition n´ ecessaire est imm´ ediate. R´ eciproquement, soit ? un chemin de s ` a y. En sommant les in´ egalit´ es (de la proposition) v´ erifi´ ees par ? pour tous les arcs de ?, il vient : ?(y) ? ?(s) ? c(?) ou encore, puisque ?(s) = 0 : ?(y) ? c(?). Le chemin de s ` a y dans A est donc de co? ut minimum dans G. 7.2.3 It´ eration fondamentale Soit ? : S ? R ? {+?} une fonction telle que si ?(x) ? R, ?(x) soit la valeur d?un chemin ´ el´ ementaire de s ` a x. Un sommet x est dit ´ evalu´ e si ?(x) ? R. Un arc (x, y) est dit candidatsi ?(x) + c(x, y) < ?(y) et l?on note C l?ensemble des arcs candidats. L?it´ eration fondamentale, due ` a Ford, choisit un arc candidat (x, y) et ex´ ecute la mise ` a jour des fonctions p et ? : proc´ edure Ajuster-arborescence( x, y); ?(y) := ?(x) + c(x, y); p(y) := x. La figure 2.4 r´ esume la transformation ´ el´ ementaire r´ ealis´ ee ` a chaque it´ eration. avant l' itération x y z après l' itération x y z Figure 2.4: L?it´ eration de Ford. Avant cette it´ eration on a : ?(x) + c(x, y) < ?(y), p(y) = z et ?(z) + c(z, y) = ?(y). Apr` es cette it´ eration on a : ?(x) + c(x, y) = ?(y), p(y) = x et ?(z) + c(z, y) > ?(y). La proc´ edure Ajuster-candidats(x, y) ci-dessous d´ efinit le nouvel ensemble d?arcs candidats. Version 6 f´ evrier 2005 224 Chapitre 7. Graphes valu´ es proc´ edure Ajuster-candidats( x, y); C := C ? {(x, y)}; pour tout successeur z de y faire si ?(y) + v(y, z) < ?(z) alors C := C ? {(y, z)} finpour. 7.2.4 Algorithme de Ford L?algorithme de Ford fond´ e sur la proposition pr´ ec´ edente peut ? etre impl´ ement´ e par la proc´ edure suivante : proc´ edure Ford(G, s); ?(s) := 0; p(s) := ?; C := ?; pour tout sommet x de S ? {s} faire ?(x) := +?; p(x) := ? finpour; pour tout successeur z de s faire C := C ? {(s, z)}; tantque C = ? faire choisir un arc (x, y) dans C ; Ajuster-arborescence( x, y); Ajuster-candidats( x, y) fintantque; retourner(p, ?). Le th´ eor` eme suivant garantit la validit´ e de la proc´ edure Ford lorsque G ne poss` ede pas de circuit absorbant. Th´ eor` eme 2.5. Si le graphe G ne poss` ede pas de circuit absorbant, la proc´ edure Ford(G, s) se termine et ` a l?issue de la derni` ere it´ eration, la fonction p d´ efinit une arborescence de chemins minimaux. Preuve. Si le graphe G ne poss` ede pas de circuit absorbant, on montre ais´ ement les propri´ et´ es a) et b) suivantes par induction sur le num´ ero d?it´ eration : a) si ?(x) est fini, il existe un chemin ´ el´ ementaire de s ` a x de co? ut ?(x); b) la restriction de la fonction p aux sommets ´ evalu´ es est une arborescence par- tielle du sous-graphe de G induit par les sommets ´ evalu´ es telle que pour tout sommet ´ evalu´ e y distinct de la racine ?(p(y)) + c(p(y), y) = ?(y). Si une it´ eration porte sur un arc candidat (x, y) tel que y est ´ evalu´ e, la valeur ?(y) d´ ecro? ?t d?une quantit´ e ? ´ egale ` a la diff´ erence (strictement positive) des co? uts Version 6 f´ evrier 2005 7.2. Chemins de co? ut minimum 225 de deux chemins ´ el´ ementaires distincts de s ` a y. La valeur ? est donc minor´ ee par l?´ ecart positif minimum entre les co? uts de deux chemins ´ el´ ementaires de co? uts distincts. Le r´ eel est strictement positif car l?ensemble des chemins ´ el´ ementaires de G est fini, le nombre total de mises ` a jour de la fonction ? pour le sommet y est donc fini. Il en r´ esulte que la proc´ edure se termine. Lors de la terminaison, tous les sommets sont ´ evalu´ es, car si un sommet y ne l?´ etait pas, il resterait au moins un arc candidat sur tout chemin de s ` a y. De plus, aucun arc (x, y) n?´ etant candidat, la fonction p` ere d´ efinit un arborescence des chemins minimaux de G. Le th´ eor` eme pr´ ec´ edent garantit la validit´ e de l?algorithme de Ford si le graphe G ne poss` ede pas de circuit absorbant. Cependant, en laissant totalement libre l?ordre des it´ erations, c?est-` a-dire le choix des arcs candidats, la convergence peut ? etre tr` es lente. Pour certains graphes valu´ es ` a m arcs, il est possible d?ex´ ecuter jusqu?` a 2m it´ erations. Pour obtenir une complexit´ e polynomiale, la plupart des algorithmes regroupent les arcs ayant la m? eme origine. Une it´ eration encore appel´ ee examen d?un som- met consiste alors ` a choisir un sommet et ` a ex´ ecuter la proc´ edure Ajuster- arborescence pour tous les arcs candidats incidents ext´ erieurement ` a ce som- met. Il sera commode, pour analyser les diff´ erents algorithmes, de distinguer trois ´ etats pour un sommet. On ouvre un sommet x chaque fois que son ´ evaluation d´ ecro? ?t, on le ferme ` a l?issue de chaque ex´ ecution de Examiner, il reste libre tant qu?il n?est pas ´ evalu´ e. Initialement, le sommet s est ouvert et tous les autres sommets sont libres. Nous noterons respectivement O, F et L les sous-ensembles des sommets ouverts, ferm´ es et libres. Les proc´ edures Ouvrir(x) et Fermer(x) r´ ealisent les mises ` a jour des ensembles O, F et L induites par l?ouverture et la fermeture du sommet x. La proc´ edure Init( G, s) ouvre le sommet s et lib` ere tous les autres sommets. La figure 2.5 repr´ esente l?automate des transitions possibles entre ces trois ´ etats. La proc´ edure Examiner(x) impl´ emente l?examen d?un sommet qui constitue libre ouvert fermé Figure 2.5: Le graphe des ´ etats d?un sommet. maintenant une it´ eration. Version 6 f´ evrier 2005 226 Chapitre 7. Graphes valu´ es proc´ edure Examiner(x); pour tout successeur y de x faire si ?(x) + c(x, y) < ?(y) alors Ajuster-arborescence( x, y); ouvrir(y) finsi finpour; Fermer(x). Pour obtenir un algorithme efficace, il convient de faire en sorte qu?un sommet ferm´ e ne puisse plus (ou du moins le moins souvent possible) redevenir ouvert. Nous allons analyser deux cas particuliers pour lesquels les it´ erations peuvent ? etre ordonn´ ees de telle sorte que tout sommet ferm´ e reste ferm´ e. 7.2.5 Graphe sans circuit Soient G un graphe sans circuit et L = (s1, . . . , sn) une liste topologique des sommets de G telle que s1 = s. Proposition 2.6. L?algorithme Bellman(G, s) examine les sommets une fois et une seule dans l?ordre de la liste. proc´ edure Bellman(G, s); Init( G, s); pour k de 1 ` a n faire Examiner(sk). Preuve. Lors de l?it´ eration k (k ? 2), le sommet sk n?est pas libre car le sommet sk (accessible ` a partir de s dans G) poss` ede un pr´ ed´ ecesseur si (i < k) plac´ e avant lui dans la liste et qui a ´ et´ e examin´ e. Apr` es l?ex´ ecution de Examiner(sk), le sommet sk est ferm´ e et tous les sommets si (i < k) restent ferm´ es puisque seuls les ?(sj) (j > k) ont pu d´ ecro? ?tre lors de cette it´ eration. 7.2.6 Algorithme de Dijkstra Si les co? uts sont positifs ou nuls, la r` egle qui consiste ` a examiner un sommet ouvert d?´ evaluation minimale conduit ` a un algorithme efficace d? u ` a Dijkstra. L?algorithme est alors d´ ecrit par la proc´ edure ci-dessous o` u init(G, s) initialise O, L et F. Version 6 f´ evrier 2005 7.2. Chemins de co? ut minimum 227 proc´ edure Dijkstra(G, s); Init(G, s); r´ ep´ eter n ? 1 fois choisir un sommet ouvert x d?´ evaluation minimale; Examiner(x) finr´ ep´ eter. La validit´ e de cet algorithme repose sur sur la propri´ et´ e suivante : Th´ eor` eme 2.7. L?´ evaluation du sommet ouvert x choisi ` a chaque it´ eration est le co? ut minimum d?un chemin de s ` a x dans G. Preuve. (Induction sur le num´ ero d?it´ eration.) Le co? ut minimum d?un chemin de s ` a s est nul puisque le co? ut de tout circuit est positif ou nul. La propri´ et´ e est donc vraie pour la premi` ere it´ eration. Soit x le sommet ouvert choisi lors de l?it´ eration i (i > 1) et F l?ensemble des sommets examin´ es avant l?it´ eration i. Remarquons que d?apr` es l?induction, tout sommet t de F a ´ et´ e choisi lors d?une it´ eration ant´ erieure ` a i et est rest´ e ferm´ e depuis en conservant une ´ evaluation ´ egale au co? ut minimum d?un chemin de s ` a t dans G. Il r´ esulte alors de la proc´ edure Examiner que pour tout sommet y de S ? F, on a avant l?it´ eration i : ?(y) = ? ? ? l(s, y) si y ? F min{l(s, z) + c(z, y) | z ? F et (z, y) ? A} si y ? O +? si y ? L. Soit ? = (z0, . . . , zq) un chemin quelconque de s ` a x et (zk?1, zk) le dernier arc de ? tel que zk?1 ? F et zk ? F. On a donc avant l?it´ eration i : c(?) ? ?(zk?1) + c(zk?1, zk) ? ?(zk) ? ?(x) d?apr` es l?induction, la positivit´ e des co? uts, la relation pr´ ec´ edente et le choix de x. Il en r´ esulte que ?(x) est le co? ut minimum d?un chemin de s ` a x dans G et que pour l?un des ces chemins, tous les sommets, sauf le dernier, appartiennent ` a F. Proposition 2.8. L?algorithme Dijkstra s´ electionne les sommets dans l?ordre croissant (au sens large) des co? uts minimaux. Preuve. Raisonnons par induction sur le num´ ero d?it´ eration et notons t le dernier sommet ferm´ e avant l?it´ eration i. Nous avons par induction pour tout sommet z de T : ?(z) ? ?(t) et ?(x) ? ?(t) puisque le sommet x n?a pas ´ et´ e choisi avant l?it´ eration i . Les figures 2.6 et 2.7 d´ ecrivent une ex´ ecution de l?algorithme. Les sommets ferm´ es sont noirs, les sommets ouverts sont gris, le sommet ouvert s´ electionn´ e est dou- blement cercl´ e, les sommets libres sont blancs et l?´ evaluation d?un sommet figure Version 6 f´ evrier 2005 228 Chapitre 7. Graphes valu´ es 2 1 4 1 5 1 3 3 2 2 1 1 1 2 1 2 3 1 2 1 3 3 5 0 2 1 4 1 5 1 3 3 2 2 1 1 1 2 1 2 3 1 2 1 3 3 5 0 1 3 2 1 Figure 2.6: Graphe initial et premi` ere it´ eration. 1 2 1 4 1 5 1 3 3 2 2 1 1 1 2 1 2 3 1 2 1 3 3 5 0 3 2 6 1 1 2 1 4 1 5 1 3 3 2 2 1 1 1 2 1 2 3 1 2 1 3 3 5 0 3 2 6 1 4 4 5 Figure 2.7: Les deux it´ erations suivantes. ` a l?int´ erieur de ce sommet si elle est finie. L?´ evolution compl` ete de l?ensemble O, du sommet s´ electionn´ e x et de la fonction ? est donn´ ee dans le tableau ci-dessous Version 6 f´ evrier 2005 7.2. Chemins de co? ut minimum 229 (la derni` ere colonne est le co? ut minimum l(0, x) de l?origine 0 au sommet x) : O x ? {0} 0 ?(0) = 0 0 {1, 2, 3, 4} 1 ?(1) = 1, ?(2) = 1, ?(3) = 3, ?(4) = 2 1 {2, 3, 4, 8} 2 ?(4) = 2, ?(2) = 1, ?(3) = 3, ?(8) = 6 1 {3, 4, 8, 5, 6, 9} 4 ?(4) = 2, ?(8) = 6, ?(3) = 3, ?(5) = 4, ?(6) = 4, ?(9) = 5 2 {3, 8, 5, 6, 9, 7} 3 ?(7) = 7, ?(8) = 6, ?(3) = 3, ?(5) = 4, ?(6) = 4, ?(9) = 5 3 {8, 5, 6, 9, 7} 5 ?(7) = 7, ?(8) = 6, ?(5) = 4, ?(6) = 4, ?(9) = 5 4 {8, 6, 9, 7} 6 ?(7) = 6, ?(8) = 5, ?(6) = 4, ?(9) = 5 4 {8, 9, 7} 8 ?(7) = 6, ?(8) = 5, ?(9) = 5 5 {9, 7} 9 ?(7) = 6, ?(9) = 5 5 {7} 7 ?(7) = 6 6 Proposition 2.9. L?algorithme de Dijkstra d´ etermine les chemins de co? ut mi- nimum du couple (G, s) en temps O(m log n). Preuve. Si nous appelons bordure de F l?ensemble not´ e B(F) des sommets (n´ eces- sairement ouverts) de S ? F qui poss` edent au moins un pr´ ed´ ecesseur dans F, et si nous associons ` a chaque ´ el´ ement x de B(F) une priorit´ e ´ egale ` a son ´ evaluation ?(x), nous constatons qu?` a chaque it´ eration de l?algorithme, il faut essentielle- ment d´ eterminer un ´ el´ ement z de B(F) de priorit´ e minimale, supprimer z de B(F), ins´ erer dans B(F) les successeurs de z qui ne lui appartiennent pas d´ ej` a et modifier ´ eventuellement la priorit´ e des successeurs de z qui appartiennent ` a B(F). La gestion de B(F) par un tas, tout ` a fait analogue ` a celle ´ etudi´ ee pour impl´ ementer l?algorithme de Prim, d´ emontre la proposition. 7.2.7 Algorithme A? . Nous pr´ esentons dans ce paragraphe une variante de l?algorithme de Dijkstra adapt´ ee au cas o` u il s?agit de d´ eterminer dans un graphe dont les arcs sont valu´ es par des co? uts positifs ou nuls un chemin de co? ut minimum entre un sommet origine s et un sommet destination p.On suppose que l?on dispose initialement pour chaque sommet x d?une ´ evaluation par d´ efaut not´ ee h(x) du co? ut minimum l(x, p) d?un chemin de x ` a p. L?id´ ee fondamentale de l?algorithme A? est alors d?associer ` a chaque sommet x une approximation de l(s, p), not´ ee f(x), qui tient compte de la cible p par le biais de l?´ evaluation par d´ efaut h(x) et d?examiner en priorit´ e un sommet ouvert d?approximation minimale. La proc´ edure A*(G, s, p, h) ci-dessous d´ ecrit cet algorithme. Version 6 f´ evrier 2005 230 Chapitre 7. Graphes valu´ es proc´ edure A*(G, s, p, h); Init(G, s); f(s) = h(s); O := {s}; x := s; tantque x = p faire Examiner*(x); x := sommet ouvert d?approximation f(x) minimale fintantque. La proc´ edure Examiner*(x) ne se distingue de la proc´ edure Examiner(x) que par la mise ` a jour de l?approximation des nouveaux sommets ouverts. proc´ edure Examiner*(x); pour tout successeur y de x faire si ?(x) + c(x, y) < ?(y) alors Ajuster-arborescence( x, y); ouvrir(y); f(y) := ?(y) + h(y) finsi finpour; Fermer(x). Le tableau suivant montre l?´ evolution de l?ensemble des sommets ouverts sur le graphe valu´ e de la figure 2.8 pour lequel s = 1 et p = 7. Sur cette figure, l?´ evaluation par d´ efaut initiale et les valeurs successives de l?approximation sont inscrites ` a c? ot´ e de chaque sommet. k 1 2 3 4 5 6 7 O {1} {2, 3, 4} {2, 4, 6} {3, 4, 6} {4, 6} {4, 7} ? La validit´ e de l?algorithme A? repose sur le fait que l?approximation du sommet s=1 2 3 4 6 5 7 0 2 5 1 1 3 5 6 0 4 3,5,4 4,7,6 0,8 5,10 6 0 sommets examinés: 1,3,2,3,6,7 Figure 2.8: Un graphe valu´ e et la fonction h. examin´ e ` a chaque it´ eration est une ´ evaluation par d´ efaut de l(s, p). Lorsque le sommet p lui-m? eme est examin´ e, son approximation vaut f(p) = ?(p) et est donc ´ egale ` a l(s, p). Version 6 f´ evrier 2005 7.2. Chemins de co? ut minimum 231 Proposition 2.10. Lors de chaque it´ eration, l?approximation f(x) du sommet examin´ e est une ´ evaluation par d´ efaut de l(s, p). Preuve. Soit ? = (x0, . . . , xr) un chemin de co? ut minimum de s ` a p. Nous mon- trons d?abord par induction qu?` a l?issue de chaque it´ eration, il existe un entier k tel que : a) tout sommet xi du sous-chemin (x0, . . . , xk) est ferm´ e et satisfait ?(xi) = l(s, xi); b) le sommet xk+1 est ouvert et satisfait ?(xk+1 = l(s, xk+1). Remarquons d?abord que le sommet s = x0 reste ferm´ e car tout circuit passant par s est de co? ut positif ou nul. Il en r´ esulte que l?invariant est vrai ` a l?issue de la premi` ere it´ eration. Soit maintenant z le sommet examin´ e lors de l?it´ eration i, et k l?entier associ´ e par l?invariant ` a l?issue de l?it´ eration i ? 1. Tout sommet xi du sous-chemin (x0, . . . , xk) reste ferm´ e puisque ?(xi) = l(s, xi). Si z = xk+1, le sommet xk+1 reste ouvert et l?invariant est vrai pour l?entier k ` a l?issue de l?it´ eration i. Si z = xk+1, le sommet xk+1 devient ferm´ e. Consid´ erons alors le sous-chemin (xk+1, . . . , xr) ` a l?issue de l?it´ eration en cours. Ses sommets n?´ etant pas tous ferm´ es puisque xr est ouvert, notons xj son premier sommet ouvert. Tous les sommets xi de (xk+1, . . . , xj?1) sont ferm´ es et v´ erifient par d´ efinition ?(xi) = l(s, xi). On a ´ egalement ?(xj) = l(s, xj) puisque le sommet xj?1 a ´ et´ e examin´ e. L?invariant est donc vrai pour l?entier j ? 1. L?invariant est donc conserv´ e. Consid´ erons alors le sommet xk+1 o` u k est l?entier associ´ e par l?invariant ` a l?it´ eration en cours. On a : f(xk+1) = ?(xk+1 + h(xk+1) = l(s, xk+1) + h(xk+1) ? l(s, p). Le sommet x examin´ e ´ etant un sommet ouvert d?approximation minimale, il satisfait aussi f(x) ? l(s, p). La proposition pr´ ec´ edente nous permet de conclure que l?algorithme A*(G, s, p, h) converge vers la solution. En effet, sa terminaison est assur´ ee puisque son principe est l?it´ eration de Ford et qu?il n?existe pas de circuits absorbants. De plus lorsque le sommet ouvert p est examin´ e, son approximation f(p) satisfait l(s, p) ? f(p) = ?(p) ? l(s, p). L?algorithme A? ne diff` ere de l?algorithme de Dijkstra que par le choix du sommet ouvert ` a examiner. En particulier si la fonction d?´ evalution par d´ efaut h est nulle en tout sommet, les deux algorithmes sont identiques. De mani` ere plus fine, on peut montrer que si la fonction h satisfait l?hypoth` ese de consistance : ?x, y ? S, h(x) ? l(s, y) + h(y) alors comme dans l?algorithme de Dijkstra, le nouveau sommet examin´ e est celui d?´ evaluation minimale et donc restera ferm´ e. Version 6 f´ evrier 2005 232 Chapitre 7. Graphes valu´ es L?algorithme A? peut ? etre efficace dans le cas de graphes de grande taille d´ efinis de mani` ere implicite pour lesquels on dispose d?une bonne fonction d?´ evaluation par d´ efaut. En effet, dans ce cas, certains sommets ouverts dont l?approximation est de valeur ´ elev´ ee n?auront pas ´ et´ e examin´ es lors de la terminaison de l?algorithme. 7.2.8 Algorithme paps Nous pr´ esentons dans ce paragraphe un algorithme pour le cas o` u les co? uts sont des nombres r´ eels quelconques. Sa particularit´ e essentielle est d?examiner le som- met ouvert le plus ancien. Cet algorithme fournit bien entendu la solution du probl` eme en l?absence de circuits absorbants mais permet ´ egalement de d´ eceler la pr´ esence d?un tel circuit lorsque le probl` eme n?a pas de solution. L?ensemble des sommets ouverts est g´ er´ e dans l?ordre premier arriv´ e premier servi au moyen d?une file. La proc´ edure g´ en´ erale paps(G, s) dans laquelle la file est not´ ee ? impl´ emente cet algorithme. proc´ edure paps(G, s); Init(G, s); filevide(?); enfiler(s, ?); n(?) := 1; k := 0; tantque ? n?est pas vide et k ? n ? 1 faire ´ etape; k := k + 1 fintantque; si ? n?est pas vide alors afficher circuit absorbant . La proc´ edure ´ etape consiste ` a examiner tous les sommets pr´ esents dans la file ` a l?issue de l?´ etape pr´ ec´ edente. On suppose que le nombre d?´ el´ ements dans la file, not´ e n(?) est maintenu lors de chaque mise ` a jour. proc´ edure ´ etape; pour j de 1 ` a n(?) faire x :=d´ efiler(?); Examiner(x) finpour. Le tableau suivant montre l?´ evolution de l?ensemble des sommets ouverts pour le graphe valu´ e de la figure 2.9. Sur cette figure, les ´ evaluations successives d?un sommet sont inscrites ` a cot´ e de ce sommet. k 1 2 3 4 5 6 O {0} {1, 2, 3} {5, 1, 6, 4} {6, 5, 3} {6} ? Version 6 f´ evrier 2005 7.2. Chemins de co? ut minimum 233 3,2,1 1,0 s=0 1 2 3 4 5 6 1 2 1 1 0 -1 2 0 -1 1 2 0 1,0 3,2 2,1 0 1 Figure 2.9: Les ´ evaluations de l?algorithme paps. Pour analyser l?algorithme paps(G, s), nous allons consid´ erer l?ensemble not´ e Ok des sommets ouverts au d´ ebut de l?´ etape k. Nous notons alors Ck(x) l?ensemble (fini) des chemins de s ` a x de longueur inf´ erieure ou ´ egale ` a k et ?k(x) le co? ut minimum d?un chemin de Ck(x) (par convention ?k(x) = +? si Ck(x) est vide). L?invariant suivant est alors conserv´ e : Th´ eor` eme 2.11. Au d´ ebut de l?´ etape k, l?´ evaluation ?(x) d?un sommet x est ´ egale au co? ut minimum d?un chemin de Ck(x). Un sommet x est ouvert si et seulement si tout chemin de co? ut minimum de Ck(x) poss` ede exactement k arcs. Preuve. (Induction sur k.) La proposition est vraie par d´ efinition pour k = 0. Soit alors x un sommet tel que Ck+1(x) ne soit pas vide. Au d´ ebut de l?´ etape k + 1, on a : ?k+1(x) = min{?k(x), min{?k(y) + c(y, x)|y ? Ok ? ?? (x)}}. S?il existe un chemin de longueur inf´ erieure ou ´ egale ` a k de co? ut minimum dans Ck+1(x), on a d?apr` es l?induction ?k+1(x) = ?k(x) = ?k+1(x). Supposons main- tenant que tout chemin de co? ut minimum dans Ck+1(x) soit de longueur k + 1. Soit ? un tel chemin et (y, x) le dernier arc de ?. Tout chemin de co? ut mini- mum de Ck(y) est de longueur k, donc d?apr` es l?induction y ? Ok ? ?? (x) et ?k+1(x) = ?k+1(x). Enfin si Ck+1(x) = ? alors ?k+1(x) = ?k+1(x) = +?. Un sommet x appartient ` a Ok+1 si ?k+1(x) < ?k(x). Soit alors ? un chemin de co? ut minimum dans Ck+1(x). Si ? est de longueur inf´ erieure ou ´ egale ` a k, nous avons ?k(x) ? c(?) = ?k+1(x). Il en r´ esulte que tout chemin de co? ut minimum dans Ck+1(x) est de longueur k + 1. R´ eciproquement, si tout chemin de co? ut minimum de Ck+1(x) est de longeur k + 1, alors, d?apr` es l?induction, on a ?k+1(x) < ?k(x) et x est bien un sommet ouvert au d´ ebut de l?´ etape k + 1 (c?est-` a-dire x ? Ok+1). Nous consid´ erons maintenant le cas o` u l?on ne sait pas a priori si le graphe valu´ e (G, c) contient ou non un circuit absorbant. La proposition suivante permet alors de d´ eceler l?existence ´ eventuelle d?un tel circuit. Version 6 f´ evrier 2005 234 Chapitre 7. Graphes valu´ es Proposition 2.12. Si au d´ ebut de l?´ etape n, l?ensemble des sommets ouverts n?est pas vide, le graphe valu´ e (G, c) poss` ede un circuit absorbant. Preuve. D?apr` es le th´ eor` eme pr´ ec´ edent, On est l?ensemble des sommets x pour lesquels tout chemin de co? ut minimum de Cn(x) poss` ede exactement n arcs. Si le graphe valu´ e (G, c) ne poss´ edait pas de circuit absorbant, il existerait un chemin ´ el´ ementaire de co? ut minimum de s ` a x et donc de co? ut minimum dans Cn(x). Le tableau suivant montre l?´ evolution de l?ensemble des sommets ouverts pour le graphe valu´ e de la 2.10. Le circuit (3, 2, 4, 3) est absorbant. k 0 1 2 3 4 5 6 7 O {0} {1, 2, 3} {5, 1, 6, 4} {6, 5, 3} {2, 6} {1, 4} {3, 5} {2, 6} La complexit´ e d?une ´ etape quelconque de l?algorithme Paps(G, s) est en O(m) 0 1,0 1,0,-1 3,2,1 3,2,1 2,-1,-2 1,0 s=0 1 2 3 4 5 6 1 2 1 1 -1 2 0 -1 1 2 0 -2 Figure 2.10: L?algorithme paps avec un circuit absorbant. puisque un sommet est examin´ e au plus une fois. Comme l?algorithme ex´ ecute au maximum n ´ etapes, sa complexit´ e est O(mn). Notes La pr´ esentation unifi´ ee des algorithmes concernant les arbres couvrants de co? ut minimum par l?emploi de la r` egle des cocycles et de la r` egle des cycles est due ` a R.E. Tarjan. Il en est de m? eme de la pr´ esentation des algorithmes de recherche des chemins de co? ut minimum en tant que variantes de l?algorithme g´ en´ erique de Ford : R.E. Tarjan, Data Structures and Network Algorithms, SIAM Philadelphia, 1983, chapitres 6 et 7, 71?95. Les algorithmes sur les arbres couvrant de co? ut minimum sont assez anciens. Par contre leur complexit´ e a plus r´ ecemment ´ et´ e am´ elior´ ee par l?utilisation de structures de donn´ ees adapt´ ees comme la gestion des partitions d?un ensemble pour l?algorithme de Kruskal et les files de priorit´ e pour l?algorithme de Prim. Version 6 f´ evrier 2005 Exercices 235 Si l?on restreint l?ensemble des arbres couvrants admissibles en ajoutant des con- traintes suppl´ ementaires, le probl` eme devient en g´ en´ eral beaucoup plus difficile. Si, par exemple, on limite le degr´ e des sommets, le probl` eme est alors NP-difficile sauf si le degr´ e d?un seul sommet est limit´ e. Les algorithmes de recherche de chemins de co? ut minimum ont ´ et´ e tr` es ´ etudi´ es. Ils interviennent en effet de mani` ere centrale dans beaucoup d?autres domaines comme les flots ou les ordonnancements. Ajouter des contraintes au probl` eme de base le rend souvent beaucoup plus complexe. Par exemple, rechercher un chemin ´ el´ ementaire de co? ut minimum entre deux sommets d?un graphe valu´ e quelconque est un probl` eme NP-difficile. Exercices 7.1. Soit G = (S, A) un graphe non orient´ e connexe valu´ e par une fonction co? ut c : A ? R. Soit H = (S, B) un graphe partiel non connexe de G. On appelle ar? ete de liaison entre deux composantes connexes C et C de H un ar? ete qui a l?une de ses extr´ emit´ es dans C et l?autre dans C . Soit C une composante connexe de H, ?(C) le cocycle associ´ e ` a C et e une ar? ete de co? ut minimal de ?(C). a) D´ emontrer qu?il existe un arbre couvrant de co? ut minimum de G qui contient e. On consid` ere l?algorithme de Sollin d´ ecrit par la proc´ edure ci-dessous : proc´ edure Sollin(G, c); H := (S, ?); tantque H n?est pas connexe faire soient C1, . . . , Cp les composantes connexes de H ; {les Ck ne sont pas marqu´ ees au d´ epart}; tantqu?il existe une composante connexe Ck non marqu´ ee faire marquer(Ck); soit e = {x, y} une ar? ete de co? ut minimum dans ?(Ck); {x est l?extr´ emit´ e de e qui appartient ` a Ck} soit Cl la composante connexe contenant y; marquer(Cl); ajouter l?ar? ete e ` a H fintantque fintantque. b) D´ emontrer que l?algorithme pr´ ec´ edent applique la r` egle des cocycles ` a chaque it´ eration de la boucle tantque interne. c) En d´ eduire que lors de la terminaison, H est un arbre couvrant de co? ut mini- mum. 7.2. Soit G = (S, A) un graphe orient´ e complet ` a n sommets et valu´ e par une fonction co? ut c : A ? N telle que : Version 6 f´ evrier 2005 236 Chapitre 7. Graphes valu´ es 1. ?x, y ? S, c(x, y) = c(y, x); 2. ?x, y, z ? S, c(x, y) + c(y, z) ? c(x, z). Un tour t = (t1, . . . , tn) de G est une permutation de S et le co? ut c(t) du tour t est la somme : c(tn, t1) + n?1 k=1 c(tk, tk+1). On note G la version non orient´ ee de G o` u le co? ut c (x, y) de l?ar? ete {x, y} est ´ egal ` a c(x, y). Soient H un arbre couvrant de co? ut minimum de G , P = (p1, . . . , pn) un parcours en profondeur de G ` a partir du sommet s et t le tour de G associ´ e ` a P . On note c (H) le co? ut de l?arbre H et c? (G) le co? ut minimum d?un tour de G. a) D´ emontrer que c? (G) > c (H). b) D´ emontrer que c(t) ? 2c (H). c) Obtient-on le m? eme r´ esultat avec un parcours en largeur de H ? 7.3. On consid` ere le probl` eme de transport monoproduit d´ efini par m four- nisseurs Fi et n clients Cj. Le fournisseur Fi dispose d?un stock ai ? N, le client Cj a une demande bj ? N et l?on suppose que ai = bj. Le co? ut unitaire de transport du fournisseur Fi au client Cj est un entier naturel cij. Le graphe valu´ e G associ´ e au probl` eme a pour sommets les m fournisseurs et les n clients et ses arcs sont les couples (Fi, Cj) valu´ es par cij. Un plan de transport X = (xij) est une solution du syst` eme : j?{1,...,n} xij = ai i ? {1, . . . , m} i?{1,...,m} xij = bj j ? {1, . . . , n} xij ? 0 i ? {1, . . . , m} j ? {1, . . . , n} et le co? ut c(X) du plan X est i?{1,...,m},j?{1,...,n} cijxij. La matrice du syst` eme est not´ ee M. a) D´ emontrer qu?il existe un plan de transport optimal entier. b) D´ emontrer que le rang de M est m + n ? 1. On appelle solution de base un ensemble de m + n ? 1 colonnes ind´ ependantes de M. c) Montrer que le graphe partiel des arcs (Fi, Cj) associ´ es ` a ces colonnes est un arbre couvrant de G. La r´ eciproque est-elle vraie? Soit H un arbre couvrant de co? ut minimum de G. Soit B(H) la solution de base associ´ ee ` a H (si elle existe). d) Montrer qu?il existe un seul plan de transport tel que xij = 0 pour (Fi, Cj) ? B(H). Montrer que ce plan n?est pas n´ ecessairement optimal. 7.4. D´ eterminer un graphe valu´ e ` a m arcs muni d?un sommet origine s tel que l?algorithme g´ en´ erique de Ford r´ ealise dans le plus mauvais cas O(2m ) it´ erations. Version 6 f´ evrier 2005 Exercices 237 7.5. Soit G = (S, A) un graphe, soit s un sommet origine et soit c : A ? N une fonction capacit´ e. La capacit´ e d?un chemin est la plus petite capacit´ e des arcs de ce chemin. Adapter l?algorithme de Dijkstra ` a la recherche des chemins de capacit´ e maximale de s ` a tous les autres sommets de G. 7.6. On consid` ere l?algorithme A? pr´ esent´ e dans la section 7.2.6. D´ emontrer que si la fonction d?´ evaluation par d´ efaut h satisfait : ?(x, y) ? A, h(x) ? c(x, y) + h(y), un sommet examin´ e restera ferm´ e jusqu?` a la terminaison de l?algorithme. 7.7. On consid` ere l?algorithme g´ en´ erique de Ford et l?on note E l?ensemble des sommets examin´ es. D´ emontrer que les invariants suivants sont conserv´ es ` a chaque it´ eration : si ?(x) est fini, il existe un chemin ´ el´ ementaire de s ` a x de co? ut ?(x); la restriction de la fonction p` ere aux sommets de E est une arborescence partielle du sous-graphe de G induit par E telle que pour tout sommet y de E distinct de la racine ?(p(y)) + c(p(y), y) = ?(y). 7.8. On appelle graphe conjonctif un graphe orient´ e G = (S, A) valu´ e par c : A ? R, muni d?une racine ? et d?une anti-racine ?, et tel qu?il existe pour tout sommet x un chemin positif ou nul de ? ` a x et de x ` a ?. Un ensemble de potentiels d?un graphe conjonctif G est une application t : S ? R satisfaisant t(?) = 0 et : ?(x, y) ? A, t(y) ? t(x) ? c(x, y) On note T(G) l?ensemble des ensembles de potentiels de G. a) D´ emontrer que T(G) est non vide si et seulement si G ne poss` ede pas de circuit strictement positif. On suppose maintenant que T(G) n?est pas vide et l?on note r(x) le co? ut maximum d?un chemin de ? ` a x. b) D´ emontrer que r est le plus petit ´ el´ ement de T(G) pour la relation d?ordre : t ? t ?? ?x ? S, t(x) ? t (x). On consid` ere l?ensemble D(G) des ensembles de potentiels tels que t(?) = r(?). c) D´ emontrer que la fonction f d´ efinie par f(x) = r(?) ? C(x, ?) o` u C(x, ?) est le co? ut maximum d?un chemin de x ` a ? est le plus grand ´ el´ ement de D(G). 7.9. Soit G = (S, A) un graphe orient´ e valu´ e par c : A ? Q. On note S = {1, . . . , n}, Sk = {1, . . . , k}, Gk le graphe induit par Sk et l?on suppose que s = 1 est un sommet origine pour tous les sous-graphes Gk. On note enfin ?k(i) la valeur minimale d?un chemin de 1 ` a i dans Gk passant au plus une fois par le sommet k. On consid` ere alors l?algorithme de Rao d´ ecrit ci-dessous : Version 6 f´ evrier 2005 238 Chapitre 7. Graphes valu´ es proc´ edure Rao(G, c); (1) k := 1; R := ?; abs := 0; (2) si c(1, 1) < 0 alors abs := 1 (3) sinon (4) tantque abs = 0 et k ? n faire (5) k := k + 1; R := R ? {k}; T := {k}; (6) ?k(k) := min{?k?1(j) + cjk | j ? ?? Gk (k)}; (7) tantque abs = 0 et T = R faire (8) U(T) := ?+ Gk (T); (9) si U(T) = ? alors (10) calculer dpq = min{dij | (i, j) ? U(T)} {o` u dij = ?k(i) + c(i, j) ? ?k?1(j)} (11) finsi; (12) si U(T) = ? ou dpq > 0 alors (13) pour tout i dans R ? T faire (14) ?k(i) := ?k?1(i); T := T ? {k} (15) finpour (16) sinon (17) ?k(q) := ?k(p) + c(p, q); T := T ? {q}; (18) si (q, k) ? A et ?k(q) ? ?k(k) + c(q, k) < 0 alors (19) afficher( circuit absorbant );abs := 1 (20) finsi (21) finsi (22) fintantque (23) fintantque (24) finsi. a) D´ emontrer que la valeur de ?k(k) calcul´ ee ` a la ligne (6) est bien le co? ut mini- mum d?un chemin de 1 ` a k dans Gk passant au plus une fois par k. b) D´ emontrer que si U(T) est vide ou si dpq est positif ou nul, le co? ut minimum d?un chemin de 1 ` a i dans Gk passant au plus une fois par k est ?k?1(i). c) D´ emontrer que si dpq est strictement n´ egatif, alors ?k(p) + c(p, q) est le co? ut minimum d?un chemin de 1 ` a q dans Gk passant au plus une fois par k. d) En d´ eduire que l?algorithme Rao d´ etermine les chemins de co? ut minimum de 1 ` a tous les autres sommets de G ou d´ etecte la pr´ esence d?un circuit absorbant. Version 6 f´ evrier 2005 239 Chapitre 8 Flots Dans ce chapitre nous d´ efinissons d?abord la notion de flot compatible et donnons la condition d?existence d?un tel flot. Nous pr´ esentons ensuite les propri´ et´ es qui interviennent de mani` ere cruciale dans la conception des algorithmes sur les flots, ` a savoir la d´ ecomposition en cycles, l?absence de cycles am´ eliorants dans un flot de co? ut minimum et la dominance des flots entiers. Nous d´ efinissons ensuite le probl` eme du flot maximum d?une source vers un puits. Apr` es avoir d´ efini la notion de graphe d?´ ecart et d´ emontr´ e le th´ eor` eme de Ford et Fulkerson, nous analysons les algorithmes les plus performants pour ce probl` eme, ` a savoir l?algorithme pri- mal des distances estim´ ees au puits et l?algorithme dual du pr´ eflot. Deux vari- antes efficaces de l?algorithme du pr´ eflot sont d´ ecrites, l?algorithme de Karzanov et l?algorithme des exc` es ´ echelonn´ es. Nous consid´ erons ensuite le probl` eme du flot de co? ut minimum. Nous d´ efinissons le probl` eme dual et donnons la condition n´ ecessaire et suffisante d?optimalit´ e d?un flot et d?un ensemble de potentiels, ex- prim´ ee avec les co? uts r´ eduits des arcs du graphe d?´ ecart. Nous pr´ esentons alors un algorithme primal d? u ` a Goldberg et Tarjan fond´ e sur la notion d? -optimalit´ e et sur les circuits de co? ut moyen minimum. Nous montrons ensuite comment trans- former un probl` eme de flot compatible de co? ut minimum en probl` eme de flot ma- ximum de co? ut minimum et nous pr´ esentons un algorithme dual pour r´ esoudre ce dernier probl` eme. Nous pr´ esentons enfin l?algorithme efficace d?Edmonds et Karp pour la recherche d?un plan de transport de co? ut minimum. Introduction La notion de flot mod´ elise de mani` ere naturelle une circulation discr` ete (voitures, ´ electrons,...) ou continue (fluide,...), le long des arcs d?un graphe orient´ e. Cette circulation est soumise ` a des contraintes d?´ equilibre de charge aux sommets du graphe et de limitation de capacit´ e sur les arcs. De nombreux probl` emes d?optimisation se ram` enent ` a la recherche de flots particuliers sur un graphe, les Version 6 f´ evrier 2005 240 Chapitre 8. Flots plus connus sont les probl` emes de transport (par exemple entre des fournisseurs et des clients), les probl` emes de couplage et d?affectation (par exemple de t? aches ` a des machines) ou encore les probl` emes de chemins de co? ut minimum. Mais ce mod` ele intervient aussi souvent dans d?autres domaines comme la r´ esolution de certains probl` emes d?ordonnancement, le placement de t? aches ou encore la ma- ximisation de certaines fonctions bool´ eennes. La th´ eorie des flots occupe une place tr` es int´ eressante en optimisation combinatoire car elle se situe ` a la fronti` ere de la programmation lin´ eaire continue et de la programmation en nombres entiers. En effet, les probl` emes de flot que nous ´ etudierons peuvent ? etre formul´ es comme des programmes lin´ eaires continus mais la matrice sous-jacente est telle que les solutions enti` eres sont dominantes. 8.1 Pr´ eliminaires Dans tout le chapitre, les graphes consid´ er´ es sont orient´ es mais ne sont pas n´ ecessairement simples, c?est-` a-dire que des arcs distincts peuvent avoir la m? eme origine et la m? eme extr´ emit´ e. Soit u un arc d?un graphe G = (S, A), il sera commode de noter u? son sommet origine et u+ son sommet extr´ emit´ e. Soit E un ensemble fini. L?ensemble des fonctions de E dans Z est not´ e F(E). Le produit scalaire de deux ´ el´ ements f et g de F(E) est par d´ efinition le nombre f g = e?E f(e)g(e). L?ordre partiel sur F(E) d´ efini par ?e ? E, f(e) ? g(e) est not´ e f ? g. La relation f < g est d´ efinie par f ? g et f = g. La fonction caract´ eristique d?un sous-ensemble F de E est not´ ee ?F . Soient G = (S, A) un graphe et T un sous-ensemble de sommets. L?ensemble ?? (T) des arcs entrants dans T et l?ensemble ?+ (T) des arcs sortants de T sont d´ efinis par : ?? (T) = {u ? A | u? ? S ? T, u+ ? T} ?+ (T) = {u ? A | u? ? T, u+ ? S ? T}. Soient f une fonction de F(A) et T un sous-ensemble de sommets, les nombres f ???(T ) et f ??+(T ) sont not´ es respectivement f? (T) et f+ (T). L?exc` es de la fonction f pour la partie T est d´ efini par ef (T) = f? (T) ? f+ (T). Lorsque T est le singleton {s}, les notations pr´ ec´ edentes sont simplifi´ ees en f? (s), f+ (s) et ef (s). Remarquons que pour toute fonction f de F(A), l?exc` es de S est nul et que l?exc` es d?une partie non vide T de S est ´ egal ` a la somme des exc` es des sommets de T, c?est-` a-dire ef (T) = f? (T) ? f+ (T) = s?T ef (s). Comme la notion de cha? ?ne n?a ´ et´ e introduite que pour les graphes non orient´ es (voir section 4.1.3), nous en d´ efinissons ici une extension pour les graphes orient´ es. Version 6 f´ evrier 2005 8.2. Flots d?un r´ eseau 241 Une cha? ?ne ? du graphe G = (S, A) est une suite : ? = ((s0, u1, s1), (s1, u2, s2), · · · , (sq?1, uq, sq)) telle que pour tout i ? {1, . . . , q} les deux extr´ emit´ es de l?arc ui sont si?1 et si. Une cha? ?ne est ´ el´ ementaire si tous les sommets si pour i ? {0, . . . , q} sont distincts. Un arc ui de la cha? ?ne ? est dit avant si u? i = si?1 et u+ i = si, dans le cas contraire il est dit arri` ere. Un cycle ´ el´ ementaire est une cha? ?ne telle que tous les sommets si, i ? {0, . . . , q ? 1} sont distincts et s0 = sq. Sur la figure 1.1 sont repr´ esent´ es ` a gauche une cha? ?ne ´ el´ ementaire [(1, a, 2), (2, b, 3), (3, c, 4), (4, d, 5)] et ` a droite un cycle ´ el´ ementaire [(1, a, 2), (2, b, 3), (3, c, 4), (4, d, 5), (5, e, 6), (6, f, 1)]. 1 2 3 4 5 a b c d e f g a f e d c b 2 3 4 5 6 1 Figure 1.1: Cha? ?ne et cycle ´ el´ ementaires. 8.2 Flots d?un r´ eseau Un r´ eseau R = (G, a, b) est un graphe connexe sans boucles G = (S, A), muni de deux fonctions a et b de F(A) v´ erifiant a ? b. Les entiers a(u) et b(u) sont respectivement appel´ es capacit´ e minimale et capacit´ e maximale de l?arc u. Un r´ eseau valu´ e R = (G, a, b, c) est un r´ eseau (G, a, b) muni d?une fonction c de F(A). Le nombre c(u) est appel´ e co? ut de l?arc u. Un flot f du r´ eseau R = (G, a, b) est une fonction f : A ? Q v´ erifiant la condition d?´ equilibre (E) ci-dessous : ?s ? S ef (s) = 0 (E) Un flot compatible est un flot qui v´ erifie ´ egalement les conditions de limitation de capacit´ e (L) suivantes : a ? f ? b (L) Remarque. Le choix de flux rationnels (nous aurions pu ´ egalement consid´ erer des flux r´ eels) a ´ et´ e fait pour mieux mettre en ´ evidence par la suite la propri´ et´ e de dominance des flots entiers vis-` a-vis du crit` ere co? ut. Version 6 f´ evrier 2005 242 Chapitre 8. Flots Soient f un flot du r´ eseau R et T un sous-ensemble de sommets. Le nombre f(u) est appel´ e flux de l?arc u, les quantit´ es f? (T) et f+ (T) sont appel´ ees respective- ment flux entrant dans T et flux sortant de T. Remarquons que si la condition d?´ equilibre est satisfaite en tout sommet, elle est ´ egalement v´ erifi´ ee pour toute partie non vide T de sommets : ef (T) = f? (T) ? f+ T) = 0. Le co? ut du flot f d?un r´ eseau valu´ e est par d´ efinition le nombre f c. Les diverses quantit´ es introduites jusqu?ici s?expriment facilement en utilisant la matrice M d?incidence sommets-arcs du graphe G. La ligne du sommet s repr´ esente la fonction ??+(s) ????(s). Un flot compatible d?un r´ eseau R = (G, a, b) ` a m arcs est donc un vecteur f de Qm satisfaisant : Mf = 0 et a ? f ? b. Un flot compatible de co? ut minimum du r´ eseau valu´ e R = (G, a, b, c) est une solution optimale du programme lin´ eaire : f ? b ?f ? ?a Mf = 0 MIN u?A f(u)c(u) o` u les variables f(u), u ? A sont rationnelles. L?ensemble des flots d?un r´ eseau constitue un espace vectoriel sur Q. Soient f et g deux flots et ? et ? deux nombres rationnels; si a ? ?f + ?g ? b alors ?f + ?g est un flot compatible du r´ eseau. 8.2.1 Existence d?un flot compatible de co? ut minimum Les contraintes impos´ ees par les limitations de capacit´ e rendent la question de l?existence d?un flot compatible dans un r´ eseau R = (G, a, b) non triviale. Une condition n´ ecessaire et suffisante d?existence due ` a Hoffman exprime simplement que pour tout sous-ensemble non vide T de sommets, le flux entrant minimal a? (T) doit ? etre inf´ erieur ou ´ egal au flux sortant maximal b+ (T). Cette condition de consistance, not´ ee (C), s?exprime par : ?T ? S, a? (T) ? b+ (T). (C) Soient R = (G, a, b) un r´ eseau et g un flot de ce r´ eseau. La distance ?g(u) de g(u) ` a l?intervalle [a(u), b(u)] ´ etant d´ efinie par : ?g(u) = ? ? ? g(u) ? b(u) si g(u) > b(u) a(u) ? g(u) si g(u) < a(u) 0 si a(u) ? g(u) ? b(u) Version 6 f´ evrier 2005 8.2. Flots d?un r´ eseau 243 l?incompatibilit´ e du flot g est mesur´ ee par i(g) = ?g ?A. Le lemme 2.1 mon- tre que si la condition de compatibilit´ e est satisfaite, il existe un flot h dont l?incompatibilit´ e est strictement plus petite que celle de g. Lemme 2.1. Soit g un flot entier tel que i(g) > 0. Si le r´ eseau est consistant, il existe un flot h tel que i(h) < i(g). Preuve. Si i(g) est strictement positif, il existe un arc v v´ erifiant par exemple g(v) > b(v). On notera respectivement x et y l?origine et l?extr´ emit´ e de v. Notons H = (S, B) le graphe dont les arcs sont color´ es en rouge ou en noir par la proc´ edure colorer ci-dessous : proc´ edure colorer(G, a, b, v); pour tout arc u de G faire si g(u) > a(u) alors cr´ eer un arc rouge u d?origine u? et d?extr´ emit´ e u+ dans H ; si g(u) < b(u) alors cr´ eer un arc noir u d?origine u+ et d?extr´ emit´ e u? dans H. La figure 2.1 montre le graphe H correspondant ` a un flot nul et ` a l?arc v = (4, 1). Soit T l?ensemble des sommets accessibles ` a partir de y dans H et supposons que T -3,0,2 1,0,3 -1,0,1 -3,0,2 6 1 2 5 4 3 -2,0,0 2,0,4 2,0,4 -3,0,-2 -2,0,1 Sur l' arc u: a(u),f(u),b(u) flot initial: f=0. i(f)=7 6 5 1 2 4 3 arcs "rouges" en gras chemin améliorant: (1,2,3,4) 6 1 2 5 4 3 1,0,3 -1,-1,1 -2,-1,0 2,0,4 2,1,4 -3,-1,-2 -2,0,1 nouveau flot g: i(g)=5 Figure 2.1: Am´ elioration de la compatibilit´ e d?un flot. ne contienne pas x. Dans le graphe G, un arc u de ?? (T) satisfait n´ ecessairement g(u) ? b(u) et un arc u de ?+ (T) satisfait n´ ecessairement g(u) ? a(u). De plus l?arc v appartient ` a ?? (T). Il en r´ esulte que : a? (S ? T) = a+ (T) ? g+ (T) = g? (T) > b? (T) = b+ (S ? T). Version 6 f´ evrier 2005 244 Chapitre 8. Flots ce qui contredit la condition de compatibilit´ e. Il existe donc un chemin rouge et noir de y ` a x dans H. Pour tout arc rouge u de ce chemin posons h(u) = g(u)?1, pour tout arc noir u de ce chemin, posons h(u) = g(u) + 1. Posons enfin h(v) = g(v) ? 1 et h(u) = g(u) pour tous les autres arcs de G. La fonction h est un flot du r´ eseau R tel que i(h) ? i(g) ? 1 car on a ?h(v)=?g(v) ? 1 et pour tout arc u de G, ?h(u) ? ?g(u). Pour le flot g de la figure 2.1, le chemin (1, 2, 3, 4) est am´ eliorant et l?incompatibilit´ e diminue de deux unit´ es. Le th´ eor` eme de Hoffman r´ esulte alors directement du lemme 2.1. Th´ eor` eme 2.2 (de Hoffman). Un r´ eseau poss` ede un flot compatible si et seule- ment s?il est consistant. Preuve. La condition est suffisante car ` a partir d?un flot g (par exemple le flot nul), il est possible d?apr` es le lemme 2.1 d?obtenir en au plus i(g) it´ erations un flot compatible. La condition est n´ ecessaire car si f est un flot compatible et T un sous-ensemble de sommets, la sommation des exc` es des sommets de T pour f conduit ` a : 0 = f+ (T) ? f? (T) ? b+ (T) ? a? (T). Si la condition de consistance est satisfaite pour un r´ eseau valu´ e R = (G, a, b, c), nous savons d?apr` es le th´ eor` eme de Hoffman que l?ensemble de ses flots compati- bles n?est pas vide. Cet ensemble form´ e des vecteurs de Qm solutions de Mf = 0 et a ? f ? b, est un poly` edre convexe ferm´ e et born´ e de Qm . Il r´ esulte alors d?un th´ eor` eme important de la programmation lin´ eaire continue que la fonction lin´ eaire f ? f c, o` u f parcourt l?ensemble des flots compatibles de R, atteint son minimum en un point extr? eme du poly` edre. Nous en concluons que la condition de consistance est aussi une condition n´ ecessaire et suffisante d?existence d?un flot compatible de co? ut minimum. Remarque. Dans la suite, tout r´ eseau R = (G, a, b) sera suppos´ e consistant. 8.2.2 Quelques probl` emes particuliers Nous pr´ esentons dans ce paragraphe quelques probl` emes d?optimisation dont les solutions peuvent ? etre interpr´ et´ ees comme les flots de co? ut minimum d?un r´ eseau valu´ e. Probl` emes de transport. Un r´ eseau de transport est d´ efini ` a partir d?un r´ eseau valu´ e R = (G, a, b, c) et d?une fonction d de F(S) v´ erifiant s?S d(s) = 0 appel´ ee fonction d?offre et de demande. La valeur c(u) repr´ esente le co? ut unitaire de transport sur l?arc u. Les sommets sont r´ epartis en trois sous-ensembles, les fournisseurs pour lesquels d(s) > 0, les clients pour lesquels d(s) < 0 et enfin les sommets de transit v´ erifiant Version 6 f´ evrier 2005 8.2. Flots d?un r´ eseau 245 d(s) = 0. Le probl` eme est de trouver un plan de transport de co? ut minimum, c?est-` a-dire une fonction g de F(A) satisfaisant a ? g ? b telle que : eg(s) = ?d(s) si s est un fournisseur d(s) si s est client 0 si s est un sommet de transit et dont le co? ut soit minimum. Le lecteur v´ erifiera ais´ ement ` a partir d?un exemple que les plans de transport sont en bijection avec les flots compatibles d?un r´ eseau valu´ e. La figure 2.2 montre un probl` eme de transport (capacit´ es et co? uts non repr´ esent´ es) et le r´ eseau valu´ e ´ equivalent. Les co? uts d?un plan de transport et de son flot image par la bijection ´ etant ´ egaux, on est ramen´ e ` a la recherche d?un flot compatible de co? ut minimum. 5 d(5)=0 3 d(3)=-1 4 d(4)=-3 d(1)=2 1 2 d(2)=2 s 1 2 3 4 5 (2,2,0) (2,2,0) (1,1,0) (3,3,0) (4,4,0) Réseau valué équivalent p Problème de transport Figure 2.2: Probl` eme de transport et r´ eseau valu´ e ´ equivalent. Chemins de co? ut minimum. Soit G un graphe ` a n sommets dont les arcs sont valu´ es par une fonction co? ut v et soit s une racine de G. On cherche ` a d´ eterminer pour chaque sommet x de G un chemin de co? ut minimum de s ` a x. Posons d(x) = ?1 si le sommet x est distinct de s, d(s) = n ? 1 et pour tout arc u de G, a(u) = 0, b(u) = n, c(u) = v(u). Un plan de transport entier de co? ut minimum du r´ eseau de transport ainsi constitu´ e correspond ` a l?envoi par le fournisseur s d?une unit´ e vers chaque client le long d?un chemin de co? ut minimum. Flot maximum. Soit G un graphe dont deux sommets sont distingu´ es, une source s et un puits p, et dont chaque arc u poss` ede une capacit´ e minimale nulle et une capacit´ e maximale b(u). Le probl` eme du flot maximum de s ` a p est la recherche d?une fonction f, v´ erifiant 0 ? f ? b et ef (x) = 0 pour tout sommet x distinct de la source et du puits, telle que la quantit´ e transport´ ee ef (p) soit maximum. On alloue alors un co? ut nul ` a chaque arc et on cr´ ee un arc de retour d?origine p, d?extr´ emit´ e s, de co? ut ?1 et de capacit´ e maximale b? (p). Maximiser la quantit´ e transport´ ee de s ` a p revient alors ` a trouver un flot compatible de co? ut minimum. Version 6 f´ evrier 2005 246 Chapitre 8. Flots Probl` eme d?affectation. Soient E et F deux ensembles de p ´ el´ ements et c(e, f) le co? ut attach´ e au couple (e, f). Le probl` eme d?affectation de E sur F est la recherche d?une bijection ? : E ? F dont le co? ut total e?E c(e, ?(e)) soit minimum. Soit G le graphe complet biparti (E ? F, E × F). Munissons chaque arc (e, f) d?une capacit´ e minimale nulle, d?une capacit´ e maximale unit´ e et du co? ut c(e, f). Posons pour tout e ? E, d(e) = 1 et pour tout f ? F, d(f) = ?1. Un plan de transport entier de co? ut minimum correspond ` a une affectation optimale. 8.2.3 Trois propri´ et´ es fondamentales L?ensemble des flots d?un r´ eseau poss` ede de nombreuses propri´ et´ es alg´ ebriques. Nous en pr´ esentons trois qui interviennent de mani` ere directe dans les algo- rithmes de recherche de flots optimaux : la d´ ecomposition d?un flot entier en cycles ´ el´ ementaires, une caract´ erisation d?un flot compatible de co? ut minimum et l?existence d?un flot compatible de co? ut minimum dont tous les flux sont entiers. D´ ecomposition en cycles Ce paragraphe concerne une propri´ et´ e g´ en´ erale des flots d?un r´ eseau. Les fonctions capacit´ e minimale et capacit´ e maximale ne jouent aucun r? ole. Flot entier positif ou nul Soient R = (G, a, b) un r´ eseau et f un flot entier strictement positif de ce r´ eseau. Nous montrons l?existence d?un ensemble C(f) de couples (µ, ?(µ)) o` u µ est un circuit ´ el´ ementaire de G et ?(µ) un entier strictement positif, tel que : f = µ?C(f) ?(µ)?µ. Un tel ensemble C(f) est appel´ e d´ ecomposition du flot f sur les circuits de G. La fonction ?µ est appel´ ee par convention flot canonique du circuit µ. Soit G(f) le graphe partiel de G, appel´ e graphe support de f, compos´ e des arcs de G de flux strictement positif . Le lemme 2.3 fournit une condition n´ ecessaire et suffisante sur le graphe support pour que le flot f soit nul. Lemme 2.3. Un flot entier f ? 0 est nul si et seulement si son graphe support G(f) est sans circuits. Preuve. La condition est ´ evidemment n´ ecessaire. Pour la r´ eciproque, nous mon- trons que si le graphe support est sans circuit, il n?a pas d?arcs. Dans le cas Version 6 f´ evrier 2005 8.2. Flots d?un r´ eseau 247 contraire, il existe au moins un arc u de G(f) dont l?extremit´ e s n?a pas de successeur. Par d´ efinition de G(f), on a f? (s) > 0 et f+ (s) = 0. La condition d?´ equilibre n?est donc pas satisfaite pour le sommet s. Nous pouvons maintenant ´ enoncer le th´ eor` eme de d´ ecomposition. Th´ eor` eme 2.4. Soit R = (G, a, b) un r´ eseau ` a m arcs. Tout flot entier stricte- ment positif de R est une combinaison lin´ eaire ` a coefficients entiers strictement positifs d?au plus m flots canoniques de G. Preuve. La preuve est constructive. Soit f un flot entier strictement positif et G(f) le graphe support de f. Si G(f) ne poss` ede pas de circuits ´ el´ ementaires, alors f = 0. Dans le cas contraire, nous choisissons un circuit ´ el´ ementaire µ. La fonction ?µ est un flot strictement positif de G. Notons la valeur minimum du flux d?un arc de µ ( > 0). La fonction h = f ? ?µ est un flot positif ou nul de G et G(f) poss` ede au moins un arc de plus que G(h). En r´ ep´ etant au plus m fois l?op´ eration pr´ ec´ edente, on obtient un graphe support qui n?a pas de circuits. Le flot correspondant est donc nul. Le flot positif de la figure 2.3 se d´ ecompose sur les circuits ´ el´ ementaires (S, A, D, F, P, S), (S, A, D, F, G, P, S), (S, A, D, G, P, S), (S, B, E, H, P, S), (S, C, H, P, S) et (A, D, F, A). A B C D E F G H P S 1 4 4 2 1 0 0 1 2 0 1 2 1 1 0 2 3 2 0 7 5 Figure 2.3: Un flot entier positif. Flot entier quelconque La propri´ et´ e pr´ ec´ edente se g´ en´ eralise au cas d?un flot entier f dont les flux sont de signe quelconque. Le flot f se d´ ecompose alors sur les cycles ´ el´ ementaires de G. Soit ? un cycle ´ el´ ementaire. Nous notons respectivement ?? et ?+ ) les sous- ensembles des arcs arri` ere et avant de ?. La fonction ?? d´ efinie par ?(?) = ??+ ? ??? , qui satisfait les conditions d?´ equilibre en chaque sommet, est appel´ ee flot canonique du cycle ?. Version 6 f´ evrier 2005 248 Chapitre 8. Flots Th´ eor` eme 2.5. Soit f un flot entier d?un r´ eseau R = (G, a, b). Il existe un ensemble C(f) d?au plus m cycles ´ el´ ementaires de G tel que : a) le flot f est une combinaison lin´ eaire ` a coefficients entiers strictement posi- tifs des flots canoniques des cycles de C(f), b) les flux (non nuls) allou´ es ` a un arc u de G par les flots canoniques de la d´ ecomposition ont tous le signe de f(u). Preuve. Soient G = (S, A) un graphe et soit B une partie de A. Nous notons alors R = (G , a , b ) le r´ eseau obtenu ` a partir de R en rempla¸ cant chaque arc u de B par un arc oppos´ e not´ e u de capacit´ e minimale a (u ) = ?b(u) et de capacit´ e maximale b (u ) = ?a(u). On note A l?ensemble des arcs de G et B la partie des arcs de A provenant de l?inversion d?un arc de B. La fonction f de F(A ) d´ efinie par : f (v ) = f(v) si v ? A \ B ?f(v) si v ? B est par construction un flot du r´ eseau R . De plus l?application d´ efinie par ?A,B : f ? F(A) ? f ? F(A ) est lin´ eaire et satisfait : ?A ,B ? ?A,B = idF(A). Nous supposons qu?au moins un flux de f est strictement n´ egatif et nous ap- pliquons la transformation pr´ ec´ edente ` a l?ensemble B des arcs de G dont le flux est strictement n´ egatif. D?apr` es le th´ eor` eme 2.4, le flot f se d´ ecompose sur les flots canoniques d?une famille C (f ) d?au plus m circuits ´ el´ ementaires de G . A tout circuit µ de G correspond un cycle µ de G et l?on a ?A ,B (?µ )=?µ. La propri´ et´ e de d´ ecomposition de f r´ esulte alors de la lin´ earit´ e de ?A ,B . Si f(u) Le flot f 6 1 2 5 4 3 -2 2 -2 -2 -1 -1 4 3 6 1 2 5 4 3 2 2 2 2 1 1 4 3 Le flot f'(arcs de B' en gras) Figure 2.4: L?application ?A,B. est strictement n´ egatif (respectivement strictement positif), pour tout circuit de G passant par l?arc u , on a ?A ,B (?µ )(u)=?1 (respectivement +1). Il en r´ esulte la condition b) du th´ eor` eme. Sur l?exemple de la figure 2.4, le flot positif f est ´ egal ` a 2?µ1 + ?µ2 + ?µ3 o` u µ1=(1, 4, 3, 1), µ2=(1, 6, 5, 4, 3, 1) et µ3=(1, 6, 5, 4, 3, 2, 1) sont trois circuits de G . Il en r´ esulte que le flot f est ´ egal ` a 2??1 + ??2 + ??3 o` u ?1, ?2 et ?3 sont les trois cycles de G associ´ es aux circuits µ1, µ2 et µ3 de G . Version 6 f´ evrier 2005 8.2. Flots d?un r´ eseau 249 Conditions d?optimalit´ e d?un flot compatible Soit R = (G, a, b, c) un r´ eseau valu´ e consistant. La notion de cycle augmentant est utile pour comparer les co? uts de deux flots compatibles de ce r´ eseau. Un cycle ´ el´ ementaire µ est dit augmentant pour le flot compatible f s?il existe un entier positif k tel que a ? f + k?µ ? b. Si de plus le co? ut unitaire c ?µ est strictement n´ egatif, le cycle µ est dit am´ eliorant. Proposition 2.6. Soit R un r´ eseau valu´ e et soient f et g deux flots compatibles de ce r´ eseau. Le flot f ? g se d´ ecompose sur un sous-ensemble d?au plus m cycles augmentant de g. Preuve. Soit h = f ? g. D?apr` es le th´ eor` eme 2.5, il existe r (r ? m) cycles ´ el´ ementaires µ1, . . . , µr de G et r nombres entiers strictement positifs k1, . . . , kr tels que : h = r i=1 ki?µi . Comme f = g + h, nous avons : a ? g + r i=1 ki?µi ? b. Soient µj l?un de ces cycles et u un arc de µj. D?apr` es le th´ eor` eme 2.5, tous les nombres ?µi (u), i ? {1, . . . , r} sont de m? eme signe. S?ils sont tous positifs ou nuls on a : a(u) ? g(u) + kj?µj (u) ? b(u) car g(u) ? a(u) et kj?µj (u) ? r i=1 ki?µi . S?ils sont tous n´ egatifs ou nuls on a la m? eme in´ egalit´ e car g(u) ? b(u) et kj?µj (u) ? r i=1 ki?µi . La proposition 2.6 nous permet maintenant de caract´ eriser un flot compatible de co? ut minimum. Th´ eor` eme 2.7. Un flot compatible f est de co? ut minimum si et seulement s?il ne poss` ede pas de cycle am´ eliorant. Preuve. La condition n´ ecessaire est imm´ ediate. Soit f un flot compatible et soit g un flot compatible de co? ut strictement inf´ erieur. Posons h = g ? f. D?apr` es la proposition 2.6, il existe des cycles µ1, . . . , µr augmentant pour f et des nombres entiers positifs k1, . . . , kr tels que : c g = c f + r i=1 ki(c ?µi ). Il existe donc un j tel que c ?µj soit strictement n´ egatif et le cycle µj est am´ eliorant pour f. Contradiction. Soient f un flot compatible et µ un cycle de co? ut unitaire non nul. Si le flux de chaque arc du cycle n?est pas ´ egal ` a l?une de ses deux bornes, le flot f n?est pas de co? ut minimum. Il est possible en effet soit d?augmenter soit de diminuer d?une Version 6 f´ evrier 2005 250 Chapitre 8. Flots m? eme quantit´ e strictement positive tous les flux des arcs de µ et l?une de ces deux transformations conduit ` a un flot compatible strictement meilleur. Un arc u de A est dit libre vis-` a-vis du flot f si a(u) < f(u) < b(u), dans le cas contraire il est dit bloqu´ e. Un cycle ´ el´ ementaire est libre si tous ses arcs sont libres. Proposition 2.8. Un r´ eseau valu´ e consistant poss` ede un flot de co? ut minimum sans cycles libres. Le graphe partiel des arcs libres peut ? etre compl´ et´ e par des arcs bloqu´ es pour former un arbre (appel´ e arbre-base). Preuve. Soit R un r´ eseau valu´ e consistant et f un flot compatible de co? ut minimum. S?il existe un cycle ? libre, ce cycle est de co? ut nul. Posons alors ? = min{f(u) ? a(u) | u ? ?+ }, ? = min{b(u) ? f(u) | u ? ?? }, = min{?, ?} et g = f ? ??. La fonction g est un flot compatible de co? ut minimum de R qui poss` ede au moins un arc libre de moins que f. En r´ ep´ etant cette transformation, on aboutit ` a un flot compatible de co? ut minimum sans cycle libre. Dominance des flots entiers Soit R = (G, a, b, c) un r´ eseau valu´ e consistant. Nous montrons qu?il existe un flot compatible de co? ut minimum dont tous les flux sont entiers. On dit encore que les flots entiers sont dominants. La preuve s?appuie sur une propri´ et´ e de la matrice d?incidence sommets-arcs d?un arbre orient´ e, c?est-` a-dire un graphe obtenu par orientation des ar? etes d?un arbre (voir figure 2.5), et sur la proposition 2.8. Proposition 2.9. Soit H = (T, B) un arbre orient´ e. Le graphe H poss` ede une matrice d?incidence triangulaire inf´ erieure dont tous les ´ el´ ements diagonaux sont non nuls. Preuve. Nous raisonnons par r´ ecurrence sur n = Card(T). La propri´ et´ e est vraie pour n = 2. Soit H un arbre orient´ e ` a n sommets (n > 2), t une feuille de H, u l?arc incident ` a cette feuille et Ht le sous-graphe induit par T ? {t}. Le graphe Ht est un arbre orient´ e ` a n ? 1 sommets qui poss` ede (par induction) une matrice d?incidence triangulaire inf´ erieure Mt satisfaisant la proposition. La matrice d?incidence M de H obtenue en ajoutant ` a Mt la colonne u et le sommet t comme premi` ere ligne et premi` ere colonne satisfait ´ egalement la proposition. La figure 2.5 illustre la construction d?une telle matrice d?incidence. Proposition 2.10. Un r´ eseau valu´ e consistant poss` ede un flot de co? ut minimum dont tous les flux sont entiers. Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 251 6 5 4 3 2 1 g e f d c b a -1 -1 1 1 -1 -1 -1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 arbre orienté f e c 1 2 3 6 g b a d Figure 2.5: Matrice d?incidence d?un arbre orient´ e. Preuve. Soient R un r´ eseau valu´ e consistant. D?apr` es la proposition 2.8, il existe un flot compatible f de co? ut minimum sans cycle libre et un arbre-base pour f dont les arcs constituent l?ensemble H. Nous notons alors K l?ensemble des arcs du coarbre. D?apr` es la proposition 2.9, il existe une matrice d?incidence M de G compos´ ee d?une matrice d?incidence de H not´ ee MH v´ erifiant les propri´ et´ es de la proposition 2.9 et d?une matrice d?incidence de K not´ ee MK. La condition d?´ equilibre satisfaite par le flot compatible f s?´ ecrit (en utilisant les notations habituelles) : MH fH = ?MK fK. Le vecteur fK est entier puisque les arcs de K sont bloqu´ es pour le flot compatible f. Le vecteur fH, solution unique de l?´ equation d?´ equilibre, est donc ´ egalement entier. Il r´ esulte de la proposition 2.10 que la recherche d?un flot compatible de co? ut minimum peut ? etre r´ ealis´ ee dans le sous ensemble des flots compatibles entiers du r´ eseau. 8.3 Probl` eme du flot maximum Un probl` eme de flot maximum not´ e (G, b, s, p) est sp´ ecifi´ e par la donn´ ee d?un graphe orient´ e G = (S, A) connexe sans boucles, de deux sommets distincts s et p appel´ es respectivement source et puits et d?une fonction capacit´ e maximale b telle que pour tout arc u de A, la capacit´ e b(u) soit un entier strictement positif. Un flot de s ` a p est une fonction g de F(A) satisfaisant les contraintes (D) ci- dessous : eg(s) ? 0 eg(p) ? 0 0 ? g ? b ?x ? S ? {s, p}, eg(x) = 0. (D) Version 6 f´ evrier 2005 252 Chapitre 8. Flots La valeur de g est d´ efinie par ? g=eg(p) et le probl` eme est la recherche d?un flot g de s` a p de valeur maximum. En munissant le graphe G d?un arc de retour not´ e u0 d?origine p, d?extr´ emi- t´ e s et de capacit´ e maximale b? (p), on obtient un r´ eseau associ´ e au probl` eme (G, b, s, p). Les flots compatibles de ce r´ eseau sont en bijection avec les fonctions g solutions de (D). De plus si f est le flot du r´ eseau associ´ e ` a g dans la bijection, on a eg(p) = f(u0). Le probl` eme revient donc ` a d´ eterminer un flot compatible du r´ eseau associ´ e dont le flux de l?arc de retour est maximum. Nous emploierons dans la suite le terme flot pour d´ esigner un flot compatible du r´ eseau associ´ e. Le probl` eme du flot maximum a ´ et´ e tr` es ´ etudi´ e et a donn´ e lieu ` a des algorithmes de plus en plus efficaces depuis les travaux de Ford et Fulkerson. On peut re- grouper ces algorithmes en deux classes, les m´ ethodes primales qui construisent une suite de flots de valeur croissante et les m´ ethodes duales qui construisent une suite de flots approch´ es, appel´ es pr´ eflots, dont le dernier est un flot maximum. Nous pr´ esentons d?abord l?algorithme g´ en´ erique de Ford et Fulkerson, puis un algorithme efficace repr´ esentatif de chacune des classes, l?algorithme primal des distances estim´ ees au puits et l?algorithme dual du pr´ eflot. Nous terminons par deux variantes tr` es efficaces de l?algorithme du pr´ eflot, l?algorithme de Karzanov et l?algorithme des exc` es ´ echelonn´ es. Nous commen¸ cons par une simplification naturelle du r´ eseau. Soit (G, b, s, p) un probl` eme de flot maximum de s ` a p. Comme nous l?avons vu dans la section 8.2.2, le probl` eme du flot de valeur maximum de s ` a p est un cas particulier du probl` eme du flot compatible de co? ut minimum. Il existe donc d?apr` es la proposition 2.10 un flot f? de valeur maximum dont tous les flux sont entiers. D?apr` es le th´ eor` eme 2.4, le flot f? est une combinaison lin´ eaire ` a coefficients entiers strictement positifs des flots canoniques de circuits de G. Or seuls les circuits de la d´ ecomposition passant par l?arc de retour u0 contribuent ` a la valeur de f? . Il en r´ esulte que le flot obtenu en ne retenant dans la d´ ecomposition de f? que les circuits passant par u0 est aussi de valeur maximum. Il existe donc un flot de valeur maximum qui est une combinaison lin´ eaire ` a coefficients entiers strictement positifs de circuits passant par l?arc de retour u0. Soit x un sommet qui n?appartient pas ` a un chemin de s ` a p. Le graphe obtenu en supprimant x et tous les arcs adjacents ` a x contient encore tous les circuits de G passant par u0. La valeur maximum d?un flot de s ` a p dans le nouveau graphe est donc la m? eme que celle associ´ ee au graphe G. Nous pouvons donc supposer sans perte de g´ en´ eralit´ e que tous les sommets du graphe G sont accessibles de s et co-accessibles de p. La figure 3.1 pr´ esente le r´ eseau associ´ e ` a un probl` eme de flot maximum et un flot f de ce r´ eseau. A cot´ e de chaque arc u sont inscrites sa capacit´ e maximale b(u) (entre parenth` eses) et le flux f(u). Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 253 A B C D E F G H P S 4 (5) (3) 2 1 (1) 0 (2) 0 (1) 0 (1) (1) 1 (4) 4 0 (3) 2 (2) 0 (1) 3 (3) 1 (1) 2 (4) 1 (2) 0 (3) 2 (2) (3) 2 3 (5) 7 (10) Figure 3.1: Un probl` eme de flot maximum et l?un de ses flots. Graphe d?´ ecart d?un flot f Les algorithmes de r´ esolution du probl` eme du flot maximum sont fond´ es sur la recherche de cha? ?nes dites am´ eliorantes le long desquelles sont r´ ealis´ ees des augmentations de flux. Comme nous le verrons, l?efficacit´ e de certains algorithmes augmente si les am´ eliorations de flot sont r´ ealis´ ees sur des cha? ?nes de longueur minimum en nombre d?arcs. Pour ramener la recherche d?une cha? ?ne am´ eliorante ` a celle d?un chemin, on d´ efinit un outil tr` es utile : le graphe d?´ ecart. Soit R le r´ eseau d?un probl` eme de flot maximum (G, b, s, p) et soit f un flot de ce r´ eseau. Le graphe d?´ ecart d? Gf = (S, Af ) du flot f est un graphe valu´ e ayant les m? emes sommets que G et dont les arcs sont d´ efinis ` a partir des arcs de G par la proc´ edure graphe-d?´ ecart suivante : proc´ edure graphe-d?´ ecart(G, f); Af := ?; pour tout arc u de G faire si f(u) < b(u) alors ins´ erer dans Af l?arc u valu´ e par r(u ) = b(u) ? f(u) d?origine u? et d?extr´ emit´ e u+ finsi; si f(u) > 0 alors ins´ erer dans Af l?arc u valu´ e par r(u ) = f(u) d?origine u+ et d?extr´ emit´ e u? ; finsi; finpour; retourner(Af ). Un arc u libre pour f produira donc les deux arcs u et u dans Gf , un arc u satur´ e produira seulement l?arc u et un arc u vide produira seulement l?arc u . Version 6 f´ evrier 2005 254 Chapitre 8. Flots Un arc u est appel´ e repr´ esentant conforme de l?arc u, un arc u est appel´ e repr´ esentant non conforme de l?arc u. Les arcs u et u sont dits conjoints. La figure 3.2 montre le graphe d?´ ecart du flot de la figure 3.1. A B C D E F G H P S 2 1 2 3 2 3 1 2 2 1 3 1 1 1 4 3 2 1 1 2 1 4 1 2 1 Figure 3.2: Un graphe d?´ ecart. Donnons quelques propri´ et´ es simples du graphe d?´ ecart. Tout arc v du graphe d?´ ecart est le repr´ esentant conforme ou non conforme d?un arc unique du graphe G appel´ e son p` ere. La notation condens´ ee v = u (respectivement v = u ) signifiera que l?arc v de Gf est le repr´ esentant conforme (respectivement non conforme) de l?arc u de G. Un arc u de G a donc pour le flot f un ou deux repr´ esentants dans Gf . Chacun de ces repr´ esentants a une valuation strictement positive et la somme des valuations des repr´ esentants de u est toujours ´ egale ` a b(u). Soit u un arc de G. Faisons varier son flux f(u) de 0 ` a b(u). Si f(u) = 0, l?arc u existe et l?arc u n?existe pas dans Gf . Si f(u) augmente mais n?atteint pas la valeur b(u), l?arc u apparait dans Gf , enfin lorsque f(u) = b(u), l?arc u disparait de Gf . Une augmentation de flux est donc susceptible de faire appara? ?tre et/ou dispara? ?tre un arc du graphe d?´ ecart. Il en est bien s? ur de m? eme d?une diminution de flux. La fonction fondamentale du graphe d?´ ecart Gf est de ramener la recherche d?un flot meilleur que f ` a celle d?un chemin de s ` a p dans Gf . Un tel chemin est appel´ e chemin am´ eliorant. Soit µ un chemin am´ eliorant et ? la plus petite valuation des arcs de ce chemin, le lemme 3.1 montre que la nouvelle fonction f calcul´ ee par la proc´ edure augmenter-flot ci-dessous est un flot strictement meilleur. proc´ edure augmenter-flot(f, µ); ? :=min{r(v) | v arc de µ}; pour chaque arc v de µ faire si v = u alors f(u) := f(u) + ? finfaire si v = u alors f(u) := f(u) ? ? finfaire finpour f(u0) :=f(u0) + ?. Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 255 Lemme 3.1. S?il existe un chemin am´ eliorant dans Gf , le flot f n?est pas de valeur maximum. Preuve. Soit µ un chemin am´ eliorant du graphe d?´ ecart Gf . Notons ? (? > 0) la plus petite valuation des arcs de ce chemin. Appelons µ+ (respectivement µ? ) les arcs conformes (respectivement non conformes) du chemin µ. Si nous notons g la nouvelle fonction f ` a l?issue de la proc´ edure augmenter-flot, g est un flot par d´ efinition des arcs conformes et non conformes et nous avons ? g = ? f + ? > ? f puique ? > 0 . Il est important de remarquer que la proc´ edure augmenter-flot supprime au moins un arc du graphe d?´ ecart Gf . En effet, si ? est la valuation d?un arc v = u de µ+ , on a ? = b(u) ? f(u) et g(u) = b(u). L?arc v de Gf n?appartient donc pas ` a Gg. Si ? est la valuation d?un arc v = u de µ? , on a ? = f(u) et g(u) = 0. L?arc v de Gf n?appartient donc pas ` a Gg. 8.3.1 L?algorithme g´ en´ erique de Ford et Fulkerson Tous les algorithmes de r´ esolution du probl` eme de flot maximum utilisent comme crit` ere de terminaison un th´ eor` eme important, d? u ` a Ford et Fulkerson, que l?on peut rapprocher du th´ eor` eme de la dualit´ e en programmation lin´ eaire continue. Les objet duaux des flots sont appel´ es coupes. Une coupe est un sous-ensemble C d?arcs de G tel que C = ?+ (T) o` u T est un sous-ensemble de sommets contenant s et ne contenant pas p. La valeur d?une coupe est par d´ efinition b(C). La figure 3.3 montre une coupe du r´ eseau de la figure 3.1. Cette coupe, constitu´ ee des arcs de ?+ {S, A, B, C}, a la valeur 10. Au probl` eme de recherche d?un flot de valeur S A B C D E H 4 3 1 1 1 Figure 3.3: Une coupe. maximum correspond par dualit´ e le probl` eme de recherche d?une coupe de valeur minimum. Le th´ eor` eme de Ford et Fulkerson montre que ces deux valeurs sont ´ egales. Th´ eor` eme 3.2 (de Ford et Fulkerson). La valeur maximum d?un flot est ´ egale ` a la valeur minimum d?une coupe. Version 6 f´ evrier 2005 256 Chapitre 8. Flots Preuve. Nous montrons d?abord que la valeur b(C) d?une coupe C = ?+ (T) (s ? T, t ? T) est sup´ erieure ou ´ egale ` a la valeur ? f d?un flot f. En effet, par sommation des ´ equations d?´ equilibre sur les sommets de T, il vient : f? (T) = f(u0) + u???(T )?{u0} f(u) = f+ (T) ? b(C). Il en r´ esulte : ? f ? b(C). Supposons maintenant que f soit un flot maximum. D?apr` es le lemme 3.1, il n?existe pas de chemin de s ` a p dans le graphe d?´ ecart Gf . Notons alors T l?ensemble des sommets accessibles ` a partir de s dans Gf . Un arc u de G sor- tant de T est satur´ e car dans le cas contraire, son repr´ esentant conforme serait un arc sortant de T dans Gf . Un arc u de G entrant dans T est vide car dans le cas contraire, son repr´ esentant non conforme serait, lui, un arc sortant de T dans Gf . Il en r´ esulte que : f? (T) = f(u0) = f+ (T) = b(C). La coupe C est donc de valeur minimum. On d´ eduit directement du lemme 3.1 et du th´ eor` eme 3.2 la condition n´ ecessaire et suffisante suivante : Proposition 3.3. Un flot f est maximum si et seulement s?il n?existe pas de chemin am´ eliorant dans Gf . Le th´ eor` eme pr´ ec´ edent conduit tr` es naturellement ` a un algorithme g´ en´ erique, d? u ` a Ford et Fulkerson. proc´ edure Ford-Fulkerson (G, b, s, p); f := 0; tantque p est accessible ` a partir de s dans Gf faire d´ eterminer un chemin am´ eliorant µ de Gf ; augmenter-flot (f, µ) fintantque. Cet algorithme se termine puisqu?` a chaque it´ eration la valeur du flot, majoror´ ee par b? (p), augmente au moins d?une unit´ e. D?apr` es le th´ eor` eme de Ford et Fulker- son, le dernier flot obtenu est de valeur maximum. Le graphe d?´ ecart de la figure 3.2 montre que le flot est maximum puisque l?ensemble des sommets accessibles ` a partir de S, point´ es d?un rond noir, ne contient pas P. En laissant totalement libre le choix du chemin am´ eliorant, l?algorithme pr´ ec´ edent peut r´ ealiser un tr` es grand nombre d?it´ erations. Sur l?exemple de la figure 3.4, Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 257 l?algorithme peut, ` a partir du flot nul, augmenter la valeur du flot alternativemnt sur le chemin (1, 2, 4, 3) et sur la cha? ?ne (1, 4, 2, 3). Le flot maximum est alors obtenu apr` es M it´ erations alors que deux it´ erations suffisent. Pour transformer cet algorithme g´ en´ erique en un algorithme efficace, il faut contraindre le choix du chemin am´ eliorant. Un crit` ere judicieux, d? u ` a Edmonds et Karp, consiste ` a choisir un chemin am´ eliorant de longueur minimum (en nombre d?arcs). Nous montrerons en effet que la longueur d?un plus court chemin am´ eliorant ne peut pas cro? ?tre d?une it´ eration sur l?autre pourvu que l?augmentation de flot soit r´ ealis´ ee le long d?un tel chemin. De plus, apr` es au plus m it´ erations (o` u m est le nombre d?arcs de G), cette diminution est stricte. s=1 2 4 p=3 (1) (M) (M) (M) (M) Figure 3.4: Un probl` eme de flot maximum. 8.3.2 L?algorithme des distances estim´ ees au puits La faiblesse essentielle de l?algorithme g´ en´ erique est de ne retenir aucune infor- mation sur les chemins am´ eliorants du graphe d?´ ecart d?une it´ eration sur l?autre alors que deux graphes d?´ ecart successifs sont souvent tr` es voisins. Le principe de l?algorithme des distances estim´ ees au puits est de calculer, en chaque sommet du graphe d?´ ecart, une ´ evaluation par d´ efaut de sa distance au puits. On peut alors calculer efficacement un plus court chemin am´ eliorant. Distance estim´ ee et graphe d?admissibilit´ e Soient Gf = (S, Af ) le graphe d?´ ecart d?un flot f et n le nombre de sommets de Gf . Nous appelons distance estim´ ee une application ? : S ? N telle que : a) ?(p) = 0; b) pour tout arc v de Gf , ?(v? ) ? ?(v+ ) + 1. Si le sommet p est accessible ` a partir du sommet x dans Gf , la distance estim´ ee du sommet x est une ´ evaluation par d´ efaut de la longueur minimum (en nombre d?arcs) d?un chemin de x ` a p dans Gf . Il en r´ esulte que si ?(y) ? n pour y ? S, il n?existe pas de chemin de y ` a s dans Gf . Un arc v de Gf est dit admissible si ?(v? ) = ?(v+ ) + 1. Un chemin admissible est un chemin am´ eliorant dont les arcs sont admissibles. Un chemin admissible est donc un plus court chemin am´ eliorant. Nous appellerons graphe d?admissibilit´ e Version 6 f´ evrier 2005 258 Chapitre 8. Flots le graphe partiel de Gf form´ e des arcs admissibles. Le graphe d?admissibilit´ e ne poss` ede pas de circuits et aucun arc admissible n?a le sommet p comme origine. Initialisation Le flot initial est le flot nul et la distance estim´ ee initiale d?un sommet x est la longueur minimum d?un chemin de x ` a p dans G0. Notons que cette longueur est d´ efinie pour tout sommet x puisque tout sommet est par hypoth` ese co-accessible de p. Le chemin courant initial est r´ eduit au sommet s. La proc´ edure initialiser- dep r´ ealise cette initialisation. proc´ edure initialiser-dep(G, b, s, p); µ := (s); f := 0; z := s; pour tout sommet x de G faire ?(x) := l(x, p, G0). On note l(x, p, G0) la longueur minimum d?un chemin de x ` a p dans G0, µ le chemin courant, f le flot courant, et z l?extr´ emit´ e de µ. It´ eration courante Soit µ le chemin courant et z son extr´ emit´ e. Une it´ eration de l?algorithme consiste ` a prolonger µ ` a partir de son extr´ emit´ e dans le graphe d?admissibilit´ e jusqu?` a ce que l?extr´ emit´ e z du chemin soit une sortie du graphe d?admissibilit´ e. Si z = p, le chemin µ est un plus court chemin am´ eliorant. On am´ eliore alors le flot le long de ce chemin, on ne modifie pas la distance estim´ ee ? et l?on r´ einitialise le chemin courant µ ` a (s). Si z = p, on augmente strictement la distance estim´ ee du sommet z et on supprime le dernier arc de µ qui n?est plus admissible. La proc´ edure it´ erer-dep ci-dessous r´ ealise l?it´ eration courante. proc´ edure it´ erer-dep; prolonger(µ); soit z l?extr´ emit´ e de µ; si z = p alors augmenter-flot(f, µ); µ := (s) sinon augmenter-distance(z); supprimer-dernier-arc(µ) finsi. Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 259 La proc´ edure prolonger(µ) transforme le chemin µ en un chemin µ du graphe d?admissibilit´ e qui admet µ comme sous-chemin initial et dont l?extr´ emit´ e z n?est pas l?origine d?un arc admissible. Sa complexit´ e est de l?ordre du nombre d?arcs ajout´ es. Lorsque µ est un chemin am´ eliorant, la proc´ edure augmenter-flot am´ eliore le flot le long du chemin µ et met ` a jour le graphe d?´ ecart. Comme le chemin µ est ´ el´ ementaire, il comporte au plus n ? 1 arcs. La complexit´ e de la proc´ edure augmenter-flot est donc O(n). Lorsque µ n?est pas un chemin am´ eliorant, la proc´ edure augmenter-distance augmente la valeur de ?(z) comme suit : ?(z) := n si Sf (z) est vide miny?Sf (z){1 + ?(y)} sinon (Sf (z) est l?ensemble des successeurs de z dans Gf d?origine z) et met ` a jour le graphe d?admissibilit´ e. La figure 3.5, o` u les distances estim´ ees sont inscrites ` a c? ot´ e de chaque sommet et o` u les arcs de µ sont ´ epais, montre cette mise ` a jour. Si le sommet z a k successeurs dans G, la complexit´ e de augmenter-distance est O(k). Apr` es l?ex´ ecution de augmenter-distance, le dernier arc de µ n?est plus ad- missible. La proc´ edure supprimer-dernier-arc supprime le dernier arc de µ si la longueur de µ est strictement positive et laisse µ inchang´ e sinon. Le nou- veau chemin µ est donc admissible. La complexit´ e de la proc´ edure supprimer- dernier-arc est O(1). z s z s avant l' augmentation de distance après l' augmentation de distance 8 7 6 5 4 5 5 2 4 4 4 5 5 6 7 8 Figure 3.5: Mise ` a jour de la distance estim´ ee Terminaison L?algorithme se termine lorsque la distance estim´ ee du sommet s est sup´ erieure ou ´ egale ` a n. Par d´ efinition de la distance estim´ ee, il n?existe plus alors de chemin Version 6 f´ evrier 2005 260 Chapitre 8. Flots am´ eliorant et le flot obtenu est maximum. Il en r´ esulte la proc´ edure dep ci- dessous : proc´ edure dep; initialiser-dep tantque ?(s) < n faire it´ erer-dep fintantque. Les figures 3.6, 3.7 et 3.8 illustrent le d´ eroulement de l?algorithme des distances estim´ ees au puits sur le r´ eseau de la figure 3.1. La figure 3.6 montre en (A) le graphe d?´ ecart du flot nul initial, les distances estim´ ees (coin nord-est du sommet) et le graphe d?admissibilit´ e (arcs ´ epais). L?algorithme r´ ealise ensuite une augmen- tation de flot pour le chemin admissible (S, C, H, P) puis augmente la distance estim´ ee du sommet S. Le graphe d?´ ecart ` a l?issue de cette premi` ere augmentation de la distance estim´ ee est repr´ esent´ e en (B). Suivent ensuite trois augmenta- tions de flot pour les chemins (S, A, D, F, P), (S, B, E, H, P) et (S, A, D, G, P) ` a l?issue desquelles la valeur du flot est 6 et le graphe d?´ ecart celui de la figure 3.7. L?algorithme augmente alors la distance du sommet F et r´ ealise ensuite un augmentation de flot sur le chemin (S, A, D, F, G, P). Le flot est alors optimal comme le montre le graphe d?´ ecart de la figure 3.8 o` u les sommets accessibles ` a partir de S sont point´ es. L?algorithme n?est cependant pas termin´ e car il reste encore des augmentations de distance ` a ex´ ecuter pour que la distance estim´ ee de S devienne sup´ erieure ou ´ egale ` a n = 10. Convergence et complexit´ e Apr` es avoir d´ ecrit l?algorithme des distances estim´ ees, nous montrons maintenant que cet algorithme se termine, qu?il calcule un flot de valeur maximum et que sa complexit´ e est O(n2 m). Quelques propri´ et´ es seront utiles pour parvenir ` a ces r´ esultats. Consid´ erons la suite des fonctions ? calcul´ ees par la proc´ edure dep. On note ?0 la fonction ? initiale et ?k la fonction ? ` a l?issue de l?it´ eration k. Proposition 3.4. La suite ?k est une suite croissante de fonctions distance estim´ ee . Si l?it´ eration k r´ ealise une augmentation de flot, alors ?k = ?k?1 ; si elle r´ ealise une augmentation de distance, alors ?k > ?k?1. Preuve. Consid´ erons le cas d?une augmentation de flot et notons g le nouveau flot. Si l?ensemble des arcs du nouveau graphe d?´ ecart Gg est inclus dans l?ensemble des arcs de Gf , la fonction ? est toujours une distance estim´ ee pour Gg. Supposons que le changement de flux du p` ere u d?un arc v = u de µ cr´ ee l?arc u dans Gg. L?arc v ´ etant admissible, on a ?(v? ) = ?(v+ ) + 1 et donc ?(v+ ) = Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 261 ?(v? ) ? 1 ? ?(v? ) + 1. Il en est de m? eme si le changement de flux du p` ere u d?un arc v = u de µ cr´ ee l?arc u dans Gg. La fonction ? respecte donc les deux conditions d?une distance estim´ ee pour Gg. Consid´ erons le cas d?une augmentation de la distance estim´ ee du sommet z due ` a la proc´ edure augmenter-distance et notons ? la nouvelle fonction ?. Pour tout sommet distinct de z on a ? (z) = ?(z) et pour le sommet z nous avons : ? (z) := n si Sf (z) est vide miny?Sf (z){1 + ?(y)} sinon Il en r´ esulte que ? (z) est strictement sup´ erieur ` a ?(z). De plus, pour tout sommet x successeur de z on a ? (z) ? ? (x) + 1 et pour tout pr´ ed´ ecesseur y de z on a ? (y) < ? (z) + 1. La fonction ? est donc une nouvelle distance estim´ ee pour Gf strictement sup´ erieure ` a ?. Pour prouver que l?algorithme se termine nous utilisons le lemme 3.5 qui permet de majorer le nombre d?ex´ ecutions de la proc´ edure augmenter-flot entre deux ex´ ecutions de la proc´ edure augmenter-distance. S A B C D E F G H P 5 3 1 2 1 4 3 2 1 1 4 3 2 1 3 2 3 0 1 1 1 2 2 2 3 3 4 S A B C D E F G H P 5 2 1 2 1 4 3 2 1 1 4 3 2 1 3 2 3 5 0 1 1 1 2 2 2 3 3 3 (A) (B) 4 1 Figure 3.6: Initialisation et premi` ere augmentation de distance. Lemme 3.5. Entre deux suppressions successives d?un arc v du graphe d?´ ecart, la distance estim´ ee de v+ a augment´ e d?au moins deux unit´ es. Version 6 f´ evrier 2005 262 Chapitre 8. Flots A B C D E F G H P S 4 3 3 2 2 2 1 1 1 0 2 2 1 3 2 2 3 2 1 1 2 2 1 1 1 1 2 2 2 3 1 2 1 3 1 3 Figure 3.7: Seconde augmentation de distance. A B C D E F G H P S 4 3 3 2 2 2 1 1 0 2 2 1 3 2 3 1 2 2 1 1 1 1 2 2 1 2 1 2 1 1 3 4 1 4 3 Figure 3.8: Premier graphe d?´ ecart d?un flot maximum. Preuve. Notons ?1 la distance estim´ ee lors de la premi` ere suppression de l?arc v, on a ?1(v? ) = ?1(v+ ) + 1 puisque v est admissible. Notons ?2 la distance estim´ ee lors de la cr´ eation suivante de v dans un graphe d?´ ecart. Comme cette cr´ eation ne peut avoir lieu que si l?arc conjoint de v appartient ` a un chemin admissible am´ eliorant, on aura alors ?2(v+ ) = ?2(v? ) + 1. Notons enfin ?3 la distance estim´ ee lors de la suppression suivante de v, nous avons : ?3(v+ ) ? ?2(v+ ) = ?2(v? ) + 1 ? ?1(v? ) + 1 = ?1(v+ ) + 2 Nous sommes maintenant en mesure de prouver la validit´ e de l?algorithme des distances estim´ ees au puits et de calculer sa complexit´ e. Th´ eor` eme 3.6. La proc´ edure dep calcule un flot maximum en temps O(n2 m). Preuve. D?apr` es le lemme 3.5, un m? eme arc peut ? etre supprim´ e d?un graphe d?´ ecart au plus n/2 fois. En effet, si l?arc v ´ etait supprim´ e au moins n/2 + 1 fois, la distance estim´ ee de v+ au d´ ebut de la derni` ere augmentation de distance serait sup´ erieure ou ´ egale ` a 2 n/2 ? n. Or comme v+ est accessible ` a partir de s, on aurait ?(s) ? n en d´ ebut d?it´ eration. D?o` u la contradiction. Comme chaque Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 263 ex´ ecution de la proc´ edure augmenter-flot supprime au moins un arc, elle est appel´ ee au plus 2m n/2 fois. Il en r´ esulte que l?algorithme se termine puisque toute it´ eration r´ ealise soit une augmentation de flot soit une augmentation de distance. Lors de la terminaison, on a par d´ efinition ?(s) ? n. Le dernier graphe d?´ ecart ne contenant pas de chemin am´ eliorant, le dernier flot est de valeur maximum. Pour ´ evaluer la complexit´ e de la proc´ edure dep, nous allons suivre l?´ evolution de la longueur L(µ) du chemin courant µ. Cette longueur cro? ?t lors de chaque ex´ ecution de prolonger, d´ ecroit d?une unit´ e au plus lors de l?ex´ ecution de augmenter-distance, et devient nulle lors de l?ex´ ecution de augmenter- flot. La complexit´ e de la proc´ edure prolonger est proportionnelle au nombre d?arcs ajout´ es, c?est ` a dire ` a l?accroissement de L(µ). Comme le nombre d?ex´ ecu- tions de la proc´ edure augmenter-flot est au plus 2m n/2 et la longueur L(µ) est au plus n, la somme des variations n´ egatives de L(µ) dues aux ex´ ecutions de augmenter-flot est major´ ee par 2nm n/2 . Comme augmenter-distance est ex´ ecut´ ee au plus n fois par sommet, la somme des variations n´ egatives de L(µ) dues aux ex´ ecutions de augmenter-distance est major´ ee par n2 . Il en r´ esulte que la somme cumul´ ee des variations n´ egatives de L(µ) est major´ ee par n2 + 2nm n/2 . Comme la longueur initiale de µ est nulle et sa longueur termi- nale inf´ erieure ou ´ egale ` a n, la somme cumul´ ee des variations positives de L(µ) est major´ ee par n + n2 + 2nm n/2 . La complexit´ e de toutes les ex´ ecutions de la proc´ edure prolonger est donc O(n2 m). La complexit´ e d?une ex´ ecution de augmenter-flot est O(n), donc la complexit´ e de toutes les ex´ ecutions de la proc´ edure augmenter-flot est aussi O(n2 m). La complexit´ e d?une ex´ ecution de augmenter-distance est de l?ordre du nombre de successeurs de z dans G et la distance estim´ ee d?un sommet est augment´ ee au plus n fois, donc la complexit´ e de toutes les ex´ ecutions de la proc´ edure augmenter-distance est O(nm). Enfin la complexit´ e O(1) de la proc´ edure supprimer-dernier-arc est domin´ ee par celle de augmenter-distance. Il en r´ esulte que la complexit´ e de la proc´ edure dep est O(n2 m). 8.3.3 L?algorithme du pr´ eflot L?algorithme des distances estim´ ees au puits r´ ealise des augmentations de flot le long de chemins am´ eliorants et maintient de ce fait la satisfaction des conditions d?´ equilibre. A chaque ´ etape on dispose ainsi d?un flot r´ ealisable. Une id´ ee duale consiste ` a saturer initialement les arcs sortant de s et ` a transporter vers le puits la plus grande partie des exc` es positifs ainsi cr´ e´ es en r´ ealisant ` a chaque it´ eration une r´ eduction de l?exc` es d?un sommet. D` es que l?exc` es du sous-ensemble de sommets S = S ? {s, p} est nul, le pr´ eflot obtenu est un flot de s ` a p de valeur maximum. Cet algorithme est une m´ ethode duale car tant que l?algorithme n?est pas termin´ e, la fonction f n?est pas un flot de s ` a p. Version 6 f´ evrier 2005 264 Chapitre 8. Flots Etant donn´ e un probl` eme de flot maximum (G, b, s, p), un pr´ eflot est une fonction de F(A) telle que : ef (s) ? 0 ef (p) ? 0 0 ? f ? b ?x ? S ? {s, p}, ef (x) ? 0 Pour un pr´ eflot f, le graphe d?´ ecart Gf , la fonction distance estim´ ee au puits et le graphe d?admissibilit´ e sont d´ efinis comme dans le cas d?un flot de s ` a p (voir section 8.3. Un sommet actif est un sommet distinct de s et de p dont l?exc` es est strictement positif. Initialisation Le pr´ eflot initial f0 est obtenu en saturant tous les arcs sortant du sommet s et en allouant un flux nul ` a tous les autres arcs. La distance estim´ ee initiale d?un sommet x de S est la longueur minimum en nombre d?arcs d?un chemin de x ` a p dans le graphe d?´ ecart Gf0 , elle est not´ ee l(x, p, Gf0 ). La distance estim´ ee initiale de s est n et celle de p est nulle. La proc´ edure initialiser-pr´ eflot r´ ealise ces initialisations. proc´ edure initialiser-pr´ eflot; f := 0; pour tout arc u sortant de s faire f(u) := b(u) finpour; ?(p) := 0; ?(s) := n; pour tout sommet x de S faire ?(x) := l(x, p, Gf0 ) finpour. L?initialisation joue un r? ole important. En effet, comme les arcs sortant de s sont initialement satur´ es, il n?existe pas de chemin am´ eliorant dans le graphe d?´ ecart initial. De plus la distance estim´ ee du sommet s n?est jamais modifi´ ee. Il n?existera donc jamais de chemin am´ eliorant dans les graphes d?´ ecart des pr´ eflots successifs. It´ eration courante Une it´ eration de l?algorithme du pr´ eflot consiste ` a choisir un sommet actif x. S?il n?existe pas d?arc admissible d?origine x, la distance estim´ ee de x au puits est augment´ ee strictement comme dans la proc´ edure augmenter-distance de l?algorithme des distances estim´ ees au puits. Sinon on choisit un arc admissible v d?origine x et l?on r´ eduit l?exc` es du sommet origine x en modifiant le flux du p` ere u de v. La proc´ edure r´ eduire-exc` es ci-dessous r´ ealise cette r´ eduction. Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 265 proc´ edure r´ eduire-exc` es(f, v); si v = u alors := min{ef (v? ), b(u) ? f(u)}; f(u) := f(u) + sinon := min{ef (v? ), f(u)}; f(u) := f(u) ? finsi. Nous dirons qu?une r´ eduction d?exc` es est saturante si est ´ egal ` a la valuation de l?arc v choisi dans Gf . Si l?arc v est le repr´ esentant conforme de l?arc u de G (c?est-` a-dire si v = u ), l?arc u est satur´ e apr` es la r´ eduction et v n?appartient donc pas au nouveau graphe d?´ ecart. Si l?arc v est le repr´ esentant non conforme de l?arc u de G (c?est-` a-dire si v = u ), l?arc u est vide apr` es la r´ eduction et v n?appartient donc pas au nouveau graphe d?´ ecart. Une r´ eduction saturante supprime donc un arc dans l?ancien graphe d?´ ecart. Terminaison Si l?ensemble des sommets actifs est vide ` a l?issue d?une it´ eration, le dernier pr´ eflot est un flot de s ` a p et il n?existe pas de chemin am´ eliorant dans le graphe d?´ ecart correspondant. Le crit` ere de terminaison de l?algorithme du pr´ eflot est l?absence de sommets actifs. Il en r´ esulte la proc´ edure pr´ eflot ci-dessous : proc´ edure pr´ eflot(G, b, s, p); initialiser-pr´ eflot; tantque l?ensemble des sommets actifs est non vide faire choisir un sommet actif x; s?il existe un arc admissible d?origine x alors choisir un arc admissible v d?origine x; r´ eduire-exc` es(f, v) sinon augmenter-distance(x) finsi fintanque. Les figures 3.9, 3.10 et 3.11 illustrent une ex´ ecution de l?algorithme sur l?exemple de la figure 3.1. La distance estim´ ee est dans le coin nord-est du sommet et l?exc` es dans le coin sud-est. La figure 3.9 montre le graphe d?´ ecart du pr´ eflot initial. Les premi` eres r´ eductions d?exc` es cod´ ees par (sommet actif, nature, arc admissible) sont les suiv- Version 6 f´ evrier 2005 266 Chapitre 8. Flots S A B C D E F G H P 10 3 3 2 2 2 1 1 1 0 5 3 5 3 1 4 2 1 1 2 3 1 4 1 3 2 3 2 3 5 0 0 0 0 0 -9 1 0 1 Figure 3.9: Graphe d?´ ecart du pr´ eflot initial. antes, ligne par ligne : (A, sat, (A, D)) (B, sat, (B, E)) (C, sat, (C, H)) (B, nonsat, (B, D)) (D, sat, (D, F)) (D, sat, (D, G)) (F, sat, (F, P)) (G, nonsat, (G, P)) (H, nonsat, (H, P)) (E, nonsat, (E, H)) (H, nonsat, (H, P)) Aucun des sommets actifs A, B ou F n?est alors l?origine d?un arc admissi- ble. L?algorithme r´ ealise une augmentation de distance pour F, les r´ eductions (F, nonsat, (F, G)) et (G, nonsat, (G, P)), une augmentation de distance pour D et la r´ eduction (D, nonsat, (D, B)). Il en r´ esulte le graphe d?´ ecart de la figure 3.10. La valeur maximum est atteinte mais certains exc` es sont encore positifs. A B C D E F G H P S 3 3 3 2 4 2 1 1 0 1 1 5 3 1 4 2 1 3 1 2 2 1 2 2 2 3 1 1 3 1 1 3 2 1 0 0 0 0 0 0 -9 2 Figure 3.10: La valeur maximum est atteinte. Tous ces exc` es doivent maintenant refluer vers l?entr´ ee s. L?algorithme r´ ealise alors des augmentations de distance jusqu?` a ce que l?un des deux arcs (A,S) ou (B,S) devienne admissible. La figure 3.11 montre le dernier graphe d?´ ecart lorsque les exc` es de tous les sommets de S sont nuls. Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 267 S A B C D E F G H P 11 4 1 2 1 1 2 1 4 3 2 1 1 1 3 1 2 2 3 1 1 2 1 2 3 2 10 11 2 2 10 2 1 1 0 0 0 0 0 0 0 0 0 -7 7 Figure 3.11: Le dernier graphe d?´ ecart. Convergence et complexit´ e Nous montrons dans cette section que l?algorithme du pr´ eflot se termine et nous calculons sa complexit´ e. Deux lemmes pr´ eliminaires nous seront utiles. Lemme 3.7. La distance estim´ ee d?un sommet actif est inf´ erieure ` a 2n. Preuve. Supposons le sommet y actif pour le pr´ eflot f et montrons qu?il existe alors un chemin ´ el´ ementaire de s ` a y dans G dont tous les arcs ont un flux strictement positif. Consid´ erons le graphe H = (S ? {q}, A ? B) obtenu ` a partir de G en ajoutant un sommet q et les arcs suivants : pour tout sommet actif x, ajouter un arc wxq d?origine x et d?extr´ emit´ e q; ajouter un arc w1 d?origine p et d?extr´ emit´ e q; ajouter un arc w0 d?origine q et d?extr´ emit´ e s. D´ efinissons la fonction g de F(A ? B) par : g(u) = ? ? ? ? ? ? ? f(u) si u ? A ef (x) si u = wxq ?ef (s) si u = w0 ef (p) si u = w1 La fonction g est un flot strictement positif du graphe H car : eg(x) = ? ? ? ? ? ? ? ef (x) ? g(wxq) = 0 si x est actif dans S ef (x) = 0 si x n?est pas actif dans S ef (p) ? g(w1) = 0 si x = p ef (s) + g(w0) = 0 si x = s Le flot g est donc une combinaison lin´ eaire ` a coefficients entiers strictement posi- tifs de circuits de H. L?un au moins de ces circuits passe par l?arc wyq et ce circuit emprunte l?arc w0. Soit µ le chemin ´ el´ ementaire de s ` a y issu de ce circuit. Les arcs de µ sont des arcs de G dont les flux pour f sont strictement positifs. Il existe donc dans le graphe d?´ ecart Gf un chemin de y ` a s form´ e par les repr´ esentants Version 6 f´ evrier 2005 268 Chapitre 8. Flots non conformes des arcs de µ. Comme la distance estim´ ee de s reste constante et ´ egale ` a n, on a ?(y) ? ?(s) + (n ? 1) < 2n. Le lemme 3.7 a deux cons´ equences importantes. Comme le nombre d?augmen- tations de la distance estim´ ee d?un m? eme sommet est inf´ erieur ` a 2n, le nombre total d?ex´ ecutions de la proc´ edure augmenter-distance est inf´ erieur ` a 2n2 . D?autre part le nombre d?ex´ ecutions de la proc´ edure r´ eduire-exc` es entre deux augmentations de la distance est lui-aussi born´ e. En effet, cette proc´ edure ne modifie pas la fonction distance estim´ ee mais fait d´ ecro? ?tre d?au moins une unit´ e le nombre x?S ef (x)×?(x). Il en r´ esulte que l?algorithme du pr´ eflot se termine. Nous allons maintenant ´ evaluer le nombre d?ex´ ecutions de la proc´ edure r´ eduire- exc` es en consid´ erant s´ epar´ ement les r´ eductions saturantes et non saturantes. Lemme 3.8. La proc´ edure pr´ eflot r´ ealise au plus 2nm r´ eductions saturantes. Preuve. Comme dans le cas de l?algorithme des distances estim´ ees au puits (Lemme 3.5), entre deux suppressions successives d?un m? eme arc v du graphe d?´ ecart, la distance estim´ ee du sommet v+ a augment´ e d?au moins deux unit´ es. Un m? eme arc du graphe d?´ ecart est donc supprim´ e au plus n fois (lemme 3.7). Comme une r´ eduction saturante supprime au moins un arc, l?algorithme r´ ealise au plus 2nm r´ eductions saturantes. Lemme 3.9. La proc´ edure pr´ eflot r´ ealise O(n2 m) r´ eductions non saturantes. Preuve. Nous notons T l?ensemble des sommets actifs et t un ´ el´ ement g´ en´ erique de T. Nous consid´ erons comme fonction potentiel la somme ? = t?T ?(t) des distances estim´ ees des sommets actifs. Remarquons d?abord qu?` a l?initialisation de l?algorithme, on a ? < n2 et qu?` a sa terminaison ? est nul. Lors d?une it´ eration, le sommet actif x est choisi et trois cas peuvent se pr´ esenter. a) Il n?existe pas d?arc admissible d?origine x. L?ensemble T ne change pas mais la distance estim´ ee de x augmente strictement. L?accroissement de ? est alors ´ egal ` a celui de ?(x). Il r´ esulte alors du lemme 3.7 que la somme ?1 des accroissements de ? dus aux augmentations de distance est major´ ee par 2n2 . b) Une r´ eduction saturante est r´ ealis´ ee sur v. Notons y l?extr´ emit´ e de l?arc v. La fonction distance estim´ ee ne change pas mais le sommet y peut devenir actif. L?accroissement de ? est alors major´ e par 2n (lemme 3.7). Comme l?algorithme ex´ ecute au plus 2nm r´ eductions saturantes, l?accroissement ?2 de ? d? u aux r´ eductions saturantes est major´ e par 2n2 m. c) Une r´ eduction non saturante est r´ ealis´ ee sur v. Notons y l?extr´ emit´ e de l?arc v. La fonction distance estim´ ee ne change pas, le sommet y peut devenir actif mais le sommet x n?est plus actif. L?accroissement de ? est major´ e par ?(y) ? ?(x) = ?1. Donc si l?algorithme r´ ealise N r´ eductions non saturantes, l?accroissement correspondant ?3 de ? est plus petit que ?N. Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 269 En r´ esum´ e, si nous notons ? l?accroissement total de ?, nous avons ? = ?1 +?2 +?3 et ? ? ?n2 . En utilisant les majorations pr´ ec´ edentes il vient : N ? ?3 = ?? + (?1 + ?2) ? 3n2 + 2n2 m. Les lemmes 3.7, 3.8 et 3.9 conduisent ` a l?´ evaluation de la complexit´ e de l?algorith- me du pr´ eflot. Th´ eor` eme 3.10. La proc´ edure pr´ eflot calcule un flot de valeur maximum en temps O(n2 m). Preuve. La complexit´ e de la proc´ edure augmenter-distance est O(k) si k est le nombre de successeurs de x dans G. Comme pour un m? eme sommet la distance estim´ ee est augment´ ee au plus 2n fois, le temps op´ eratoire des augmentations de distance est aussi en O(nm). Si l?on associe ` a chaque sommet actif t un indicateur i(t) qui est un arc admissible sortant de t s?il en existe ou un symbole sp´ ecial sinon, il suffit d?utiliser une structure de donn´ ees ( par exemple une liste doublement cha? ?n´ ee avec pointeurs inverses), on r´ ealise en un temps O(1) les op´ erations de mise ` a jour de l?ensemble des couples (t, i(t)) lors d?une r´ eduction d?exc` es. Le temps op´ eratoire global des r´ eductions d?exc` es est alors en O(n2 m). Il en r´ esulte une complexit´ e O(n2 m) pour la proc´ edure pr´ eflot. L?algorithme du pr´ eflot peut ? etre consid´ er´ e comme un algorithme g´ en´ erique car il laisse libre le choix ` a chaque it´ eration du nouveau sommet actif et de l?arc admissi- ble. Nous allons pr´ esenter deux variantes efficaces de cet algorithme. L?algorithme de Karzanov choisit le sommet actif le plus ´ eloign´ e du puits, l?algorithme des exc` es ´ echelonn´ es r´ eduit en priorit´ e les sommets actifs dont les exc` es sont les plus grands. 8.3.4 L?algorithme de Karzanov Cet algorithme s´ electionne ` a chaque it´ eration un sommet actif dont la distance estim´ ee au puits est maximum. Il en r´ esulte qu?entre deux ex´ ecutions cons´ ecutives de la proc´ edure augmenter-distance il y a au plus n r´ eductions non saturantes. En effet, une r´ eduction non saturante annule l?exc` es d?un sommet actif x et l?exc` es de x restera nul puisque, tant que la fonction distance estim´ ee n?est pas mise ` a jour, les sommets actifs choisis apr` es x ont un distance estim´ ee inf´ erieure ou ´ egale ` a celle de x. Le nombre total de r´ eductions non saturantes est donc en O(n3 ). Si l?on maintient pour chaque valeur possible r de la distance estim´ ee une liste des sommets actifs dont la distance estim´ ee au puits est r et un pointeur vers la liste non vide de plus grand r, la s´ election d?un sommet actif de plus grande distance estim´ ee est en O(1). La complexit´ e globale de l?algorithme de Karzanov est alors O(n3 ). Version 6 f´ evrier 2005 270 Chapitre 8. Flots 8.3.5 L?algorithme des exc` es ´ echelonn´ es L?id´ ee de r´ ealiser un ´ echelonnement des exc` es et de r´ eduire en priorit´ e les plus grands exc` es conduit ` a une variante efficace de l?algorithme du pr´ eflot. Cette variante d´ ecoupe l?ex´ ecution de l?algorithme du pr´ eflot en phases. Si au d´ ebut de la phase k on dispose d?un majorant Ek?1 de l?ensemble des exc` es, cette phase s´ electionnera tant qu?il en existe un sommet actif dont l?exc` es est sup´ erieur ou ´ egal ` a Ek?1/2. Lorsqu?il n?existe plus de tels sommets, la phase k se termine et l?on pose Ek = Ek?1/2 pour la phase k + 1. Une phase consiste donc ` a r´ eduire en priorit´ e les plus gros exc` es. Il est cependant n´ ecessaire d?affiner ce principe g´ en´ eral qui pourrait trop souvent faire converger sur un m? eme sommet une quantit´ e de flux trop grande pour pouvoir ? etre ´ equilibr´ ee. Une telle situation pour un sommet x force en effet l?algorithme ` a augmenter suffisamment la distance estim´ ee du sommet x pour qu?il apparaisse dans le graphe d?´ ecart un arc v admissible permettant de r´ eduire l?exc` es du sommet x. La nouvelle r` egle de s´ election d?un sommet actif est la suivante : Choisir un sommet actif x tel que ef (x) ? Ek?1/2 et ?(x) est minimum. La nouvelle r` egle de r´ eduction de l?exc` es d´ ecrite par la proc´ edure r´ eduire-exc` es- modifi´ e ci-dessous assure qu?au cours de la phase k les exc` es de tous les sommets actifs seront major´ es par Ek?1. proc´ edure r´ eduire-exc` es-modifi´ e(f, v); si v = u alors := min{ef (v? ), b(u) ? f(u), Ek?1 ? ef (v+ )}; f(u) := f(u) + sinon := min{ef (v? ), f(u), Ek?1 ? ef (v+ )}; f(u) := f(u) ? finsi. L?algorithme est d´ ecrit par la proc´ edure exc` es-´ echelonn´ es ci-dessous o` u l?on note B la capacit´ e maximale d?un arc de G et T(f, E) l?ensemble des sommets actifs pour le pr´ eflot f et dont l?exc` es est sup´ erieur ou ´ egal ` a E. Version 6 f´ evrier 2005 8.3. Probl` eme du flot maximum 271 proc´ edure exc` es-´ echelonn´ es( G, b, s, p); E := 2 log B ; k := 1 + log B ; initialiser-pr´ eflot; pour i de 1 ` a k faire tantque T(f, E) = ? faire choisir un sommet x dans T(f, E) de distance estim´ ee minimum; si x est une sortie du graphe d?admissibilit´ e alors augmenter-distance( x) sinon choisir un arc admissible v d?origine x; r´ eduire-exc` es-modifi´ e( f, v) finsi fintantque E := E/2 finpour. Les nouvelles r` egles de r´ eduction et de s´ election utilis´ ees par l?algorithme induisent la propri´ et´ e suivante : Lemme 3.11. Pendant la phase k, une r´ eduction non saturante porte sur au moins Ek?1/2 unit´ es de flux et l?exc` es de tout sommet reste inf´ erieur ` a Ek?1. Preuve. Soit x un sommet actif choisi lors d?une r´ eduction non saturante de la phase k et soit v l?arc admissible d?origine x et d?extr´ emit´ e y s´ electionn´ e pour cette r´ eduction. On a ?(y)=?(x) ? 1 puisque v est admissible et par cons´ equent ef (y) < Ek?1/2 d?apr` es la nouvelle r` egle de s´ election. La r´ eduction n?´ etant pas saturante, la valuation de v est sup´ erieure ou ´ egale ` a min{ef (x), Ek?1 ? ef (y)}. Comme ef (x) ? Ek?1/2 et Ek?1 ? ef (y) > Ek?1/2, la variation de flux du p` ere de v est sup´ erieure ou ´ egale ` a Ek?1/2. Consid´ erons maintenant une r´ eduction quelconque de l?exc` es du sommet actif x ` a partir de l?arc admissible v d?origine x et d?extr´ emit´ e y. Apr` es cette r´ eduction, seul le sommet y a pu voir son exc` es augmenter et cette augmentation est inf´ erieure ou ´ egale ` a Ek?1 ? ef (y). L?exc` es du sommet y inf´ erieur ` a Ek?1 au d´ ebut de la phase k restera donc inf´ erieur ` a cette valeur pendant toute cette phase. Th´ eor` eme 3.12. La complexit´ e en temps de l?algorithme exc` es-´ echelonn´ es est O(nm + n2 log B). Preuve. Evaluons le nombre de r´ eductions non saturantes au cours de la phase k en consid´ erant la fonction potentiel : F = 1 Ek?1 x?S ef (x)?(x). Version 6 f´ evrier 2005 272 Chapitre 8. Flots Au d´ ebut de cette phase, F est major´ ee par 2n2 puisque pour tout sommet x, ef (x) < Ek?1 et ?(x) ? 2n (Lemme 3.7). Lors de la s´ election d?un sommet actif x, examinons les variations de F dues aux augmentations de distance et aux r´ eductions saturantes a) Augmentation de distance. L?algorithme augmente la distance estim´ ee ?(x) de d unit´ es (d ? 1). Il en r´ esulte une augmentation de F major´ ee par d. La somme des augmentations de la distance estim´ ee d?un sommet ´ etant major´ ee par 2n, l?augmentation totale de F due aux occurrences de ce premier cas est major´ ee par 2n2 . b) R´ eduction saturante. La fonction F d´ ecroit au moins de la valeur 1/2 puisque, d?apr` es le lemme 3.11, l?exc` es de x diminue d?au moins Ek?1/2 unit´ es et l?exc` es de y augmente de la m? eme quantit´ e. Comme F reste positif par d´ efinition et qu?une r´ eduction quelconque fait d´ ecroi- tre F, le nombre de r´ eductions non saturantes au cours de la phase k est major´ e par 8n2 . Dans l?´ etude de l?algorithme du pr´ eflot, nous avons montr´ e que la complexit´ e des op´ erations autres que les r´ eductions non saturantes est O(nm). On peut d?autre part g´ erer l?ensemble des sommets actifs dont l?exc` es est sup´ erieur ou ´ egal ` a Ek?1/2 en associant ` a chaque valeur possible r de la distance estim´ ee une liste doublement cha? ?n´ ee des sommets dont la distance estim´ ee est r et l?exc` es sup´ erieur ` a Ek?1/2. Un index sur la liste non vide de plus petit r est ´ egalement maintenu. Les op´ erations d?ajout, de retrait et de s´ election d?un sommet actif sont alors en O(1) et la reconstitution des listes ` a chaque nouvelle phase en O(n). Le nombre de phases ´ etant ´ egal ` a 1 + log B , la complexit´ e globale de l?algorithme exc` es-´ echelonn´ es est O(nm + n2 log B). 8.4 Flot de co? ut minimum Nous consid´ erons dans cette section le probl` eme de la recherche d?un flot com- patible de co? ut minimum dans un r´ eseau valu´ e R = (G, a, b, c). Nous pr´ esentons d?abord les propri´ et´ es fondamentales de dualit´ e sur lesquelles s?appuient tous les algorithmes de r´ esolution du probl` eme. Nous d´ ecrivons ensuite l?algorithme pri- mal de Golberg et Tarjan pour la recherche d?un flot de co? ut mimimum dans un r´ eseau R = (G, 0, b, c). Nous montrons ensuite que l?on peut ramener le probl` eme g´ en´ eral ` a la recherche d?un flot maximum de co? ut minimum dans un r´ eseau muni d?une entr´ ee, d?une sortie et dont les arcs sont valu´ es par une capacit´ e maxi- male et un co? ut. Nous d´ ecrivons un algorithme de type dual pour la r´ esolution de ce probl` eme lorsque les co? uts sont positifs ou nuls. Nous consid´ erons enfin le probl` eme de la recherche d?un plan de transport de co? ut minimum et sa r´ esolution par l?algorithme dual d?Edmonds et Karp. Version 6 f´ evrier 2005 8.4. Flot de co? ut minimum 273 8.4.1 Graphe d?´ ecart et conditions d?optimalit´ e Soit f un flot d?un r´ eseau valu´ e R = (G, 0, b, c). Le graphe d?´ ecart du flot f est obtenu ` a partir du graphe d?´ ecart Gf d´ efini par la proc´ edure graphe-d?´ ecart de la section 8.3 en munissant simplement chaque arc v d?un co? ut, not´ e ´ egalement c(v), et d´ efini par : c(v) = c(u) si v = u ?c(u) si v = u Soit µ = ((s0, u1, s1), (s1, u2, s2), · · · , (sq?1, uq, sq)) un cycle am´ eliorant pour le flot f. Par d´ efinition, un arc avant de µ n?est pas satur´ e et un arc arri` ere de µ n?est pas vide. Il en r´ esulte que la suite ? = ((s0, v1, s1), (s1, v2, s2), · · ·, (sq?1, vq, sq)) o` u vk = uk si uk est arc avant de µ uk si uk est arc arri` ere de µ est un circuit de co? ut n´ egatif du graphe d?´ ecart Gf . R´ eciproquement ` a un circuit de co? ut n´ egatif du graphe d?´ ecart Gf correspond un cycle am´ eliorant de G. La proposition 4.1, cons´ equence directe du th´ eor` eme 2.7, ´ enonce une condition n´ ecessaire et suffisante d?optimalit´ e qui porte uniquement sur le graphe d?´ ecart Gf . Proposition 4.1. Un flot f d?un r´ eseau R = (G, 0, b, c) est de co? ut minimum si et seulement si son graphe d?´ ecart Gf ne poss` ede aucun circuit de co? ut strictement n´ egatif. 8.4.2 Probl` eme dual et conditions d?optimalit´ e Nous avons ´ etabli que la recherche d?un flot de co? ut minimum correspond ` a la r´ esolution d?un programme lin´ eaire dont la matrice est la matrice d?incidence sommets-arcs du graphe G. Les algorithmes de r´ esolution efficaces de ce probl` eme vont d?une part exploiter la structure de cette matrice (c?est-` a-dire travailler sur le graphe d?´ ecart) et d?autre part tirer parti des propri´ et´ es de dualit´ e issues de la programmation lin´ eaire. Le programme lin´ eaire primal (PLP) associ´ e ` a un probl` eme de flot de co? ut mi- nimum dans un r´ eseau R = (G, 0, b, c) s?´ ecrit : ?u ? A, f(u) ? 0 ?u ? A, f(u) ? b(u) ?x ? S, ef (x) = 0 MIN u?A c(u)f(u) (PLP) o` u les variables f(u) sont rationnelles. Le programme lin´ eaire dual (PLD) associe ` a chaque sommet x du r´ eseau la variable sans contrainte de signe ?(x) appel´ ee potentiel du sommet x, et associe Version 6 f´ evrier 2005 274 Chapitre 8. Flots ` a chaque arc u du r´ eseau une variable positive ou nulle not´ ee ?(u). Le programme dual (PLD) s?´ ecrit : ?u ? A, ??(u) + ?(u+ ) ? ?(u? ) ? c(u) ?u ? A, ?(u) ? 0 MAX ? u?A b(u)?(u) (PLD) L?existence d?un sous-ensemble dominant des solutions du programme dual mon- tre que les v´ eritables inconnues du programme dual sont les potentiels des som- mets de G. En effet si nous fixons le potentiel de chaque sommet, il est imm´ ediat de v´ erifier que la meilleure solution du programme dual correspond aux valeurs des variables ?(u) calcul´ ees par la formule (?) ci-dessous : ?u ? A, ?(u) = max{0, ?c(u) + ?(u+ ) ? ?(u? )}. (?) Nous ne consid` ererons donc dans la suite que des solutions dominantes du pro- gramme dual, c?est-` a-dire des couples (?, ?) pour lesquels les valeurs des ?(u) r´ esultent de ? par la formule (?). Une solution du dual sera donc compl` etement caract´ eris´ ee par un ensemble de potentiels ?. Etant donn´ es un flot f solution du programme lin´ eaire primal et une solution (?, ?) du programme lin´ eaire dual, le th´ eor` eme des ´ ecarts compl´ ementaires, corol- laire du th´ eor` eme de la dualit´ e, fournit une condition n´ ecessaire et suffisante d?optimalit´ e des deux solutions. Cette condition, not´ ee (OPT), s?´ ecrit : ?u ? A, ?(u)[f(u) ? b(u)] = 0 ?u ? A, f(u)[c(u) + ?(u) ? ?(u+ ) + ?(u? )] = 0 (OPT) Les conditions d?optimalit´ e pr´ ec´ edentes peuvent ? etre exprim´ ees de mani` ere plus condens´ ee ` a partir du graphe d?´ ecart en utilisant la notion de co? ut r´ eduit. Soit ? une fonction potentiel d´ efinie sur les sommets de G et f un flot, le co? ut r´ eduit re- latif ` a ? d?un arc v du graphe d?´ ecart Gf est d´ efini par ¯ c?(v)=c(v)+?(v? )??(v+ ). La Proposition 4.2 fournit une condition n´ ecessaire et suffisante d?optimalit´ e fond´ ee sur les co? uts r´ eduits du graphe d?´ ecart Gf . Proposition 4.2. Un flot f et un ensemble de potentiels ? sont optimaux si et seulement si le co? ut r´ eduit relatif ` a ? de tout arc du graphe d?´ ecart Gf est positif ou nul. Preuve. Soient f un flot et (?, ?) une solution dominante du dual qui satisfont la condition (OPT). Consid´ erons un arc v du graphe d?´ ecart Gf . Si v = u (c?est-` a-dire si v est le repr´ esentant conforme de l?arc u de G), l?arc u n?est pas satur´ e et l? on a d?apr` es (OPT) : ?(u) = 0. Il r´ esulte alors de la formule (?) que ?(u+ ) ? ?(u? ) ? c(u) ? 0 et donc que ¯ c?(v)=c(v) + ?(v? ) ? ?(v+ ) ? 0. Si v = u (c?est-` a-dire si v est le repr´ esentant non conforme de l?arc u de G), l?arc u n?est pas vide et l? on a d?apr` es (OPT) : 0 ? ?(u) = ?c(u) + ?(u+ ) ? ?(u? ). Comme v+ = u? et v? = u+ , nous avons ¯ c?(v)=c(v) + ?(v? ) ? ?(v+ ) ? 0. Version 6 f´ evrier 2005 8.4. Flot de co? ut minimum 275 Supposons maintenant que le co? ut r´ eduit de tout arc du graphe d?´ ecart soit positif ou nul. Pour un arc u de G, trois cas sont possibles : L?arc u est libre. Les deux arcs u et u de Gf ont des co? uts r´ eduits positifs ou nuls, et donc nuls puisque ¯ c?(u ) = ?¯ c?(u ); il en r´ esulte que ?(u) = 0 et que la condition (OPT) est satisfaite pour l?arc u. L?arc u est satur´ e. Le co? ut r´ eduit de l?arc u ´ etant positif ou nul, on a ?c(u) + ?(u+ ) ? ?(u? ) ? 0. On a donc d?apr` es (?) : ?(u) = ?c(u) + ?(u+ ) ? ?(u? ) et la condition (OPT) est satisfaite pour l?arc u. L?arc u est vide. Le co? ut r´ eduit de l?arc u ´ etant positif ou nul, on a c(u) + ?(u? ) ? ?(u+ ) ? 0. On a donc d?apr` es (?) : ?(u) = 0. La condition (OPT) est satisfaite pour l?arc u. 8.4.3 Un algorithme primal Le probl` eme consid´ er´ e dans cette section est la recherche d?un flot compatible de co? ut minimum dans un r´ eseau valu´ e R = (G, 0, b, c). Aucune restriction n?est faite ici sur le signe des co? uts c(u). L?algorithme que nous allons d´ ecrire, d? u ` a Gold- berg et Tarjan d´ etruit syst´ ematiquement ` a chaque it´ eration le cycle am´ eliorant de G associ´ e ` a un circuit de co? ut moyen minimum du graphe d?´ ecart. Cet al- gorithme est de type primal puisqu?` a chaque ´ etape, il fournit un flot compatible tout en am´ eliorant la satisfaction des conditions d?optimalit´ e duales. La proc´ edure Goldberg-Tarjan(R) ci-dessous r´ ealise cet algorithme. proc´ edure Goldberg-Tarjan(R); f :=0; :=maxu?A |c(u)|; tantqu?il existe un circuit n´ egatif dans Gf faire ? :=circuit-co? ut-moyen-minimum(Gf ); f :=augmenter-flot-sur-circuit(f, ?) fintantque. Soit f un flot et Gf le graphe d?´ ecart associ´ e. Le co? ut moyen d?un circuit ? de q arcs dans Gf est la quantit´ e v?? c(v)/q. Remarquons que pour toute fonction potentiel ?, le co? ut r´ eduit moyen d?un circuit de Gf est ´ egal ` a son co? ut moyen. Soit ?(f) le co? ut moyen minimum d?un circuit de Gf . Remarquons qu?il existe un circuit ´ el´ ementaire de co? ut ?(f). L?algorithme de Karp, de complexit´ e O(nm), permet de calculer le co? ut moyen minimum d?un circuit dans un graphe valu´ e de n sommets et m arcs (voir exercices). Le flot f est dit -optimal s?il existe une fonction potentiel ? telle que : ?v ? Af , ¯ c?(v) ? ? . Version 6 f´ evrier 2005 276 Chapitre 8. Flots Il r´ esulte de cette d´ efinition qu?un flot 0-optimal est de co? ut minimum. La propo- sition suivante montre que si est suffisamment petit, un flot -optimal est de co? ut minimum. Proposition 4.3. Si 0 ? < 1/n, un flot -optimal f est de co? ut minimum. Preuve. Soit ? un circuit ´ el´ ementaire de Gf . On a c(?) = ¯ c?(?) > ?1. La valeur de ? est donc positive ou nulle. Etant donn´ e un flot f, on appelle d´ eviation de f la valeur minimum de pour laquelle le flot f est -optimal. La d´ eviation de f, not´ ee (f), est li´ ee au co? ut moyen minimum d?un circuit de Gf . Th´ eor` eme 4.4. Soit f un flot. La d´ eviation de f est ´ egale ` a max{0, ??(f)}. Preuve. Si le flot f est -optimal, alors pour un circuit quelconque ? de q arcs dans Gf , on a c(?) ? ?q . Il en r´ esulte que ? ??(f). Nous montrons maintenant qu?il existe effectivement une fonction potentiel ? pour laquelle le flot f est ??(f)- optimal. Supposons d?abord que le graphe Gf soit fortement connexe. D´ efinissons pour chaque arc v de Gf la valuation c (v) = c(v) ? ?(f) et choississons un sommet source s. Pour tout circuit ? de q arcs dans Gf , on a c (?) = c(?) ? q?(f) ? 0. Pour tout sommet x, il existe donc un chemin de co? ut minimum de s ` a x dans Gf pour la valuation c . Si l?on d´ efinit le potentiel ?(x) du sommet x par la valeur de ce chemin, il vient : ?v ? Af , ?(v+ ) ? ?(v? ) + c(v) ? ?(f). Il en r´ esulte que le flot f est ??(f)-optimal. Si le graphe Gf n?est pas fortement connexe, on note {C1, . . . , Cp} ses composantes fortement connexes. Tous les circuits du graphe induit par Ci ont une valeur positive ou nulle pour la valuation c . En consid´ erant le graphe induit par Ci seul, nous pouvons associer ` a chaque sommet x de Ci une fonction ? (x) qui v´ erifie l?ingalit´ e pr´ ec´ edente sur tous les arcs du graphe (fortement connexe) induit par Ci. La valuation aij d?un arc (Ci, Cj) du graphe r´ eduit de Gf est d´ efinie par : aij = min{c (v) + ? (v? ) ? ? (v+ ) | v ? Af , v? ? Ci, v+ ? Cj}. Le graphe r´ eduit de Gf ´ etant sans circuits, il existe pour tout sommet Ci un chemin de co? ut minimum ?i d?extr´ emit´ e Ci. Par d´ efinition des valeurs ?i, nous avons ?j ? ?i ? aij pour tout arc (Ci, Cj). Le potentiel d?un sommet x de Ci est alors d´ efini par ?(x) = ? (x)+?i. Pour tout arc v de Gf appartenant ` a un graphe induit par une composante fortement connexe, on a bien s? ur ¯ c?(v) ? ??(f). Soit maintenant un arc v tel que v? ? Ci et v+ ? Cj, on a : ?(v+ ) ? ?(v? ) = ? (v+ ) ? ? (v? ) + ?j ? ?i ? ? (v+ ) ? ? (v? ) + aij ? c (v). Version 6 f´ evrier 2005 8.4. Flot de co? ut minimum 277 Le flot f est donc ??(f)-optimal pour le potentiel ?. Il est utile dans la suite de consid´ erer le graphe partiel de Gf constitu´ e des arcs dont le co? ut r´ eduit pour un potentiel ? est strictement n´ egatif. Nous appellerons ce graphe le graphe d?inadmissibilit´ e de f pour la fonction potentiel ? et nous le noterons G? f (?). La proposition suivante montre que si un flot f est -optimal pour la fonction potentiel ? et si G? f (?) est sans circuits, la d´ eviation de f est au plus (1 ? 1/n) . Proposition 4.5. Soit f un flot -optimal pour le potentiel ?. Si le graphe d?inadmissibilit´ e de f est sans circuit, alors le flot f est (1 ? 1/n) -optimal. Preuve. Soit ? un circuit ´ el´ ementaire de q arcs dans Gf . Le circuit ? contient au moins un arc de co? ut r´ eduit positif. Le co? ut moyen de ? qui est au moins ´ egal ` a ?(1 ? 1/q) est minor´ e par ?(1 ? 1/n) . Il en r´ esulte que pour un circuit de co? ut moyen minimum, on a ?(f) ? ?(1 ? 1/n) . On d´ eduit alors le r´ esultat du th´ eor` eme 4.4. Convergence La convergence de l?algorithme est assur´ ee car le flot g r´ esultant de la destruction d?un circuit ? de co? ut moyen minimum dans Gf par la proc´ edure augmenter- flot-sur-circuit(f, ?) poss` ede une d´ eviation au plus ´ egale ` a celle du flot f. Les deux lemmes suivants pr´ ecisent les conditions de cette convergence. Lemme 4.6. Soit g le flot r´ esultant d?un flot -optimal f apr` es la destruction d?un circuit de co? ut moyen minimum dans Gf . Les d´ eviations de f et g satisfont (g) ? (f). Preuve. D?apr` es la d´ efinition de la d´ eviation (f) du flot f, il existe un potentiel ? tel que pour tout arc v de Gf on a ¯ c?(v) ? ? (f). Soit ? le circuit d´ etruit. Comme le co? ut moyen des arcs de ? est ´ egal ` a ? (f), le co? ut r´ eduit pour ? d?un arc quelconque de ? est ´ egal ` a ? (f). Soit v un arc de Gg qui n?existe pas dans Gf . Si v = u , alors l?arc u est un arc de ?. On a donc ¯ c?(u ) = ? (f) et ¯ c?(v) = (f). On aboutit ` a la m? eme conclusion si v = u . Il en r´ esulte que (g) ? (f). Nous noterons dans la suite me le nombre d?arcs du graphe d?´ ecart Gf qui reste toujours inf´ erieur ou ´ egal ` a 2m. Le lemme suivant ´ evalue le gain obtenu lorsque l?algorithme ex´ ecute me it´ erations successives. Lemme 4.7. Soit f un flot et soit g le flot obtenu apr` es me destructions de circuits. Si g n?est pas de co? ut minimum, sa d´ eviation satisfait (g) ? (1?1/n) (f) . Version 6 f´ evrier 2005 278 Chapitre 8. Flots Preuve. Soit f un flot -optimal pour le potentiel ?. La destruction d?un circuit ? de co? ut moyen minimum dont tous les arcs ont un co? ut r´ eduit n´ egatif ne peut cr´ eer que des arcs de co? ut r´ eduit positif ou nul et supprime au moins un arc de G? f (?). Nous consid´ erons alors deux cas pour le flot g obtenu apr` es les me it´ erations successives : Lors de chaque destruction, les arcs du circuit d´ etruit ont un co? ut r´ eduit n´ egatif ou nul. D?apr` es la remarque pr´ ec´ edente, le graphe d?inadmissibilit´ e G? f (?) est vide et le flot g est donc de co? ut minimum. Soit ? le premier circuit supprim´ e contenant un arc de co? ut r´ eduit positif. D?apr` es le lemme 4.6, la d´ eviation du flot h obtenu avant la suppression de ? est inf´ erieure ou ´ egale ` a (f). D?apr` es la preuve de la proposition 4.5, le co? ut moyen de ? vaut au moins ?(1 ? 1/n) . Il r´ esulte alors du th´ eor` eme 4.4 et du lemme 4.6 que la d´ eviation des flots obtenus apr` es h est inf´ erieure ou ´ egale ` a (1 ? 1/n) . Les lemmes 4.6 et 4.7 sont alors suffisants pour majorer polynomialement le nom- bre d?it´ erations de l?algorithme. Th´ eor` eme 4.8. L?algorithme de Goldberg et Tarjan r´ ealise O(nm log nC) it´ e- rations. Preuve. Soit f le flot courant. Lors de l?initialisation de l?algorithme, on a (f) ? C. D?apr` es la proposition 4.3, l?algorithme se termine d` es que la d´ eviation du flot courant est strictement inf´ erieure ` a 1/n. Soit K le nombre total d?it´ erations et posons K ? 1 = pq + r, (0 ? r < p). La d´ eviation obtenue apr` es pq destructions est inf´ erieure ou ´ egale ` a (1 ? 1/n)q C d?apr` es le lemme 4.7 et sup´ erieure ou ´ egale ` a 1/n puisque l?algorithme n?est pas termin´ e. On a donc (1 ? 1/n)q C ? 1/n ou encore (1 ? 1/n) (K?1)/p C ? 1/n. Comme pour n > 1 on a ln(1 ? 1/n) < ?1/n, il vient : (K ? 1)/p ? ? ln nC/ ln(1 ? 1/n) ? n ln nC. Il en r´ esulte que K = O(mn log nC). Si l?on utilise l?algorithme de Karp pour d´ eterminer ` a chaque it´ eration un circuit de co? ut moyen minimum, la complexit´ e de l?algorithme de Goldberg et Tarjan est O(n2 m2 log nC). En fait Goldberg et Tarjan ont montr´ e que le nombre total d?it´ erations est major´ e par un polyn? ome en n et m. La preuve due ` a Tardos repose sur une propri´ et´ e suppl´ ementaire des flots -optimaux que nous ´ enon¸ cons sans d´ emonstration. Proposition 4.9. Soit f un flot -optimal pour le potentiel ? et v un arc de Gf de co? ut r´ eduit sup´ erieur ou ´ egal ` a 2n . Le flux du p` ere de v dans G est le m? eme pour tous les flots -optimaux. Cette proposition permet d?´ etablir que la complexit´ e en temps de l?algorithme de Goldberg et Tarjan est O(n2 m2 min{log nC, m log n}). Version 6 f´ evrier 2005 8.4. Flot de co? ut minimum 279 Une am´ elioration de l?algorithme La version de l?algorithme de Goldberg et Tarjan d´ ecrite dans la section pr´ ec´ eden- te est int´ eressante ` a un double point de vue, d?une part elle exploite directement la condition n´ ecessaire et suffisante d?optimalit´ e d?un flot compatible et d?autre part il s?agit d?un algorithme fortement polynomial, c?est-` a-dire polynomial lorsque le co? ut d?une op´ eration arithm´ etique ´ el´ ementaire est polynomial en le nombre de bits n´ ecessaires pour coder ses op´ erandes. Cependant cet algorithme est moins ef- ficace que d?autres algorithmes fortement polynomiaux fond´ es sur des techniques d?´ echelonnement ou d?approximations. Goldberg et Tarjan ont alors propos´ e une nouvelle version qui constitue l?un des meilleurs algorithmes connus aujourd?hui pour des r´ eseaux pas trop denses dont les co? uts (entiers) ne sont pas trop grands. Cette am´ elioration consiste ` a rem- placer la destruction d?un circuit de co? ut moyen minimum (qui co? ute O(nm) op´ erations ´ el´ ementaires) par une s´ erie d?au plus m destructions de circuits du graphe d?inadmissibilit´ e suivie d?un ajustement de la fonction potentiel. Une structure de donn´ ees ad-hoc, appel´ ee arbres dynamiques, permet de r´ ealiser une destruction de circuit ou un ajustement de potentiel en O(log n). Soit f le flot courant et soit ? le potentiel courant. Le plus petit , not´ e (f, ?), pour lequel le flot f est -optimal ` a ? fix´ e, est d´ efini par : (f, ?) = max{0, ? min{¯ c?(v) | v ? Af }}. Rappelons que le graphe d?inadmissibilit´ e G? f (?) est form´ e des arcs v de Gf dont le co? ut r´ eduit ¯ c?(v) par rapport ` a ? est strictement n´ egatif. L?algorithme peut alors ? etre d´ ecrit comme suit : proc´ edure Goldberg-Tarjan-plus(R); f :=0; ? :=0; tantque (f, ?) > 1/n faire tantque G? f (?) poss` ede un circuit faire d´ etruire-circuit(G? f (?)) fintantque ajuster-potentiel(?) fintantque. La proc´ edure d´ etruire-circuit d´ etermine un circuit ? de G? f (?), et d´ etruit ce circuit par un appel ` a la proc´ edure augmenter-flot-sur-circuit. La proc´ edu- re ajuster-potentiel transforme ? en un potentiel ? tel que (f, ? ) ? (f, ?). Si l?on d´ efinit une it´ eration comme une s´ erie de destructions de circuits suivie d?un ajustement de la fonction potentiel (boucle tantque ext´ erieure), le th´ eor` eme suivant montre que cet algorithme converge apr` es au plus O(n log nC) it´ erations. Version 6 f´ evrier 2005 280 Chapitre 8. Flots Th´ eor` eme 4.10. La proc´ edure Goldberg-Tarjan-plus calcule un flot de co? ut minimum en O(n log nC) it´ erations. Preuve. Consid´ erons une it´ eration. Chaque destruction de circuit dans G? f (?) n?ajoute pas d?arcs ` a G? f (?) mais en d´ etruit au moins un. Le graphe G? f (?) sera donc sans circuits apr` es au plus me destructions de circuits. Si, apr` es ces destructions, le graphe G? f (?) est vide, le flot f est de co? ut minimum, sinon le flot f est (1 ? 1/n) (f, ?)-optimal d?apr` es le lemme 4.7. La convergence et le nombre maximum d?it´ erations r´ esultent alors du lemme 4.3 et du th´ eor` eme 4.4. Goldberg et Tarjan ont cr´ e´ e une structure de donn´ ees sp´ ecifique, appel´ ee arbre dynamique qui permet de r´ ealiser chaque destruction de circuit et ajustement de potentiel en O(log n). Indiquons simplement qu?elle permet de g´ erer une famille d?arborescences dont chaque arc correspond ` a un arc v du graphe G? f (?) valu´ e par b(u) ? f(u) si v = u ou par f(u) si v = u . Cette structure conduit ` a un algorithme de complexit´ e O(nm(log n) min{log nC, m log n}) qui est l?un des meilleurs connus aujourd?hui. 8.4.4 Flot maximum de co? ut minimum Soit R = (G, a, b, c) un r´ eseau valu´ e et f un flot compatible de ce r´ eseau. Nous montrons que l?on peut ramener la recherche d?un flot compatible de co? ut min- imum du r´ eseau R ` a celle d?un flot maximum de co? ut minimum dans un r´ eseau R muni d?une entr´ ee, d?une sortie, et dont les arcs sont valu´ es par une capacit´ e maximale et un co? ut. La construction du r´ eseau R repose sur le signe des exc` es ea(x) des sommets de G pour la fonction a. Nous noterons S+ (respectivement S?) l?ensemble des sommets de G dont l?exc` es pour a est strictement positif (re- spectivement n´ egatif) et ? la quantit´ e x?S+ ea(x)=? x?S? ea(x). Nous sup- poserons ? strictement positif. Les sommets du r´ eseau R sont ceux du graphe G auxquels on adjoint un sommet source s et un sommet puits p. L?ensemble des arcs du r´ eseau R est form´ e : (a) des arcs u du graphe G o` u chaque arc u est muni d?une capacit´ e minimale nulle, d?une capacit´ e maximale ´ egale ` a b(u) ? a(u) et du co? ut c(u); (b) pour chaque sommet x de S+ d?un nouvel arc usx, d?origine s, d?extr´ emit´ e x, de capacit´ e minimale nulle, de capacit´ e maximale ea(x) et de co? ut nul; (c) pour chaque sommet x de S? d?un nouvel arc uxp, d?origine x, d?extr´ emit´ e p, de capacit´ e minimale nulle, de capacit´ e maximale ?ea(x) et de co? ut nul; (d) d?un arc de retour u0 d?origine p, d?extr´ emit´ e s, de capacit´ e minimale nulle, de capacit´ e maximale ? et de co? ut nul. La figure 4.1 montre en (A) un r´ eseau valu´ e R o` u sur chaque arc sont inscrits le triplet (a(u), b(u), c(u)) et le flux f (u) en gras et o` u ` a c? ot´ e de chaque sommet l?exc` es pour la fonction a est soulign´ e. Sur la partie (B) est repr´ esent´ e le r´ eseau R o` u sur chaque arc sont incrits le couple (b(u), c(u)) et en gras le flux f(u). Version 6 f´ evrier 2005 8.4. Flot de co? ut minimum 281 1 1 2 3 5 4 1,2,-1 0,2,2 0,2,-1 0,2,-2 1,1,1 2,4,4 1,2,3 1 1 1 2 3 1 1 -1 0 -1 1 Le réseau R 1 2 p 3 5 4 s (2,0) (1,0) (1,0) (2,-2) (1,-1) (2,2) (2,-1) (2,4) (0,1) (1,0) (1,3) (1,0) 2 1 1 0 1 0 1 1 1 1 1 1 Le réseau R' Figure 4.1: Les r´ eseaux R et R . On appelle flot saturant du r´ eseau R un flot compatible de valeur ?. La propo- sition 4.11 ´ etablit la correspondance entre les flots compatibles de R et les flots saturants de R . Proposition 4.11. Il existe une bijection entre les flots compatibles du r´ eseau R et les flots saturants du r´ eseau R . L?image d?un flot compatible de co? ut minimum du r´ eseau R est un flot maximum de co? ut minimum du r´ eseau R . Preuve. Soit f un flot compatible de R, nous lui associons l?application f d´ efinie sur les arcs du r´ eseau R par : f (u) = ? ? ? ? ? ea(x) si u = usx ?ea(x) si u = uxp f(u) ? a(u) si u ? A ? si u = u0 La fonction f satisfait les contraintes de capacit´ e du r´ eseau R , montrons que cette fonction est aussi un flot de R en calculant les exc` es des diff´ erents sommets. Il est d?abord clair que ef (s)=ef (p)=0. Consid´ erons un sommet x de S+, nous avons : ef (x) = (ef (x) ? ea(x)) + f (usx) = 0; de m? eme pour un sommet x de S?, nous avons : ef (x) = (ef (x) ? ea(x)) ? f (uxp) = 0. La fonction f est donc un flot saturant du r´ eseau R . R´ eciproquement, soit g un flot saturant du r´ eseau R . La fonction f d´ efinie sur les arcs de G par f(u) = g(u) + a(u) est le seul flot compatible de R v´ erifiant f = g. Version 6 f´ evrier 2005 282 Chapitre 8. Flots La correspondance f ? f est donc bien une bijection. On remarque de plus que les co? uts des flots f et f diff` erent de la constante a c, ce qui implique la seconde partie de la proposition. Il r´ esulte de la propri´ et´ e pr´ ec´ edente que la recherche d?un flot de valeur maximum de s ` a p dans le r´ eseau R permet de r´ epondre au probl` eme de l?existence d?un flot compatible pour le r´ eseau R. En effet, si la valeur maximum d?un flot de s ` a p dans R est inf´ erieure strictement ` a ?, le r´ eseau R ne poss` ede pas de flot compatible. Dans le cas contraire, un tel flot existe et il en est de m? eme d?un flot compatible de co? ut minimum (voir section 2.3). Un algorithme dual Une donn´ ee (G, b, s, p, c) d?un probl` eme de flot maximum de co? ut minimum est sp´ ecifi´ ee par un ´ enonc´ e (G, b, s, p) d?un probl` eme de flot maximum et une fonction c de F(A) d´ efinissant le co? ut sur chaque arc d?une unit´ e de flux. Nous supposerons dans cette section la fonction c positive ou nulle. Si ? est la valeur maximum d?un flot de s ` a p pour le probl` eme (G, b, s, p), un flot maximum de co? ut minimum est un flot de valeur ? dont le co? ut est minimum. Un couple (f, ?) o` u f est un flot du r´ eseau R est dit dual-r´ ealisable si les co? uts r´ eduits relatifs ` a ? des arcs de Gf sont positifs ou nuls. Il est dit primal-r´ ealisable si f est un flot maximum de s ` a p. Le principe de base de cet algorithme dual est de r´ ealiser ` a chaque it´ eration une augmentation de la valeur du flot ` a partir d?un chemin am´ eliorant de co? ut r´ eduit minimum dans le graphe d?´ ecart. Comme nous le d´ emontrerons, ce choix permet de d´ eterminer un nouvel ensemble de potentiels pour lequel les arcs du nouveau graphe d?´ ecart ont un co? ut r´ eduit positif ou nul. Initialisation Le flot initial est le flot nul et le potentiel initial de chaque sommet est nul ´ egalement. Comme la fonction c est positive ou nulle, les co? uts r´ eduits initiaux du premier graphe d?´ ecart sont positifs ou nuls. Le couple (0, 0) est donc dual- r´ ealisable. It´ eration courante Soit (f, ?) le couple courant dual-r´ ealisable (et non primal-r´ ealisable) r´ esultat de l?it´ eration pr´ ec´ edente. Comme le flot f n?est pas de valeur maximum, il existe au moins un chemin am´ eliorant de s ` a p dans le graphe d?´ ecart Gf . Comme les co? uts r´ eduits des arcs du graphe d?´ ecart Gf sont positifs ou nuls, il existe ´ egalement un chemin am´ eliorant µ de co? ut r´ eduit minimum. L?it´ eration courante r´ ealise d?abord une augmentation de flot ` a partir de µ en ex´ ecutant la proc´ edure augmenter- flot(f, µ) et met ensuite ` a jour le potentiel de chaque sommet comme l?indique Version 6 f´ evrier 2005 8.4. Flot de co? ut minimum 283 la proc´ edure modifier-potentiels(f, ?) ci-dessous. Dans cette proc´ edure, on note T l?ensemble des sommets accessibles ` a partir de s dans Gf et ¯ l?(t) le co? ut r´ eduit minimum d?un chemin de s ` a t dans Gf . proc´ edure modifier-potentiels(f, ?); M :=maxt?T ¯ l?(t); pour tout sommet t de T faire ?(t) :=?(t) + ¯ l?(t); pour tout sommet z de S ? T faire ?(z) :=?(z) + M. Cette proc´ edure augmente le potentiel de tout sommet t de T du co? ut r´ eduit minimum d?un chemin de s ` a t dans Gf et augmente le potentiel des autres sommets d?une m? eme quantit´ e M ´ egale au plus grand co? ut r´ eduit minimum d?un chemin d?origine s dans Gf . L?it´ eration courante, iml´ ement´ ee par la proc´ edure changer-de-couple ci-dessous r´ ealise le changement de flot et la modification des potentiels : proc´ edure changer-de-couple(f, ?, µ); augmenter-flot(f, µ); modifier-potentiels(f, ?). La proposition 4.12 montre que les co? uts r´ eduits du nouveau graphe d?´ ecart et relatifs aux nouveaux potentiels sont positifs ou nuls. Proposition 4.12. Les co? uts r´ eduits du couple (f , ? ) calcul´ es par la proc´ edure changer-de-couple(f, ?, µ) sont positifs ou nuls. Preuve. Consid´ erons d?abord le cas d?un arc v de Gf qui n?existait pas dans Gf . Si v = u , l?arc u est un arc de µ. Comme µ est un chemin de co? ut r´ eduit minimum pour le couple (f, ?), on a : ¯ l?(u? ) = ¯ l?(u+ ) + ¯ c?(u ). Comme u? et u+ appartiennent ` a T, nous avons : ¯ c? (u ) = c(u ) + ? (u? ) ? ? (u+ ) = ?c(u ) + (?(u? ) + ¯ l?(u? )) ? (?(u+ ) + ¯ l?(u+ )). En regroupant les termes correspondant ` a ¯ c?(u ), il vient : ¯ c? (u ) = ?¯ c?(u ) + ¯ l?(u? ) ? ¯ l?(u+ ) = 0. Si v = u , un calcul analogue montre que le nouveau co? ut r´ eduit de l?arc v est nul. Version 6 f´ evrier 2005 284 Chapitre 8. Flots Consid´ erons maintenant un arc v de Gf qui est aussi dans Gf . Il r´ esulte de la d´ efinition de T que seuls les trois cas suivants sont possibles : (1) v? ? T, v+ ? T. On a alors par d´ efinition de ¯ l? : ¯ c? (v) = ¯ c?(v) + ¯ l?(v? ) ? ¯ l?(v+ ) ? 0. (2) v? ? S ? T, v+ ? S ? T. On a alors puisque (f, ?) est dual-r´ ealisable : ¯ c? (v) = ¯ c?(v) + M ? M ? 0. (3) v? ? S ? T, v+ ? T. On a alors par d´ efinition de M : ¯ c? (v) = ¯ c?(v) + M ? ¯ l?(v+ ) ? 0. Il en r´ esulte que tous les nouveaux co? uts r´ eduits sont positifs ou nuls. Terminaison Chaque augmentation de la valeur du flot r´ ealis´ ee par la proc´ edure changer- de-couple porte sur au moins une unit´ e de flux. L?algorithme se termine donc apr` es au plus B = min{b? (p), b+ (s)} it´ erations. A l?issue de la derni` ere it´ eration, le flot f est de valeur maximum et les arcs de Gf ont un co? ut r´ eduit positif ou nul par rapport au dernier ensemble de potentiels. La proc´ edure flot-max-co? ut- min(G, b, s, p, c) ci-dessous d´ ecrit l?algorithme complet. proc´ edure flot-max-co? ut-min(G, b, s, p, c); f := 0; ? =: 0; T := S ; pour tout t de T faire calculer ¯ l?(t); tantque p ? T faire soit µ un chemin am´ eliorant de co? ut r´ eduit ¯ l?(p); changer-de-couple(f, ?, µ); T :=sommets-accessibles(f, ?); pour tout t de T faire calculer ¯ l?(t) fintantque. Complexit´ e Le nombre d?it´ erations de l?algorithme est major´ e par B = min{b? (p), b+ (s)} puisque chaque changement de couple augmente la valeur du flot d?au moins une unit´ e. La complexit´ e d?une it´ eration est domin´ ee par le calcul des co? uts r´ eduits minimum des chemins de s aux sommets de T. Pour ce calcul on peut utiliser l?algorithme de Dijkstra dont la complexit´ e est O(m log n) pour un graphe d?´ ecart Version 6 f´ evrier 2005 8.4. Flot de co? ut minimum 285 quelconque. Il en r´ esulte une complexit´ e globale O(mB log n) pour l?algorithme flot-max-co? ut-min(G, b, s, p, c). Cet algorithme n?est donc pas polynomial, mais seulement pseudo-polynomial en raison du terme B. La faiblesse de cet algorithme tient clairement au fait qu?une it´ eration compl` ete est r´ ealis´ ee pour une augmentation insuffisante de la valeur du flot. 8.4.5 Plan de transport de co? ut minimum Nous consid´ erons dans cette section un probl` eme de transport sp´ ecifi´ e par un graphe G = (S, A), une fonction de co? ut de F(A) positive ou nulle et une fonction d de F(S), d´ efinissant l?offre et la demande et v´ erifiant s?S d(s) = 0. La fonction d permet de classer les sommets en sommets fournisseurs (si d(s) > 0), sommets clients (si d(s) < 0) et sommets de transit (si d(s) = 0). On note respectivement F, C et T les sous-ensembles des sommets fournisseurs, clients et de transit. On suppose de plus qu?il existe au moins un chemin de G liant un sommet fournisseur quelconque ` a un sommet client quelconque. Un plan de transport est une fonction x : A ? Q+ telle que : ?u ? A, x(u) ? 0 ?s ? S, ex(s) = ?d(s). Un plan de transport est de co? ut minimum si son co? ut c x est minimum. Ce probl` eme est un cas particulier important du probl` eme du flot maximum de co? ut minimum, il se pose en effet fr´ equemment dans les applications. Le graphe d?´ ecart Gx d?un plan de transport x est d´ efini de la m? eme mani` ere que le graphe d?´ ecart Gf d?un flot f, ` a cette remarque pr` es que chaque arc de G poss` ede un repr´ esentant conforme valu´ e par +?. Tout chemin de G produit donc un chemin conforme dans Gx passant par les m? emes sommets. Un raisonnement tout ` a fait analogue ` a celui men´ e dans la section 8.4.4 permet d?´ etablir une condition d?optimalit´ e d?un couple (x, ?) o` u x est un plan de transport et ? un potentiel sur les sommets de S. Cette proposition est en fait un corollaire de la proposition 4.2. Proposition 4.13. Un plan de transport x et un potentiel ? sont optimaux si et seulement si les co? uts r´ eduits des arcs du graphe d?´ ecart Gx sont positifs ou nuls. L?algorithme de Edmonds et Karp que nous allons d´ ecrire est une extension de l?algorithme flot-max-co? ut-min du paragraphe pr´ ec´ edent. Il s?agit donc d?un algorithme dual qui repose sur l?id´ ee qu?il convient de satisfaire en priorit´ e les couples (fournisseur,client) qui sont les plus d´ eficitaires du point de vue de l?offre et de la demande. A cet effet, on appellera pseudo-plan une fonction x de F(A) positive ou nulle et l?on notera ?x(s) = d(s) ? ex(s) le d´ eficit du sommet s pour le pseudo-plan x. Si un couple (x, ?) dual-r´ ealisable est tel que tous les d´ eficits sont nuls, alors x est un plan de transport de co? ut minimum. Version 6 f´ evrier 2005 286 Chapitre 8. Flots Soit x un pseudo-plan et soit ? un entier naturel. Nous notons Px(?) (respec- tivement Nx(?)) le sous-ensemble des sommets dont le d´ eficit est sup´ erieur ou ´ egal ` a ? (respectivement inf´ erieur ou ´ egal ` a ??). Le pseudoplan x est dit ?- optimal si au moins l?un des deux ensembles Px(?) ou Nx(?) est vide. Une phase de l?algorithme de Edmonds et Karp consiste ` a transformer un pseudoplan ?-optimal en un pseudoplan ?/2-optimal en ex´ ecutant au plus n fois l?algorithme de Dijkstra pour la recherche des chemins de co? ut r´ eduit minimum. Initialisation L?algorithme est initialis´ e par le pseudoplan x = 0, le potentiel ? = 0 et ? = B o` u B = maxs?S d(s). Remarquons que ce premier pseudoplan est ?-optimal puisque Px(?) = ?. Phase courante Soit x le pseudoplan courant 2?-optimal r´ esultant de la phase pr´ ec´ edente. Une it´ eration de la phase suivante choisit d?abord un couple de sommets (s, t) o` u s ? Px(?) et t ? Nx(?). Elle d´ etermine ensuite un chemin µ de co? ut r´ eduit minimal dans Gx de s ` a t, diminue les d´ eficits des sommets s et t de la quantit´ e ? en augmentant de ? les flux transport´ es par les arcs du chemin de G form´ e par les p` eres des arcs de µ. Elle modifie enfin les potentiels pour que le nouveau pseudoplan soit dual-r´ ealisable. Cette it´ eration est r´ ep´ et´ ee tant que le pseudo- plan x n?est pas ?-optimal. La proc´ edure ci-dessous r´ ealise la phase courante de l?algorithme de Edmonds et Karp. proc´ edure phase-Edmonds-Karp(?); P := {s | ?x(s) ? ?}; N := {s | ?x(s) ? ??}; tantque (P = ? et N = ?) faire choisir s dans P et t dans N ; pour tout sommet z de S faire calculer ¯ l?(s, z) finpour; soit µ un chemin de co? ut r´ eduit minimum de s ` a t; modifier-pseudoplan(x, µ); pour tout sommet z faire ?(z) := ?(z) + ¯ l?(s, z); fintantque; ? := ?/2. La proc´ edure modifier-pseudoplan est une variante simplifi´ ee de la proc´ edure augmenter-flot qui augmente syst´ ematiquement de ? les flux des p` eres des arcs de µ. Version 6 f´ evrier 2005 8.4. Flot de co? ut minimum 287 Terminaison L?algorithme de Edmonds et Karp se termine d` es que ? < 1. Tous les d´ eficits sont alors nuls. D?o` u la proc´ edure pour l?algorithme complet : proc´ edure Edmonds-Karp(R); (x, ?) := (0, 0); ? := B ; tantque ? ? 1 faire phase-Edmonds-Karp(?) fintantque. Les figures 4.2 et 4.3 illustrent le comportement de l?algorithme sur un exemple. Pour chaque sommet, le coin sud-est contient le co? ut r´ eduit minimum de l?origine au sommet, le coin nord-est contient le potentiel courant, le coin nord-ouest con- tient le nom du sommet et le coin sud-ouest contient le d´ eficit de ce sommet. Sur chaque arc est inscrit le co? ut r´ eduit par rapport au potentiel en cours. La par- tie sup´ erieure de la figure 4.2 repr´ esente le r´ eseau initial qui est aussi le premier r´ eseau d?´ ecart; sa partie inf´ erieure repr´ esente le r´ eseau d?´ ecart apr` es la premi` ere phase (? = 2). Cette premi` ere phase choisit le chemin (arcs ´ epais) µ1=(a, e, f, c) et augmente les flux de ses arcs de trois unit´ es. La figure 4.3 correspond ` a la a 3 0 0 b 0 2 c -4 d 1 1 e 2 f -1 g -1 4 2 3 1 1 2 5 2 1 2 1 2 4 a 0 0 d 1 0 e 2 0 f -1 0 g -1 c -1 0 b 0 0 0 2 0 0 0 0 0 1 0 0 1 4 2 3 5 1 1 1 1 1 2 3 2 0 4 0 0 0 0 0 0 4 Figure 4.2: Premi` ere phase. seconde phase (? = 1). Les chemins successivement choisis sont µ2=(e, f, c), µ3=(d, g) et µ4=(e, f), et chacun conduit ` a une r´ eduction du d´ eficit de une unit´ e. Apr` es ces trois r´ eductions, le d´ eficit total est nul et le plan 3?µ1 + ?µ2 + ?µ3+?µ4 est optimal. Version 6 f´ evrier 2005 288 Chapitre 8. Flots a 0 d e 1 f -1 g 0 c 0 b 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 4 1 2 3 5 5 1 1 2 1 -1 a 0 d 0 e f g 0 c 0 b 0 0 2 0 0 0 4 2 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 1 2 3 5 1 -1 a 0 d 0 e f g 0 c 0 b 0 0 2 0 0 0 4 2 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 1 2 3 5 0 0 Figure 4.3: Seconde phase. Convergence et Complexit´ e Comme l?algorithme ex´ ecute exactement 1 + log B phases, il se termine si chaque phase r´ ealise un nombre fini d?it´ erations. Comme nous allons montrer que chaque phase r´ ealise au plus n it´ erations, l?algorithme se termine et le dernier pseudoplan est un plan de transport optimal car tous les d´ eficits sont nuls. Lemme 4.14. Une phase ex´ ecute au plus n it´ erations. Preuve. Supposons qu?une phase se termine parce que l?ensemble Px(2?) est vide. Consid´ erons alors une it´ eration quelconque de la phase suivante et soit µ le chemin de Gx d?origine s et d?extr´ emit´ e t associ´ e ` a cette it´ eration. Le d´ eficit du sommet s est r´ eduit de ? unit´ es par construction et par cons´ equent le sommet s dont le d´ eficit devient strictement inf´ erieur ` a ? ne sera plus candidat ` a une r´ eduction de d´ eficit au cours de cet m? eme phase. Un raisonnement analogue peut ? etre fait si c?est l?ensemble Nx(2?) qui est vide. Le lemme en r´ esulte. La complexit´ e de l?algorithme de Edmonds et Karp est O(nT(m, n) log B) o` u T(m, n) est la complexit´ e de l?algorithme de Dijkstra utilis´ e pour d´ eterminer ` a chaque it´ eration les chemins de co? ut r´ eduit minimum. Version 6 f´ evrier 2005 Notes 289 Lorsque les capacit´ es maximales du r´ eseau initial R sont finies, il est possible (voir exercices) de le remplacer par un r´ eseau ´ equivalent R sans limitations de capacit´ es et comportant n+m sommets et 2m arcs. En appliquant l?algorithme de Edmonds et Karp au r´ eseau R et en utilisant une version modifi´ ee de l?algorithme de Dijkstra permettant le calcul des co? uts r´ eduits minimum pour le r´ eseau R avec la m? eme complexit´ e T(m, n) que sur le r´ eseau R, on aboutit ` a un algorithme de complexit´ e O(min{m log B, m log n}T(m, n)) qui est l?un des plus efficaces connus aujourd?hui. Notes Comme les flots constituent le mod` ele de base de nombreuses applications, ils ont fait l?objet d?une recherche tr` es intense depuis les premiers r´ esultats de Ford et Fulkerson en 1956. Ces recherches ont eu essentiellement pour objectif de d´ evelopper des algorithmes de plus en plus efficaces. Citons deux ouvrages qui contiennent les r´ esultats les plus r´ ecents du domaine : R.E. Tarjan, Data Structures and Network Algorithms, SIAM Philadelphia, cha- pitre 7,1983 R.K. Ahuja, T.L. Magnanti, et J.B. Orlin, Network Flows, Sloan School of Man- agement, Work Report, MIT, 1988 L?id´ ee, due ` a Edmonds et Karp, de choisir comme chemins am´ eliorants les plus courts en nombre d?arcs a conduit ` a un algorithme de complexit´ e O(m2 n). Ind´ e- pendamment, E.A. Dinic a introduit les r´ eseaux ` a niveaux qui sont les sous- graphes du r´ eseau initial contenant les sommets et les arcs appartenant ` a au moins un plus court chemin am´ eliorant. Par un calcul de flots bloquants dans ces r´ eseaux ` a niveaux, il obtient un flot maximum en temps O(n2 m). E.A. Dinic, Algorithm for Solution of a Problem of Maximum Flow in a Network with Power Estimation, Soviet Math. Dokl.,11(1970),1277-1280 La notion de distance estim´ ee au puits, due ` a Goldberg, est une variante du calcul des r´ eseaux ` a niveaux de Dinic. Elle pr´ esente le triple avantage d?? etre de compr´ ehension plus ais´ ee, de manipulation plus simple et de conduire ` a des algo- rithmes plus performants. L?algorithme des distances estim´ ees pr´ esent´ e dans la section 8.3.2 ´ enum` ere exactement les m? emes chemins am´ eliorants que l?algorithme de Dinic. La premi` ere variante de l?algorithme du pr´ eflot est due ` a A.V. Karzanov qui l?a introduite pour les r´ eseaux ` a niveaux. A.V. Karzanov; Determining the Maximal Flow in a Network by the method of Preflows, Soviet Math. Dokl.,15(1974),434-437 La variante de l?algorithme du pr´ eflot obtenue par ´ echelonnement des exc` es est due ` a J.B. Orlin et R.K. Ahuja. Version 6 f´ evrier 2005 290 Chapitre 8. Flots Le probl` eme du flot de co? ut minimum a aussi ´ et´ e tr` es ´ etudi´ e. Citons quelques ´ etapes depuis les travaux de Ford et Fulkerson en 1962 qui pr´ esent` erent les pre- miers algorithmes primal-dual comme l?algorithme out of kilter . Les am´ eliora- tions sur des chemins du graphe d?´ ecart de co? ut r´ eduit minimum sont dues ind´ ependamment ` a Jewell, Iri, Busacker et Gowen. L?utilisation simultan´ ee des ensembles de potentiel pour obtenir des chemins dont les arcs sont de co? ut r´ eduit positif est due ` a Edmonds et Karp. C?est dans ce cadre que nous avons pr´ esent´ e l?algorithme dual pour le probl` eme du flot maximum de co? ut minimum. Le concept d? -optimalit´ e fut introduit par Bertsekas en 1979. L?algorithme pri- mal de Goldberg et Tarjan de la section 8.4.3 ainsi que sa variante fortement polynomiale sont d´ evelopp´ es dans : A.V.Goldberg et R.E.Tarjan; Finding Minimum Cost Circulations by Canceling Negative Cycles, Proc. 20th ACM Symp. on the Theory of Computing, 388- 397,(1988). Pour un probl` eme de transport, l?id´ ee de r´ ealiser un ´ echelonnement des d´ eficits des sommets est due ` a Edmonds et Karp. L?algorithme qui en r´ esulte pour la recherche d?un plan de transport de co? ut minimum est d´ evelopp´ e dans : J. Edmonds et R.M. Karp, Theoretical Improvements in Algorithmic Efficiency for Network Flow Problems, J. ACM,19,(1972),248-264. Cet algorithme a ´ et´ e ´ etendu aux r´ eseaux avec capacit´ es maximales par J.B. Orlin qui a obtenu une complexit´ e en temps de O(m log n(m + n log n)) dans : J.B. Orlin; A Faster Strongly Polynomial Minimum-Cost Flow Algorithm, Proc. 20th ACM Syp. on the Theory of Computing, 377-387,(1988). Exercices 8.1. Soit R = (G, a, b) un r´ eseau. a) Construire ` a partir de R un r´ eseau de transport R muni d?une source s et d?un puits p tel que R est consistant si et seulement si R poss` ede un flot saturant. b)En d´ eduire un algorithme pour d´ eterminer si un r´ eseau est consistant. 8.2. Soit G = (S, A) un graphe orient´ e biparti o` u S = X ? Y , X ? Y = ? et A ? X × Y . On appelle couplage de G une partie C de A telle que deux arcs quelconques de C n?ont pas d?extr´ emit´ e commune. Un couplage C est dit parfait si tout sommet de X est l?origine d?un arc de C. a) D´ emontrer que les couplages de G sont en bijection avec les flots entiers d?un r´ eseau que l?on construira. b) En d´ eduire que G poss` ede un couplage parfait si et seulement si : ?T ? X, Card(?+ (T)) ? Card(T) Version 6 f´ evrier 2005 Exercices 291 8.3. Soit G = (S, A) un graphe orient´ e connexe ` a n sommets et m arcs et soit T un sous-ensemble de sommets. On appelle cocycle associ´ e ` a T le sous-ensemble d?arcs ?(T)=?+ (T)??? (T). On associe au cocycle ?(T) le vecteur caract´ eristique T de {0, 1, ?1}m d´ efini par : T(u) = 1 si u ? ?+ (T) ?1 si u ? ?? (T) 0 sinon a) Montrer que les vecteurs caract´ eristiques d?un cycle et d?un cocycle quelconques sont orthogonaux. Montrer que le sous-espace vectoriel de Rm engendr´ e par les cocycles est de dimension n ? 1. 8.4. D´ emontrer la proposition 2.8 . 8.5. Soit R = (G, b, s, p) le r´ eseau d?un probl` eme de flot maximum. Construire un r´ eseau R contenant plusieurs coupes de valeur minimum. On note C(R) l?ensemble des coupes de valeur minimum du r´ eseau R. Montrer que C(R) est stable pour l?union et l?intersection. 8.6. D´ emontrer la proposition 4.1. 8.7. Soit G = (S, A) un graphe orient´ e fortement connexe et c : A ? Z une fonction co? ut sur les arcs. On suppose qu?il n?existe pas de circuit de co? ut stricte- ment n´ egatif. On note Fk(x) le co? ut minimum d?un chemin de k arcs de s ` a x dans G en posant Fk(x) = +? si un tel chemin n?existe pas. Si ? est u circuit de G ` a p arcs, le co? ut moyen de ? est d´ efini par : ¯ c(?) = c(?)/p. Il s?agit alors de calculer par l?algorithme de Karp le co? ut moyen minimum d?un circuit de G, c?est-` a-dire la valeur : ?? = min{¯ c(?) | ? ? C(G)} o` u C(G) est l?ensemble des circuits de G. a) Montrer que : min x?S max k?{0,...,n?1} { Fn(x) ? Fk(x) n ? k } = 0 ? ?? = 0 On notera ?(x) le co? ut minimum d?un chemin de s ` a x dans G et on montrera que : max k?{0,...,n?1} { Fn(x) ? Fk(x) n ? k } ? 0 et que l?´ egalit´ e a lieu si et seulement si Fn(x) = ?(x). On montrera ensuite qu?il existe un sommet y tel que Fn(y) = ?(y). En d´ eduire que : ?? = min x?S max k?{0,...,n?1} { Fn(x) ? Fk(x) n ? k } 8.8. Soit (G, b, s, p) le r´ eseau d?un probl` eme de flot maximum. On suppose que : 2K?1 < B = max u?A b(u) ? 2K ? 1 Version 6 f´ evrier 2005 292 Chapitre 8. Flots On peut donc coder chaque capacit´ e avec au plus K bits. Si p est un entier naturel cod´ e sur K bits, on note p(k) , k ? {1, . . . , K}, l?entier associ´ e aux k bits de poids fort de p (par exemple si p = 7 et K = 5, alors p(3) = 1). On consid` ere le probl` eme Pk = (G, bk, s, p) o` u bk(u) = b(u)(k) . a) Montrer que bk+1(u) ? {2bk(u), 2bk(u) + 1} Soit f? k la valeur maximum d?un flot de Pk, montrer que f? k+1 ? 2f? k + m o` u m est le nombre d?arcs du r´ eseau. b) En d´ eduire une variante polynomiale de l?algorithme g´ en´ erique de Ford et Fulkerson, de complexit´ e O(nm log B). 8.9. Soit R = (G, a, b, c) un r´ eseau valu´ e muni d?une fonction d?offre et de demande d : S ? Z telle que S d(s) = 0. Soit u un arc de G dont la capacit´ e minimale a(u) est strictement positive. a) Montrer que l?on peut transformer d(u? ), d(u+ ), a(u) et b(u) en d (u? ), d (u+ ), a (u) = 0 et b (u) de sorte que les flots de R et de R soient en bijection et que les co? uts de deux flots associ´ es dans la bijection diff` erent d?une constante. Soit R = (G, 0, b, c) un r´ eseau valu´ e muni d?une fonction d?offre et de demande d : S ? Z telle que S d(s) = 0. Soit u un arc de G. b) Montrer que l?on peut transformer l?arc u en deux arcs u1 et u2 de capacit´ e minimale nulle et de capacit´ e maximale infinie, tels que : u? 1 = u? , u? 2 = u+ , u+ 1 = u+ 2 = ? o` u ? est un nouveau sommet; les flots de R et du nouveau r´ eseau R se correspondent dans une bijection conservant le co? ut. Version 6 f´ evrier 2005 293 Chapitre 9 Automates Dans ce chapitre, nous pr´ esentons les bases de la th´ eorie des automates finis. Nous montrons l?´ equivalence entre les automates finis et les automates finis d´ etermi- nistes, puis nous ´ etudions des propri´ et´ es de fermeture. Nous prouvons le th´ eor` eme de Kleene qui montre que les langages reconnaissables et les langages rationnels sont une seule et m? eme famille de langages. Nous prouvons l?existence et l?unicit´ e d?un automate d´ eterministe minimal reconnaissant un langage donn´ e, et nous pr´ esentons l?algorithme de Hopcroft de minimisation. Introduction Les automates finis constituent l?un des mod` eles de calcul les plus anciens en informatique. A l?origine, ils ont ´ et´ e con¸ cus et employ´ es comme une tentative de mod´ elisation des neurones; les premiers r´ esultats th´ eoriques, comme le th´ eor` eme de Kleene, datent de cette ´ epoque. Parall` element, ils ont ´ et´ e utilis´ es en tant qu?outils de d´ eveloppement des circuits logiques. Les applications les plus cou- rantes sont ` a pr´ esent le traitement de texte, dans son sens le plus g´ en´ eral. L?ana- lyse lexicale, la premi` ere phase d?un compilateur, est r´ ealis´ ee par des algorithmes qui reproduisent le fonctionnement d?un automate fini. La sp´ ecification d?un ana- lyseur lexical se fait d?ailleurs souvent en donnant les expressions rationnelles des mots ` a reconna? ?tre. Dans le traitement de langues naturelles, on retrouve les automates finis sous le terme de r´ eseau de transitions. Enfin, le traitement de texte proprement dit fait largement appel aux automates, que ce soit pour la reconnaissance de motifs ? qui constitue l?objet du chapitre suivant ? ou pour la description de cha? ?nes de caract` eres, sous le vocable d?expressions r´ eguli` eres. De nombreuses primitives courantes dans les syst` emes d?exploitation modernes font appel, implicitement ou explicitement, ` a ces concepts. La th´ eorie des automates a ´ egalement connu de grands d´ eveloppements du point de vue math´ ematique, en liaison ´ etroite avec la th´ eorie des mono¨ ?des finis, princi- Version 6 f´ evrier 2005 294 Chapitre 9. Automates palement sous l?impulsion de M. P. Sch¨ utzenberger. Elle a aussi des liens profonds avec les th´ eories logiques. 9.1 Mots et langages Soit A un ensemble. On appelle mot sur A toute suite finie u = (a1, . . . , an) o` u n ? 0, et ai ? A pour i = 1, . . . , n. L?entier n est la longueur de u, not´ ee |u|. Si n = 0, le mot est appel´ e le mot vide, et est not´ e 1 ou ?. Si v = (b1, . . . , bm) est un autre mot, le produit de concat´ enation de u et v est le mot uv = (a1, . . . , an, b1, . . . , bm) Tout mot ´ etant le produit de concat´ enation de mots de longueur 1, on identifie les mots de longueur 1 et les ´ el´ ements de A. On appelle alors A l?alphabet, et les ´ el´ ements de A des lettres. On note A? l?ensemble des mots sur A. Si u, v et w sont des mots et w = uv, alors u est un pr´ efixe et v est un suffixe de w. Si de plus u = w (resp. v = w), alors u est un pr´ efixe propre (resp. un suffixe propre) de w. Le mot v est un facteur d?un mot w s?il existe des mots u et u tels que w = uvu . Un langage (formel) sur A est une partie X de A? . Si X et Y sont des langages, le produit XY est d´ efini par XY = {xy | x ? X, y ? Y } Ce produit est associatif, et le langage {1} est ´ el´ ement neutre pour le produit. On d´ efinit les puissances de X par X0 = {1}, et Xn+1 = Xn X pour n ? 0. L?´ etoile de X est le langage X? = n?0 Xn C?est l?ensemble de tous les produits x1 · · · xn, pour n ? 0 et x1, . . . , xn ? X. Le mot vide appartient toujours ` a X? . Il est facile de v´ erifier que X? = {1} ? XX? = {1} ? X? X Il est commode de noter X+ l?ensemble XX? = X? X. Souvent, on omettra des accolades autour de singletons; ainsi, on ´ ecrira w au lieu de {w}. Version 6 f´ evrier 2005 9.2. Automates finis 295 9.2 Automates finis 9.2.1 D´ efinition Un automate fini sur un alphabet fini A est compos´ e d?un ensemble fini Q d?´ etats, d?un ensemble I ? Q d?´ etats initiaux , d?un ensemble T ? Q d?´ etats terminaux ou finals et d?un ensemble F ? Q×A×Q de fl` eches. Un automate est habituellement not´ e A = (Q, I, T, F) Parfois, on ´ ecrit plus simplement A = (Q, I, T), lorsque l?ensemble des fl` eches est sous-entendu, mais cette notation est critiquable car l?ensemble des fl` eches est essentiel. L?´ etiquette d?une fl` eche f = (p, a, q) est la lettre a. Un calcul de longueur n dans A est une suite c = f1 · · · fn de fl` eches cons´ ecutives fi = (pi, ai, qi), c?est- ` a-dire telles que qi = pi+1 pour i = 1, . . . , n ? 1. L?´ etiquette du calcul c est |c| = a1 · · · an. On ´ ecrit ´ egalement, si w = |c|, c : p1 ? qn ou c : p1 w ? qn Par convention, il existe un calcul vide 1q : q ? q d?´ etiquette ? ou 1 (le mot vide) pour chaque ´ etat q. Les calculs peuvent ? etre compos´ es. Etant donn´ es deux calculs c : p ? q et d : q ? r, le calcul cd : p ? r est d´ efini par concat´ enation. On a bien entendu |cd| = |c| |d|. Un calcul c : i ? t est dit r´ eussi si i ? I et t ? T. Un mot est reconnu s?il est l?´ etiquette d?un calcul r´ eussi. Le langage reconnu par l?automate A est l?ensemble des mots reconnus par A, soit L(A) = {w ? A? | ?c : i ? t, i ? I, t ? T, w = |c|} Une partie X ? A? est reconnaissable s?il existe un automate fini A sur A telle que X = L(A). La famille de toutes les parties reconnaissables de A? est not´ ee Rec(A? ). La terminologie qui vient d?? etre introduite sugg` ere d?elle-m? eme une repr´ esenta- tion graphique d?un automate fini par ce qui est appel´ e son diagramme d?´ etats : les ´ etats sont repr´ esent´ es par les sommets d?un graphe (plus pr´ ecis´ ement d?un multigraphe). Chaque fl` eche (p, a, q) est repr´ esent´ ee par un arc ´ etiquet´ e qui relie l?´ etat de d´ epart p ` a l?´ etat d?arriv´ ee q, et qui est ´ etiquet´ e par l?´ etiquette a de la fl` eche. Un calcul n?est autre qu?un chemin dans le multigraphe, et l?´ etiquette du calcul est la suite des ´ etiquettes des arcs composant le chemin. Dans les figures, on attribue un signe distinctif aux ´ etats initiaux et terminaux. Un ´ etat initial est muni d?une fl` eche qui pointe sur lui, un ´ etat final est rep´ er´ e par une fl` eche qui le quitte. Parfois, nous convenons de r´ eunir en un seul arc plusieurs arcs ´ etiquet´ es ayant les m? emes extr´ emit´ es. L?arc porte alors l?ensemble de ces ´ etiquettes. En particulier, s?il y a une fl` eche (p, a, q) pour toute lettre a ? A, on tracera une fl` eche unique d?´ etiquette A. Version 6 f´ evrier 2005 296 Chapitre 9. Automates 9.2.2 Exemples L?automate de la figure 2.1 est d´ efini sur l?alphabet A = {a, b}. 1 a b b a 2 3 Figure 2.1: Automate reconnaissant le langage abA?. L?´ etat initial est l?´ etat 1, le seul ´ etat final est 3. Tout calcul r´ eussi se factorise en 1 a ? 2 b ? 3 w ? 3 avec w ? A? . Le langage reconnu est donc bien abA? . Toujours sur l?alphabet A = {a, b}, consid´ erons l?automate de la figure 2.2. a b b a a Figure 2.2: Automate reconnaissant le langage A?aba. Cet automate reconna? ?t l?ensemble A? aba des mots qui se terminent par aba. L?automate de la figure 2.3 est d´ efini sur l?alphabet A = {a, b}. b a,b a,b 1 2 Figure 2.3: Automate reconnaissant les mots contenant au moins un b. Tout calcul r´ eussi contient exactement une fois la fl` eche (1, b, 2). Un mot est donc reconnu si et seulement s?il contient au moins une fois la lettre b. L?automate de la figure 2.4 reconna? ?t l?ensemble des mots contenant un nombre impair de a. Un autre exemple est l?automate vide, ne contenant pas d?´ etats. Il reconna? ?t le langage vide. A l?inverse, l?automate de la figure 2.5 ayant un seul ´ etat qui est ` a la fois initial et terminal, et une fl` eche pour chaque lettre a ? A reconna? ?t tous les mots. Enfin, le premier des deux automates de la figure 2.6 ne reconna? ?t que le mot vide, alors que le deuxi` eme reconna? ?t tous les mots sur A sauf le mot vide, c?est-` a-dire le langage A+ . Version 6 f´ evrier 2005 9.2. Automates finis 297 a b b a Figure 2.4: Automate reconnaissant les mots contenant un nombre impair de a. A Figure 2.5: Tous les mots sont reconnus. A A (i) (i ) i Figure 2.6: Automates reconnaissant (i) le mot vide et (ii) tous les mots sauf le mot vide. 9.2.3 Automates d´ eterministes Un ´ etat q ? Q d?un automate A = (Q, I, T, F) est accessible s?il existe un cal- cul c : i ? q avec i ? I. De m? eme, l?´ etat q est coaccessible s?il existe un calcul c : q ? t avec t ? T. Un automate est ´ emond´ e si tous ses ´ etats sont accessibles et coaccessibles. Soit P l?ensemble des ´ etats qui sont ` a la fois accessibles et coac- cessibles, et soit A0 = (P, I ? P, T ? P, F ? P × A × P). Il est clair que A0 est ´ emond´ e. Comme tout calcul r´ eussi de A ne passe que par des ´ etats accessibles et coaccessibles, on a L(A0 ) = L(A). Emonder un automate fini revient ` a calculer l?ensemble des ´ etats qui sont des- cendants d?un ´ etat initial et ascendants d?un ´ etat final. Cela peut se faire en temps lin´ eaire en fonction du nombre de fl` eches (d?arcs), par les algorithmes du chapitre 4. Dans la pratique, les automates d´ eterministes que nous d´ efinissons maintenant sont les plus importants, notamment parce qu?ils sont faciles ` a impl´ ementer. Un automate A = (Q, I, T, F) est d´ eterministe s?il poss` ede un seul ´ etat initial (c?est-` a-dire |I| = 1) et si (p, a, q), (p, a, q ) ? F ? q = q Ainsi, pour tout p ? Q et tout a ? A, il existe au plus un ´ etat q dans Q tel que Version 6 f´ evrier 2005 298 Chapitre 9. Automates (p, a, q) ? F. On pose alors, pour p ? Q et a ? A, p · a = q si (p, a, q) ? F, ? sinon. On d´ efinit ainsi une fonction partielle Q × A ? Q appel´ ee la fonction de transition de l?automate d´ eterministe. On l?´ etend aux mots en posant, pour p ? Q, p · 1 = p et pour w ? A? , et a ? A, p · wa = (p · w) · a Cette notation signifie que p·wa est d´ efini si et seulement si p·w et (p·w)·a sont d´ efinis, et dans l?affirmative, p · wa prend la valeur indiqu´ ee. Avec cette notation on a, avec I = {i}, L(A) = {w ? A? | i · w ? T}. Un automate est dit complet si, pour tout p ? Q et a ? A, il existe au moins un ´ etat q ? Q tel que (p, a, q) ? F. Si un automate fini A n?est pas complet, on peut le compl´ eter sans changer le langage reconnu en ajoutant un nouvel ´ etat non final s, et en ajoutant les fl` eches (p, a, s) pour tout couple (p, a) tel que (p, a, q) / ? F pour tout q ? Q. Rendre un automate d´ eterministe, c?est-` a-dire le d´ eterminiser, est plus difficile, et donne lieu ` a un algorithme int´ eressant. Th´ eor` eme 2.1. Pour tout automate fini A, il existe un automate fini d´ eter- ministe et complet B tel que L(A) = L(B). Preuve. Soit A = (Q, I, T, F). On d´ efinit un automate d´ eterministe B qui a pour ensemble d?´ etats l?ensemble ?(Q) des parties de Q, pour ´ etat initial I, et pour ensemble d?´ etats terminaux V = {S ? Q | S?T = ?}. On d´ efinit enfin la fonction de transition de B pour S ? ?(Q) et a ? A par S · a = {q ? Q | ?s ? S : (s, a, q) ? F}. Nous prouvons par r´ ecurrence sur la longueur d?un mot w que S · w = {q ? Q | ?s ? S : s w ? q}. Ceci est clair si w = 1, et est vrai par d´ efinition si w est une lettre. Posons w = va, avec v ? A? et a ? A. Alors comme par d´ efinition S ·w = (S ·v)·a, on a q ? S ·w si et seulement s?il existe une fl` eche (p, a, q), avec p ? S · v, donc telle qu?il existe un calcul s v ? p pour un s ? S. Ainsi q ? S · w si et seulement s?il existe un calcul s w ? q avec s ? S. Ceci prouve l?assertion. Version 6 f´ evrier 2005 9.2. Automates finis 299 Maintenant, w ? L(A) si et seulement s?il existe un calcul r´ eussi d?´ etiquette w, ce qui signifie donc que I · w contient au moins un ´ etat final de A, en d?autres termes que I · w ? T = ?. Ceci prouve l?´ egalit´ e L(A) = L(B). La d´ emonstration du th´ eor` eme est constructive. Elle montre que pour un auto- mate A ` a n ´ etats, on peut construire un automate fini d´ eterministe reconnaissant le m? eme langage et ayant 2n ´ etats. La construction est appel´ ee la construction par sous-ensembles (en anglais la subset construction ). Exemple. Sur l?alphabet A = {a, b}, consid´ erons l?automate A reconnaissant le langage A? ab des mots se terminant par ab (figure 2.7). a b b a 1 2 3 Figure 2.7: Un automate reconnaissant le langage A?ab. L?application stricte de la preuve du th´ eor` eme conduit ` a l?automate d´ eterministe ` a 8 ´ etats de la figure 2.8. Cet automate a beaucoup d?´ etats inaccessibles. Il suffit a b 1 2 3 0 / 12 23 13 123 b a a b b a a a,b a a,b a b Figure 2.8: L?automate d´ eterminis´ e. de se contenter des ´ etats accessibles, et si l?on n?a pas besoin d?un automate complet, il suffit de consid´ erer la partie ´ emond´ ee; dans notre exemple, on obtient l?automate complet ` a trois ´ etats de la figure 2.9. En pratique, pour d´ eterminiser un automate A, on ne construit pas l?automa- te d´ eterministe de la preuve en entier avant de l?´ emonder; on combine plut? ot les deux ´ etapes en une seule, en faisant une recherche des descendants de l?´ etat initial de l?automate B pendant sa construction. On maintient pour cela un ensemble R d?´ etats de B d´ ej` a construits, et un ensemble de transitions (S, a) qui restent ` a explorer et qui sont compos´ ees d?un ´ etat de B d´ ej` a construit et d?une lettre. A chaque ´ etape, on choisit un couple (S, a) et on construit l?´ etat S · a de B en se Version 6 f´ evrier 2005 300 Chapitre 9. Automates a b 1 12 13 b a b a Figure 2.9: L?automate d´ eterministe et ´ emond´ e. servant de l?automate de d´ epart A. Si l?´ etat S = S ·a est connu parce qu?il figure dans R, on passe ` a la transition suivante; sinon, on l?ajoute ` a R et on ajoute ` a la liste des transitions ` a explorer les couples (S , a), pour a ? A. Exemple. Reprenons l?exemple ci-dessus. Au d´ epart, l?ensemble d?´ etats de l?au- tomate d´ eterministe est r´ eduit ` a {1}, et la liste E des transitions ` a explorer est ({1}, a), ({1}, b). On d´ ebute donc avec R = {{1}} E = ({1}, a), ({1}, b) Choisissons la premi` ere transition, ce qui donne le nouvel ´ etat {1, 2} et les nou- velles transitions ({1, 2}, a), ({1, 2}, b), d?o` u R = {{1}, {1, 2}} E = ({1}, b), ({1, 2}, a), ({1, 2}, b) Les ´ etapes suivantes sont (noter que l?on a le choix de la transition ` a traiter, ici on les consid` ere dans l?ordre d?arriv´ ee) : R = {{1}, {1, 2}} E = ({1, 2}, a), ({1, 2}, b) R = {{1}, {1, 2}} E = ({1, 2}, b) R = {{1}, {1, 2}, {1, 3}} E = ({1, 3}, a), ({1, 3}, b) R = {{1}, {1, 2}, {1, 3}} E = ({1, 3}, b) R = {{1}, {1, 2}, {1, 3}} E = ? Comme le sugg` ere la construction, il existe des automates ` a n ´ etats pour lesquels tout automate d´ eterministe ´ equivalent poss` ede de l?ordre de 2n ´ etats. Voici, pour tout entier positif n fix´ e, un automate ` a n + 1 ´ etats (figure 2.10) qui reconna? ?t le langage Ln = A? aAn?1 sur l?alphabet A = {a, b}. Nous allons d´ emontrer a a,b b a 0 1 2 3 n a,b a,b a,b Figure 2.10: Un automate ` a n + 1 ´ etats. que tout automate d´ eterministe reconnaissant Ln a au moins 2n ´ etats. Soit en effet A = (Q, i, T) un automate d´ eterministe reconnaissant Ln. Alors on a, pour v, v ? An : i · v = i · v ? v = v (2.1) Version 6 f´ evrier 2005 9.3. Op´ erations 301 En effet, supposons v = v . Il existe alors des mots x, x , w tels que v = xaw et v = x bw ou vice-versa. Soit y un mot quelconque tel que wy est de longueur n ? 1. Alors vy = xawy ? Ln et v y = x bwy / ? Ln, alors que l?´ egalit´ e i · v = i · v implique que i·vy = i·v y, et donc que vy et vy soit sont tous deux dans Ln, soit sont tous deux dans le compl´ ement de Ln. D?o` u la contradiction. L?implication (2.1) montre que A a au moins 2n ´ etats. 9.3 Op´ erations 9.3.1 Op´ erations bool´ eennes Proposition 3.1. La famille des langages reconnaissables sur un alphabet A est ferm´ ee pour les op´ erations bool´ eennes, c?est-` a-dire pour l?union, l?intersection et la compl´ ementation. Preuve. Soient X et X deux langages reconnaissables de A? , et soient A = (Q, i, T) et A = (Q , i , T ) deux automates finis d´ eterministes complets tels que X = L(A) et X = L(A ). Consid´ erons l?automate d´ eterministe complet B = (Q × Q , (i, i ), S) dont la fonction de transition est d´ efinie par (p, p ) · a = (p · a, p · a) pour tout couple d?´ etats (p, p ) et toute lettre a ? A. Alors on a (p, p ) · w = (p · w, p · w) pour tout mot w, comme on le v´ erifie imm´ ediatement en raisonnant par r´ ecurrence sur la longueur de w. Il r´ esulte de cette ´ equation que pour S = T ×T , on obtient L(B) = X ? X , et pour S = (T × Q ) ? (Q × T ), on obtient L(B) = X ? X . Enfin, pour S = T × (Q ? T ), on a L(B) = X ? X . Corollaire 3.2. Un langage X est reconnaissable si et seulement si X ?{1} est reconnaissable. 9.3.2 Automates asynchrones Nous introduisons maintenant une g´ en´ eralisation des automates finis, dont nous montrons qu?en fait ils reconnaissent les m? emes langages. L?extension r´ eside dans le fait d?autoriser ´ egalement le mot vide comme ´ etiquette d?une fl` eche. L?avantage de cette convention est une bien plus grande souplesse dans la construction des Version 6 f´ evrier 2005 302 Chapitre 9. Automates automates. Elle a en revanche l?inconv´ enient d?accro? ?tre le nond´ eterminisme des automates. Un automate fini asynchrone A = (Q, I, T, F) est un automate dans lequel cer- taines fl` eches peuvent ? etre ´ etiquet´ ees par le mot vide, donc tel que F ? Q × (A ? 1) × Q. Les notions de calcul, d?´ etiquette, de mot et de langage reconnu s?´ etendent de mani` ere ´ evidente aux automates asynchrones. La terminologie provient de l?obser- vation que, dans un automate asynchrone, la longueur d?un calcul r´ eussi, donc la longueur d?un calcul, peut ? etre sup´ erieure ` a la longueur du mot qui est son ´ etiquette. Dans un automate usuel en revanche, lecture d?une lettre et progression dans l?automate sont rigoureusement synchronis´ ees. Exemple. L?automate asynchrone de la figure 3.1 reconna? ?t le langage a? b? . 1 b a 0 1 Figure 3.1: Un automate asynchrone. Proposition 3.3. Pour tout automate fini asynchrone A, le langage L(A) est reconnaissable. Preuve. Soit A = (Q, I, T) un automate fini asynchrone sur A. Soit B = (Q, I, T) l?automate fini dont les fl` eches sont les triplets (p, a, q) pour lesquels il existe un calcul c : p a ? q dans A. On a L(A) ? A+ = L(B) ? A+ . Si I ? T = ?, les deux langages L(A) et L(B) contiennent le mot vide et sont donc ´ egaux. Dans le cas contraire, on a L(A) = L(B) ? 1 ou L(A) = L(B), selon que le mot vide 1 est l?´ etiquette d?un calcul r´ eussi dans A ou non. Ceci prouve que L(A) est reconnaissable. Reprenons notre exemple de l?automate de la figure 3.1. La construction de la preuve conduit ` a l?automate synchrone de la figure 3.2. a,b b a 0 1 Figure 3.2: L?automate pr´ ec´ edent synchronis´ e . En effet, il existe dans l?automate d?origine deux calculs, de longueur 2, de l?´ etat 0 ` a l?´ etat 1, l?un portant l?´ etiquette a, l?autre l?´ etiquette b. Notons que cet automate ne reconna? ?t pas le mot vide, donc ne reconna? ?t le langage a? b? qu?au mot vide pr` es. Version 6 f´ evrier 2005 9.4. Langages rationnels 303 9.3.3 Produit et ´ etoile Proposition 3.4. Si X est reconnaissable, alors X? est reconnaissable; si X et Y sont reconnaissables, alors XY est reconnaissable. Preuve. Soit X un langage reconnaissable. Comme X? = (X ? 1)? , et que X ? 1 est reconnaissable, on peut supposer que X ne contient pas le mot vide. Soit A = (Q, I, T, F) un automate fini reconnaissant X, et soit B = (Q, I, T) l?automate asynchrone ayant pour fl` eches F ? (T × {1} × I) Notons que T ? I = ? parce que le mot vide n?est pas dans X. Montrons que l?on a X+ = L(B). Il est clair en effet que X+ ? L(B). R´ ecipro- quement, soit c : i w ? t un calcul r´ eussi dans B. Ce calcul a la forme c : i1 w1 ? t1 1 ? i2 w2 ? t2 1 ? · · · in wn ? tn avec i = i1, t = tn, et o` u aucun des calculs ck : ik wk ? tk ne contient de fl` eche ´ etiquet´ ee par le mot vide. Alors w1, w2, . . . , wn ? X, et donc w ? X+ . Il en r´ esulte ´ evidemment que X? = X+ ? 1 est reconnaissable. Consid´ erons maintenant deux automates finis A = (Q, I, T, F) et B = (P, J, R, G) reconnaissant respectivement les langages X et Y . On peut supposer les ensembles d?´ etats Q et P disjoints. Soit alors C = (Q ? P, I, R) l?automate dont les fl` eches sont F ? G ? (T × {1} × J) Alors on v´ erifie facilement que L(C) = XY . 9.4 Langages rationnels Dans cette section, nous d´ efinissons une autre famille de langages, les langages rationnels, et nous prouvons qu?ils co¨ ?ncident avec les langages reconnaissables. Gr? ace ` a ce r´ esultat, d? u ` a Kleene, on dispose de deux caract´ erisations tr` es diff´ e- rentes d?une m? eme famille de langages. 9.4.1 Langages rationnels : d´ efinitions Soit A un alphabet. Les op´ erations rationnelles sur les parties de A? sont les op´ erations suivantes : union X ? Y ; produit XY = {xy | x ? X, y ? Y }; ´ etoile X? = le sous-mono¨ ?de engendr´ e par X. Version 6 f´ evrier 2005 304 Chapitre 9. Automates Une famille de parties de A? est rationnellement ferm´ ee si elle est ferm´ ee pour les trois op´ erations rationnelles. Les langages rationnelsindexrationnel, langage de A? sont les ´ el´ ements de la plus petite famille rationnellement ferm´ ee de A? qui contient les singletons (c?est-` a-dire les langages r´ eduits ` a un seul mot) et le langage vide. Cette famille est not´ ee Rat(A? ). Une expression d?un langage comme combinaison finie d?unions, de produits et d?´ etoiles de singletons est une expression rationnelle. Une ´ etude plus formelle des expressions rationnelles est entreprise au paragraphe 3 de cette section. Consid´ erons quelques exemples. Le langage abA? , avec A = {a, b}, est rationnel : il est le produit des singletons a et b par l?´ etoile de A qui est lui-m? eme l?union des deux lettres a et b. De m? eme, le langage A? aba est rationnel. Toujours sur A = {a, b}, le langage L des mots qui contiennent un nombre pair de a est rationnel : c?est le langage L = (ab? a ? b)? . 9.4.2 Le th´ eor` eme de Kleene Le th´ eor` eme suivant est d? u ` a Kleene : Th´ eor` eme 4.1 (de Kleene). Soit A un alphabet fini. Alors les langages ra- tionnels et reconnaissables sur A co¨ ?ncident : Rat(A? ) = Rec(A? ). Cet ´ enonc´ e est remarquable dans la mesure o` u il donne deux caract´ erisations tr` es diff´ erentes d?une m? eme famille de langages : l?automate fini est un moyen de calcul, et se donner un langage par un automate fini revient ` a se donner un algorithme pour v´ erifier l?appartenance de mots au langage. Au contraire, une expression rationnelle d´ ecrit la structure syntaxique du langage. Elle permet en particulier des manipulations, et des op´ erations entre langages. La d´ emonstration du th´ eor` eme de Kleene est en deux parties. Une premi` ere partie consiste ` a montrer que tout langage rationnel est reconnaissable, c?est- ` a-dire ` a prouver l?inclusion Rat(A? ) ? Rec(A? ). On l?obtient en montrant que la famille Rec(A? ) est ferm´ ee pour les op´ erations rationnelles. L?inclusion oppos´ ee Rec(A? ) ? Rat(A? ) se montre en exhibant, pour tout automate fini, une expres- sion rationnelle (au sens du paragraphe suivant) du langage qu?il reconna? ?t. Nous commen¸ cons par la proposition suivante : Proposition 4.2. Soit A un alphabet. Tout langage rationnel de A? est recon- naissable : Rat(A? ) ? Rec(A? ). Preuve. La famille des langages sur A reconnus par des automates finis est ferm´ ee par union, produit et ´ etoile. Par ailleurs, elle contient les singletons; en effet, pour tout mot w = a1a2 · · ·an de longueur n, l?automate de la figure 4.1 reconna? ?t ce mot. Ainsi, Rec(A? ) est ferm´ ee pour les op´ erations rationnelles. Ceci montre que tout langage rationnel sur A est reconnaissable. Version 6 f´ evrier 2005 9.4. Langages rationnels 305 a 1 a 2 a n 0 1 2 n Figure 4.1: Automate reconnaissant exactement le mot w = a1a2 · · · an. Proposition 4.3. Soit A un alphabet fini. Tout langage reconnaissable de A? est rationnel : Rec(A? ) ? Rat(A? ). Preuve. Soit A = (Q, I, T) un automate fini sur A, et soit X le langage reconnu. Num´ erotons les ´ etats de mani` ere que Q = {1, . . . , n}. Pour i, j dans Q, soit Xi,j = {w | i w ? j}, et pour k = 0, . . . , n, soit X (k) i,j l?ensemble des ´ etiquettes des calculs de longueur strictement positive de la forme i ? p1 ? . . . ? ps ? j, s ? 0, p1, . . . , ps ? k Observons que X (0) i,j ? A, et donc que chaque X (0) i,j est une partie rationnelle, parce que l?alphabet est fini. Ensuite, on a X (k+1) i,j = X (k) i,j ? X (k) i,k+1 X (k) k+1,k+1 ? X (k) k+1,j (4.1) Cette formule montre, par r´ ecurrence sur k, que chacun des langages X (k) i,j est rationnel. Or Xi,j = X (n) i,j si i = j 1 ? X (n) i,j si i = j (4.2) et X = i?I t?T Xi,t (4.3) et par cons´ equent les langages Xi,j sont rationnels. Donc X est ´ egalement ra- tionnel. Les formules (4.1)?(4.3) permettent de calculer effectivement une expression (ex- pression rationnelle) pour le langage reconnu par un automate fini. Cette m´ ethode est appel´ ee l?algorithme de MacNaughton et Yamada, d?apr` es ses cr´ eateurs. Il est tr` es simple, mais pas tr` es efficace dans la mesure o` u il faut calculer les O(n3 ) expressions X (k) i,j pour un automate ` a n ´ etats. Une fa¸ con parfois plus commode ? surtout pour les calculs ` a la main ? de d´ eterminer l?expression rationnelle du langage reconnu par un automate consiste ` a r´ esoudre un syst` eme d?´ equations lin´ eaires naturellement associ´ e ` a tout automate fini. Soit A = (Q, I, T, F) un automate fini sur A. Le syst` eme d?´ equations (lin´ eaire droit) associ´ e ` a A est Xp = q?Q Ep,qXq ? ?p,T p ? Q Version 6 f´ evrier 2005 306 Chapitre 9. Automates o` u Ep,q = {a ? A | (p, a, q) ? F}, p, q ? Q ?p,T = {1} si p ? T ? sinon Consid´ erons par exemple l?automate de la figure 4.2. a b 1 2 3 b a b a Figure 4.2: Quel est le langage reconnu par cet automate? Le syst` eme d?´ equations associ´ e ` a cet automate est X1 = bX1 ? aX2 X2 = aX2 ? bX3 X3 = bX1 ? aX2 ? 1 Une solution du syst` eme d?´ equations est une famille (Lp)p?Q de langages qui v´ erifie le syst` eme d?´ equations. Proposition 4.4. Soit A = (Q, I, T) un automate fini sur A, et posons Lp(A) = {w ? A? | ?c : p ? t ? T, |c| = w} Alors la famille (Lp(A))p?Q est l?unique solution du syst` eme d?´ equations associ´ e ` a A. Le langage Lp(A) est l?ensemble des mots reconnus par A en prenant p pour ´ etat initial, de sorte que L(A) = p?I Lp(A) Nous commen¸ cons par le cas particulier d?un syst` eme d?´ equations r´ eduit ` a une seule ´ equation. La d´ emarche sera la m? eme dans le cas g´ en´ eral. Lemme 4.5 (Lemme d?Arden). Soient E et F deux langages. Si 1 / ? E, alors l?´ equation X = EX ? F poss` ede une solution unique, ` a savoir le langage E? F. Preuve. Posons L = E? F. Alors EL?F = EE? F ?F = (EE? ?1)F = E? F = L, ce qui montre que L est bien solution de l?´ equation. Supposons qu?il y ait deux solutions L et L . Comme L ? L = (EL ? F) ? L = EL ? L ? EL ? EL Version 6 f´ evrier 2005 9.4. Langages rationnels 307 et que EL ? EL ? E(L ? L ), on a L ? L ? E(L ? L ) ? En (L ? L ) pour tout n > 0. Mais comme le mot vide n?appartient pas ` a E, cela signifie qu?un mot de L ? L a pour longueur au moins n pour tout n. Donc L ? L est vide, et par cons´ equent L ? L et de m? eme L ? L. Preuve de la proposition. Pour montrer que les langages Lp(A), (p ? Q), cons- tituent une solution, posons Lp = q?Q Ep,qLq(A) ? ?p,T et v´ erifions que Lp(A) = Lp pour p ? Q. Si 1 ? Lp(A), alors p ? T, donc ?p,T = {1} et 1 ? Lp, et r´ eciproquement. Soit w ? Lp(A) de longueur > 0; il existe un calcul c : p ? t pour un t ? T d?´ etiquette w. En posant w = av, avec a une lettre et v un mot, le calcul c se factorise en p a ? q v ? t pour un ´ etat q. Mais alors a ? Ep,q et v ? Lq(A), donc w ? Lp. L?inclusion r´ eciproque se montre de la m? eme fa¸ con. Pour prouver l?unicit´ e de la solution, on proc` ede comme dans la preuve du lemme d?Arden. Soient (Lp)p?Q et (Lp)p?Q deux solutions du syst` eme d?´ equations, et posons Mp = Lp ? Lp pour p ? Q. Alors Mp = q?Q Ep,qLq ? ?p,T ? Lp ? q?Q (Ep,qLq ? Ep,qLq) ? q?Q Ep,qMq A nouveau, ces inclusions impliquent que Mp = ? pour tout p. Supposons en effet le contraire, soit w un mot de longueur minimale dans M = p?Q Mp et soit p un ´ etat tel que w ? Mp. Alors w ? q?Q Ep,qMq donc w est le produit d?une lettre et d?un mot v de M ; mais alors v est plus court que w, une contradiction. Pour r´ esoudre un syst` eme d?´ equations, on peut proc´ eder par ´ elimination de varia- bles (c?est la m´ ethode de Gauss). Dans notre exemple, on substitue la troisi` eme ´ equation dans la deuxi` eme, ce qui donne X2 = (a ? ba)X2 ? b2 X1 ? b qui, par le lemme d?Arden, ´ equivaut ` a l?´ equation X2 = (a ? ba)? (b2 X1 ? b) Version 6 f´ evrier 2005 308 Chapitre 9. Automates Cette expression pour X2 est substitu´ ee dans la premi` ere ´ equation du syst` eme; on obtient X1 = (b ? a(a ? ba)? b2 )X1 ? a(a ? ba)? b d?o` u, ` a nouveau par le lemme d?Arden, X1 = (b ? a(a ? ba)? b2 )? a(a ? ba)? b Il n?est pas du tout ´ evident que cette derni` ere expression soit ´ egale ` a {a, b}? ab. Pour le montrer, observons d?abord que (a ? ba)? = a? (ba+ )? (rappelons que X+ = XX? = X? X pour tout X) en utilisant la r` egle (U ?V )? = U? (V U? )? , d?o` u a(a ? ba)? b = a+ (ba+ )? b = (a+ b)+ Il en r´ esulte que b ? a(a ? ba)? b2 = [1 ? (a+ b)+ ]b = (a+ b)? b d?o` u X1 = [(a+ b)? b]? (a+ b)? (a+ b) = (a+ b ? b)? (a+ b) = (a? b)? a? ab = {a, b}? ab 9.4.3 Expressions rationnelles Le th´ eor` eme de Kleene, qui ´ etablit l?´ egalit´ e entre langages rationnels et reconnais- sables, poss` ede des preuves constructives. L?une est l?algorithme de McNaughton et Yamada, la deuxi` eme revient ` a r´ esoudre un syst` eme d?´ equations lin´ eaires. Dans les deux cas, la rationalit´ e du langage obtenu est ´ evidente parce qu?elle provient d?une expression rationnelle fournie pour le langage; plus pr´ ecis´ ement, le langage est exprim´ e ` a l?aide des op´ erations rationnelles. Dans ce paragraphe, nous ´ etudions les expressions rationnelles en elles-m? emes, en faisant une distinction entre une expression et le langage qu?elle d´ ecrit, un peu comme l?on fait la diff´ erence entre une expression arithm´ etique et la valeur num´ erique qu?elle repr´ esente. L?approche est donc purement syntaxique, et le langage repr´ esent´ e par une expression peut ? etre consid´ er´ e comme r´ esultant d?une ´ evaluation de l?expression. Les manipulations (alg´ ebriques ou combinatoires) d?expressions permettent de construire des automates efficaces reconnaissant le langage repr´ esent´ e par des op´ erations qui sont proches de l?analyse syntaxique, et qui ne font pas intervenir le langage lui-m? eme. Elles se pr? etent donc bien ` a une impl´ ementation effective. Une autre application est la recherche de motifs dans un texte, comme elle est r´ ealis´ ee dans un traitement de texte par exemple, et comme elle sera trait´ ee au chapitre suivant. Version 6 f´ evrier 2005 9.4. Langages rationnels 309 Soit A un alphabet fini, soient 0 et 1 deux symboles ne figurant pas dans A, et soient +, ·, ? trois symboles de fonctions, les deux premiers binaires, le dernier unaire. Les expressions sur A ? {0, 1, +, ·, ? } sont les termes bien form´ es sur cet ensemble de symboles. Exemple. Sur A = {a, b} le terme a(a + a · b)? b est une expression. Comme souvent, on peut repr´ esenter une expression par un arbre qui, sur cet exemple, est l?arbre de la figure 4.3. a b * + a a b a b Figure 4.3: L?expression rationnelle a(a + a · b)?b. Les parenth` eses ne sont utilis´ ees que lorsqu?elles sont n´ ecessaires, en convenant que l?op´ eration ? a priorit´ e sur · qui a priorit´ e sur +; on omet ´ egalement le signe de multiplication quand cela ne pr? ete pas ` a confusion. Les expressions rationnelles sur A sont les ´ el´ ements de l?alg` ebre quotient obtenue en convenant que (i) l?op´ eration + est idempotente, associative et commutative, (ii) l?op´ eration · est associative et distributive par rapport ` a l?op´ eration +, (iii) les ´ equations suivantes sont v´ erifi´ ees pour tout terme e : 0 + e = e = e + 0 1 · e = e = e · 1 0 · e = 0 = e · 0 (iv) on a : 0? = 1? = 1 Exemple. Par exemple, (0 + a(1 + b · 1))? et (ab + a)? sont la m? eme expression rationnelle, alors que 1+a? a et a? sont deux expressions diff´ erentes (m? eme si elles d´ ecrivent le m? eme langage). On note E(A) l?alg` ebre des expressions rationnelles ainsi obtenue. La convention d?identifier certaines expressions selon les r` egles que nous venons d?´ edicter all` ege tr` es consid´ erablement l?´ ecriture et l?expos´ e; tout ce qui suit pourrait se faire ´ egalement en ne raisonnant que sur les termes ou les arbres. Version 6 f´ evrier 2005 310 Chapitre 9. Automates L?important est toutefois que l?´ egalit´ e de deux expressions est facilement d´ ecidable sur les expressions elles-m? emes. Pour ce faire, on met une expression, donn´ ee di- sons sous forme d?arbre, en forme normale en supprimant d?abord les feuilles 0 ou 1 quand c?est possible en appliquant les ´ egalit´ es (iii) ci-dessus, puis en dis- tribuant le produit par rapport ` a l?addition pour faire descendre au maximum les produits. Lorsque les deux expressions sont en forme normale, on peut d´ ecider r´ ecursivement si elles sont ´ egales : il faut et il suffit pour cela qu?elles aient m? eme symbole aux racines, et si les suites d?expressions des fils obtenues en faisant jouer l?associativit´ e de · et les ensembles d?expressions des fils modulo l?associativit´ e, l?idempotence et la commutativit´ e de + sont ´ egaux. Exemple. En appliquant les r` egles de simplification ` a l?expression (0 + a(1 + b · 1))? , on obtient (a(1+b))? . Par distributivit´ e et simplification, elle donne (a+ab)? , et les deux expressions fils de la racine sont les m? emes dans cette expression, et dans (ab + a)? . Remarque. Dans ce qui pr´ ec` ede ne figure pas l?op´ eration e ? e+ . C?est pour ne pas alourdir l?expos´ e que nous consid´ erons cette op´ eration comme une abr´ e- viation de ee? ; on pourrait aussi bien consid´ erer cette op´ eration comme op´ eration de base. Il y a une application naturelle de l?alg` ebre des expressions rationnelles sur A dans les langages rationnels sur A. C?est l?application L : E(A) ? ?(A? ) d´ efinie par r´ ecurrence comme suit : L(0) = ?, L(1) = {1}, L(a) = {a}, L(e + e ) = L(e) ? L(e ), L(e · e ) = L(e)L(e ), L(e? ) = L(e)? Pour une expression e, le langage L(e) est le langage d´ ecrit ou d´ enot´ e par e. Deux expressions e et e sont dites ´ equivalentes lorsqu?elles d´ enotent le m? eme langage, c?est-` a-dire lorsque L(e) = L(e ). On ´ ecrit alors e ? e . Proposition 4.6. Pour toutes expressions rationnelles e et f, on a les formules suivantes : (ef)? ? 1 + e(fe)? f (e + f)? ? e? (fe? )? e? ? (1 + e + . . . + ep?1 )(ep )? p > 1 Cette proposition est un corollaire imm´ ediat du lemme suivant : Version 6 f´ evrier 2005 9.5. Automate minimal 311 Lemme 4.7. Quelles que soient les parties X et Y de A? , on a (XY )? = 1 ? X(Y X)? Y (4.4) (X ? Y )? = X? (Y X? )? (4.5) X? = (1 ? X ? · · · ? Xp?1 )(Xp )? p > 1 (4.6) Preuve. Pour ´ etablir (4.4), montrons d?abord que (XY )? ? 1 ? X(Y X)? Y . Pour cela, soit w ? (XY )? . Alors w = x1y1 · · · xnyn pour n ? 0 et xi ? X, yi ? Y . Si n = 0, alors w = 1, sinon w = x1vyn, avec v = y1 · · · xn ? (Y X)? . Ceci prouve l?inclusion. L?inclusion r´ eciproque se montre de mani` ere similaire. Pour prouver (4.5), il suffit d?´ etablir (X ? Y )? ? 1 ? X? (Y X? )? l?inclusion r´ eciproque ´ etant ´ evidente. Soit w ? (X ? Y )? . Il existe n ? 0 et z1, . . . , zn ? X ? Y tels que w = z1 · · · zn. En groupant les zi cons´ ecutifs qui appartiennent ` a X, ce produit peut s?´ ecrire w = x0y1x1 · · · ymxm avec x0, . . . , xm ? X? et y0, . . . , ym ? Y . Par cons´ equent w ? 1 ? X? (Y X? )? . Consid´ erons enfin (4.6). On a (1 ? X ? · · · ? Xp?1 )(Xp )? = p?1 k=0 m?0 Xk+mp = X? 9.5 Automate minimal D´ eterminer un automate ayant un nombre minimum d?´ etats pour un langage rationnel donn´ e est tr` es int´ eressant du point de vue pratique. Il est tout ` a fait remarquable que tout langage rationnel poss` ede un automate d´ eterministe mini- mal unique, ` a une num´ erotation des ´ etats pr` es. Ce r´ esultat n?est plus vrai si l?on consid` ere des automates qui ne sont pas n´ ecessairement d´ eterministes. Il y a deux fa¸ cons de d´ efinir l?automate d´ eterministe minimal reconnaissant un langage rationnel donn´ e. La premi` ere est intrins` eque; elle est d´ efinie ` a partir du langage par une op´ eration appel´ ee le quotient. La deuxi` eme est plus op´ eratoire; on part d?un automate d´ eterministe donn´ e, et on le r´ eduit en identifiant des ´ etats appel´ es ins´ eparables. Les algorithmes de minimisation utilisent la deuxi` eme d´ efinition. Version 6 f´ evrier 2005 312 Chapitre 9. Automates 9.5.1 Quotients Soit A un alphabet. Pour deux mots u et v, on pose u?1 v = {w ? A? | uw = v}, uv?1 = {w ? A? | u = wv} Un tel ensemble, appel´ e quotient gauche respectivement droit est, bien entendu, soit vide soit r´ eduit ` a un seul mot qui, dans le premier cas est un suffixe de v, et dans le deuxi` eme cas un pr´ efixe de u. La notation est ´ etendue aux parties en posant, pour X, Y ? A? X?1 Y = x?X y?Y x?1 y, XY ?1 = x?X y?Y xy?1 Les quotients sont un outil important pour l?´ etude des automates finis et des langages rationnels. On utilise principalement les quotients gauches par un mot, c?est-` a-dire les ensembles u?1 X = {w ? A? | uw ? X} Notons qu?en particulier, 1?1 X = X pour tout ensemble X, et que (uv)?1 X = v?1 (u?1 )X. Pour toute partie X de A? , on pose Q(X) = {u?1 X | u ? A? } (5.1) Exemple. Sur A = {a, b}, soit X l?ensemble des mots qui contiennent au moins une fois la lettre a. Alors on a : 1?1 X = X, a?1 X = A? , b?1 X = X, a?1 A? = b?1 A? = A? donc Q(X) = {X, A? }. Proposition 5.1. Soit X ? A? le langage reconnu par un automate fini d´ eter- ministe, accessible et complet A = (Q, i, T); pour q ? Q, soit Lq(A) = {w ? A? | q · w ? T}. Alors {Lq(A) | q ? Q} = Q(X) (5.2) Preuve. Montrons d?abord que Q(X) est contenu dans {Lq(A) | q ? Q}. Soit u ? A? , et soit q = i · u (cet ´ etat existe parce que A est complet). Alors u?1 X = Lq(A), puisque w ? u?1 X ?? uw ? X ?? i · uw ? T ?? q · w ? T ?? w ? Lq(A) Pour montrer l?inclusion r´ eciproque, soit q ? Q et soit u ? A? tel que q = i·u (un tel mot existe parce que l?automate est accessible). Alors Lq(A) = u?1 X. Ceci prouve la proposition. Version 6 f´ evrier 2005 9.5. Automate minimal 313 b 1 b a a b a a,b a,b a b 0 2 3 4 5 6 a,b Figure 5.1: Un automate reconnaissant X = b?a{a, b}?. Exemple. Consid´ erons l?automate A donn´ e dans la figure 5.1. Un calcul rapide montre que L1(A) = L3(A) = L5(A) = L6(A) = {a, b}? L0(A) = L2(A) = L4(A) = b? a{a, b}? L?´ equation (5.2) est bien v´ erifi´ ee. On d´ eduit de cette proposition que, pour un langage reconnaissable X, l?ensemble des quotients gauches Q(X) est fini; nous allons voir dans un instant que la r´ eciproque est vraie ´ egalement. L?´ equation (5.2) montre par ailleurs que tout au- tomate d´ eterministe, accessible et complet reconnaissant X poss` ede au moins |Q(X)| ´ etats. Nous allons voir que ce minimum est atteint, et m? eme, au para- graphe suivant, qu?il existe un automate unique, ` a un isomorphisme pr` es, qui a |Q(X)| ´ etats et qui reconna? ?t X. Soit X ? A? . On appelle automate minimal de X l?automate d´ eterministe A(X) = (Q(X), X, T(X)) dont l?ensemble d?´ etats est donn´ e par (5.1), ayant X comme ´ etat initial, l?ensemble T(X) = {u?1 X | u ? X} = {u?1 X | 1 ? u?1 X} comme ensemble d?´ etats terminaux, la fonction de transition ´ etant d´ efinie, pour Y ? Q et a ? A par Y · a = a?1 Y Notons que si Y = u?1 X, alors Y · a = a?1 (u?1 X) = (ua)?1 X, donc la fonction de transition est bien d´ efinie, et l?automate est complet. Exemple. L?automate A(X) pour le langage X = b? a{a, b}? a les deux ´ etats X et {a, b}? , le premier est initial, le deuxi` eme est final. L?automate est donn´ e dans la figure 5.2. Proposition 5.2. Le langage reconnu par l?automate A(X) est X. Version 6 f´ evrier 2005 314 Chapitre 9. Automates a b a X b A* Figure 5.2: Automate minimal pour X = b?a{a, b}? Preuve. Montrons d?abord que, pour tout w ? A? et pour tout Y ? Q(X), on a Y ·w = w?1 Y . En effet, ceci est vrai si w est une lettre ou le mot vide. Si w = ua, avec a une lettre, alors Y · ua = (Y · u) · a = (u?1 Y ) · a = a?1 (u?1 Y ) = (ua)?1 Y . Ceci prouve la formule. Il en r´ esulte que w ? L(A(X)) ?? X · w ? T ?? w?1 X ? T ?? w ? X Donc A(X) reconna? ?t X. Corollaire 5.3. Une partie X ? A? est reconnaissable si et seulement si l?en- semble Q(X) est fini. Preuve. Si X est reconnaissable, alors (5.2) montre que Q(X) est fini. La r´ eci- proque d´ ecoule de la proposition pr´ ec´ edente. On peut calculer l?ensemble Q(X) pour un langage rationnel, ` a partir d?une ex- pression rationnelle pour X, ` a l?aide des formules de la proposition suivante. Cela ne r´ esout pas compl` etement le probl` eme du calcul de l?automate minimal, parce qu?une difficult´ e majeure demeure, ` a savoir tester si deux expressions sont ´ equivalentes. On en parlera plus loin. Proposition 5.4. Soit a une lettre, et soient X et Y des langages. Alors on a a?1 ? = a?1 1 = ? a?1 a = 1 a?1 b = ? (b = a) a?1 (X ? Y ) = a?1 X ? a?1 Y a?1 (XY ) = (a?1 X)Y ? (X ? 1)a?1 Y (5.3) a?1 X? = (a?1 X)X? (5.4) Preuve. Seules les deux derni` eres formules demandent une v´ erification. Si w ? a?1 (XY ), alors aw ? XY ; il existe donc x ? X, y ? Y tels que aw = xy. Si x = 1, alors aw = y, donc w ? (X ? 1)a?1 Y ; sinon, x = au pour un pr´ efixe u de w, et u ? a?1 X, d?o` u w ? (a?1 X)Y . L?inclusion r´ eciproque se montre de la m? eme mani` ere. Consid´ erons la derni` ere formule. Soit w ? a?1 X? . Alors aw ? X? , donc aw = xx , avec x ? X, x = 1, et x ? X? . Mais alors x = au, avec u ? a?1 X, donc w ? (a?1 X)X? . R´ eciproquement, on a par la formule (5.3), l?inclusion (a?1 X)X? ? a?1 (XX? ), donc (a?1 X)X? ? a?1 X? . Version 6 f´ evrier 2005 9.5. Automate minimal 315 Exemple. Calculons, ` a l?aide de ces formules, le langage a?1 (b? aA? ). On a a?1 (b? aA? ) = a?1 (b? (aA? )) = (a?1 b? )aA? ? a?1 (aA? ) par (5.3); or le premier terme de l?union est vide par (5.3), d?o` u a?1 (b? aA? ) = (a?1 a)A? ? (a ? 1)a?1 A? = (a?1 a)A? = A? 9.5.2 Equivalence de Nerode Dans ce paragraphe, tous les automates consid´ er´ es sont d´ eterministes, accessibles et complets. Soit A = (Q, i, T) un automate sur un alphabet A reconnaissant un langage X. Pour tout ´ etat q, on pose Lq(A) = {w ? A? | q · w ? T} C?est donc l?ensemble des mots reconnus par l?automate A en prenant q comme ´ etat initial. Bien entendu, le langage X reconnu par A co¨ ?ncide avec Li(A). On a vu, au paragraphe pr´ ec´ edent, que {Lq(A) | q ? Q} = Q(X) La correspondance s?´ etablit par Lq(A) = u?1 X si i · u = q Notons que, plus g´ en´ eralement, Lq·v(A) = v?1 Lq(A) (5.5) En effet, w ? Lq·v(A) si et seulement si (q · v) · w ? T donc si et seulement si vw ? Lq(A). Lorsque l?automate est fix´ e, on ´ ecrira Lq au lieu de Lq(A). Deux ´ etats p, q ? Q sont dits ins´ eparables si Lp = Lq, ils sont s´ eparables sinon. Ainsi, p et q sont s´ eparables si et seulement s?il existe un mot w tel que p · w ? T et q · w / ? T ou vice-versa. Si w est un mot ayant cette propri´ et´ e, on dit qu?il s´ epare les ´ etats p et q. L?´ equivalence de Nerode sur Q (ou sur A) est la relation ? d´ efinie par p ? q ?? p et q sont ins´ eparables Proposition 5.5. Dans l?automate minimal, deux ´ etats distincts sont s´ epa- rables, et l?´ equivalence de Nerode est l?´ egalit´ e. Preuve. Soit Y = u?1 X un ´ etat de l?automate minimal A(X) du langage X. Comme Y = X · u, on a LY = u?1 X = Y . Par cons´ equent, deux ´ etats distincts ne sont pas ´ equivalents. Version 6 f´ evrier 2005 316 Chapitre 9. Automates b 1 b a a b a a,b a,b a b 0 2 3 4 5 6 a,b Figure 5.3: Un automate qui n?est pas minimal. Exemple. Reprenons l?automate donn´ e dans la figure 5.3 ci-dessous, et d´ ej` a consid´ er´ e dans le paragraphe pr´ ec´ edent. Puisque L1 = L3 = L5 = L6 = {a, b}? L0 = L2 = L4 = b? a{a, b}? l?´ equivalence de Nerode a donc les deux classes {0, 2, 4} et {1, 3, 5, 6}. Le mot vide s´ epare deux ´ etats pris dans des classes distinctes. Proposition 5.6. L?´ equivalence de Nerode est une relation d?´ equivalence r´ egu- li` ere ` a droite, c?est-` a-dire v´ erifiant p ? q ? p · u ? q · u (u ? A? ) De plus, une classe de l?´ equivalence ou bien ne contient pas d?´ etats terminaux, ou bien ne contient que des ´ etats terminaux. Preuve. Soit A = (Q, i, T) un automate. Il est clair que la relation ? est une relation d?´ equivalence. Pour montrer sa r´ egularit´ e, supposons p ? q, et soit u ? A? . En vue de (5.5), on a Lq·u = u?1 Lq = u?1 Lp = Lp·u, donc p · u ? q · u. Supposons enfin p ? q et p terminal. Alors 1 ? Lp, et comme Lp = Lq, on a 1 ? Lq, donc q est terminal. L?´ equivalence de Nerode sur un automate A = (Q, i, T) ´ etant r´ eguli` ere ` a droite, on peut d´ efinir un automate quotient en confondant les ´ etats d?une m? eme classe. Plus pr´ ecis´ ement, notons [q] la classe d?un ´ etat q dans l?´ equivalence. L?automate quotient est alors d´ efini par A/ ?= (Q/ ?, [i] , {[t] : t ? T}) avec la fonction de transition [q · a] = [q] · a (5.6) qui justement est bien d´ efinie (ind´ ependante du repr´ esentant choisi dans la classe de q) parce que l?´ equivalence est r´ eguli` ere ` a droite. Version 6 f´ evrier 2005 9.5. Automate minimal 317 a b a b 1356 024 Figure 5.4: Un automate quotient. Dans l?exemple ci-dessus, l?automate quotient a deux ´ etats : l? ´ etat {0, 2, 4} est initial, et {1, 3, 5, 6} est l?´ etat final. La formule (5.6) permet de calculer les tran- sitions. On obtient l?automate de la figure 5.4. Comme le sugg` ere cet exemple, l?automate quotient est en fait l?automate mini- mal, ` a une renum´ erotation des ´ etats pr` es. Nous avons besoin, pour le prouver, de la notion d?isomorphisme d?automates. Soient A = (Q, i, T) et A = (Q , i , T ) deux automates sur A. Ils sont dits isomorphes s?il existe une bijection ? : Q ? Q telle que ?(i) = i , ?(T) = T , et ?(q · a) = ?(q) · a pour tout q ? Q et a ? A. Proposition 5.7. Soit A = (Q, i, T) un automate sur un alphabet A recon- naissant un langage X. Si l?´ equivalence de Nerode de A est l?´ egalit´ e, alors A et l?automate minimal A(X) sont isomorphes. Preuve. Soit ? : Q ? Q(X) d´ efinie par ?(q) = Lq(A). Comme l?´ equivalence de Nerode est l?´ egalit´ e, ? est une bijection. Par ailleurs, ?(i) = Li = X, et t ? T si et seulement si 1 ? Lt(A), donc si et seulement si Lt(A) est ´ etat final de A(X). Enfin, on a Lq·a(A) = Lq(A) · a montrant que ? est bien un morphisme. De cette propri´ et´ e, on d´ eduit une cons´ equence importante : Th´ eor` eme 5.8. L?automate minimal d?un langage X est l?automate ayant le moins d?´ etats parmi les automates d´ eterministes complets qui reconnaissent X. Il est unique ` a un isomorphisme pr` es. Preuve. Soit B un automate reconnaissant X et ayant un nombre minimal d?´ etats. Alors son ´ equivalence de Nerode est l?´ egalit´ e, sinon on pourrait passer au quo- tient par son ´ equivalence de Nerode et trouver un automate plus petit. Par la proposition pr´ ec´ edente, B est isomorphe ` a A(X). L?unicit´ e de l?automate minimal ne vaut que pour les automates d´ eterministes. Il existe des automates non d´ eterministes, non isomorphes, ayant un nombre minimal d?´ etats, et reconnaissant un m? eme langage (voir exercices). Version 6 f´ evrier 2005 318 Chapitre 9. Automates 9.6 Calcul de l?automate minimal Le calcul de l?automate minimal peut se faire par un proc´ ed´ e appel´ e la construc- tion de Moore et que nous exposons dans le premier paragraphe. Nous verrons dans la suite une impl´ ementation sophistiqu´ ee de cette construction. 9.6.1 Construction de Moore Soit A = (Q, i, T) un automate d´ eterministe, accessible et complet sur un al- phabet A. Pour calculer l?automate minimal, il suffit de calculer l?´ equivalence de Nerode d´ efinie, rappelons-le, par p ? q ?? Lp = Lq o` u Lp = {w ? A? | p · w ? T}. Pour calculer cette ´ equivalence, on proc` ede par approximations successives. On consid` ere pour ce faire l?´ equivalence suivante, o` u k est un entier naturel : p ?k q ?? L(k) p = L(k) q avec L(k) p = {w ? Lp | |w| ? k} L?´ equivalence de Nerode est l?intersection de ces ´ equivalences. La proposition suivante exprime l?´ equivalence ?k au moyen de l?´ equivalence ?k?1. Elle permettra de prouver que l?on obtient bien ` a la limite l?´ equivalence de Nerode, et elle donne aussi un proc´ ed´ e de calcul. Proposition 6.1. Pour tout entier k ? 1, on a p ?k q ?? p ?k?1 q et (? a ? A, p · a ?k?1 q · a) Preuve. On a L(k) p = {w | p · w ? T et |w| ? k} = {w | p · w ? T et |w| ? k ? 1} ? a?A a{v | (p · a) · v ? T et |v| ? k ? 1} = L (k?1) p ? a?A aL(k?1) p·a L?observation n?est qu?une traduction de ces ´ egalit´ es. Corollaire 6.2. Si les ´ equivalences ?k et ?k+1 co¨ ?ncident, les ´ equivalences ?k+l (l ? 0) sont toutes ´ egales, et ´ egales ` a l?´ equivalence de Nerode. Version 6 f´ evrier 2005 9.6. Calcul de l?automate minimal 319 Preuve. De la proposition, il r´ esulte imm´ ediatement que l?´ egalit´ e des ´ equivalen- ces ?k et ?k+1 entra? ?ne celle des ´ equivalences ?k+1 et ?k+2. D?o` u la premi` ere assertion. Comme p ? q si et seulement si p ?k q pour tout k ? 0, la deuxi` eme assertion s?en d´ eduit. Proposition 6.3. Si A est un automate ` a n ´ etats, l?´ equivalence de Nerode de A est ´ egale ` a ?n?2. Preuve. Si, pour un entier k > 0, les ´ equivalences ?k?1 et ?k sont distinctes, le nombre de classes de l?´ equivalence ?k est ? k + 2. 9.6.2 Scinder une partition La construction de l?automate minimal par la m´ ethode de Moore appliqu´ ee di- rectement ` a un automate ` a n ´ etats sur un alphabet ` a m lettres fournit un algo- rithme qui a un temps de calcul dans le pire des cas en O(mn2 ). Nous pr´ esentons ici un algorithme d? u ` a Hopcroft, dont la preuve a ´ et´ e simplifi´ ee par D. Gries, et dont la complexit´ e en temps est O(mn log n). Soient R et R deux relations d?´ equivalence sur un ensemble Q. On dit que R est plus fine que R , ce que l?on note R ? R , si : pRq ? pR q. Soient P et P les partitions associ´ ees ` a R et R , on a alors : R ? R si et seulement si ?P ? P, ?P ? P , P ? P . Soit A un ensemble op´ erant ` a droite sur Q par une application de Q×A dans Q o` u l?image du couple (q, a) est not´ ee q·a (c?est le cas de la fonction de transition d?un automate d´ eterministe complet). On note alors a?1 S = {q ? Q | q · a ? S}. Pour toute partie S de Q, on note ¯ S la partie Q?S. Remarquons que Q = a?1 S?a?1 ¯ S, et que cette union est disjointe. On peut alors ´ etablir un certain nombre de propri´ et´ es : Soient P une partition de Q, P et S deux ´ el´ ements de P et a un ´ el´ ement de A. On dit que P est stable pour (S, a) si on a : P · a ? S ou P · a ? ¯ S ou encore de mani` ere ´ equivalente si : P ? a?1 S ou P ? a?1 ¯ S Si P n?est pas stable pour (S, a), on dit que P est bris´ ee par (S, a); cela signifie que les ensembles P ? a?1 S et P ? a?1 ¯ S Version 6 f´ evrier 2005 320 Chapitre 9. Automates sont tous les deux non vides. On d´ efinit une op´ eration Scinder de la mani` ere suivante : Scinder(P, (S, a)) encore not´ e P ? a S est d´ efini par : P ? a S = {P} si P est stable pour (S, a) {P ? a?1 S, P ? a?1 ¯ S} sinon On peut noter aussi que l?on a : P ? a S = P ? a ¯ S. b 1 b a a b a a,b a,b a b 0 2 3 4 5 6 a,b Figure 6.1: Un exemple illustrant l?op´ eration ?. Exemple. Consid´ erons l?automate d´ eterministe complet de la figure 6.1. La partie Q n?est pas stable pour (T, b) car Q · b = {2, 4, 5, 6}; or 2 ? T, et 5 ? T. On a alors : Q ? b T = {{1, 3, 5, 6}, {0, 2, 4}}. Par contre ¯ T est stable pour (T, a) et pour (T, b), car ¯ T · a ? T et ¯ T · b ? ¯ T. Lemme 6.4. Soit A un ensemble op´ erant ` a droite sur Q, soient P, S, T des parties de Q et a, b ? A. i) l?op´ eration Scinder est commutative , i.e. : P ? a S ? b T = P ? b T ? a S ii) l?op´ eration Scinder est monotone , i.e. si {S1, S2} est une partition de S alors : P ? a S ? a S1 = P ? a S2 ? a S1. Preuve. i) P ? a S est form´ e des ensembles non vides parmi P ? a?1 S, P ? a?1 ¯ S, et P ? a S ? b T est compos´ e des ensembles non vides parmi : P ? a?1 S ? b?1 T, P ? a?1 ¯ S ? b?1 T, P ? a?1 S ? b?1 ¯ T, P ? a?1 ¯ S ? b?1 ¯ T. On constate ais´ ement que la permutation de S et T et de a et b donne le m? eme r´ esultat. Version 6 f´ evrier 2005 9.6. Calcul de l?automate minimal 321 ii) Comme l?op´ eration Scinder est commutative, il suffit de comparer P ? a S1 ? a S ` a P ? a S1 ? a S2. Il est facile de v´ erifier que les op´ erations ? ? a S2 et ? ? a S ne mo- difient pas la partition P ? a S1, d?o` u le r´ esultat cherch´ e. Une partition P est stable pour (S, a) si les classes qui la composent le sont. On d´ efinit Scinder(P, (S, a)) que l?on note aussi P ? a S comme ´ etant la partition P obtenue en rempla¸ cant dans P chaque classe P par Scinder(P, (S, a)). L?op´ eration Scinder agissant sur une partition a les propri´ et´ es suivantes : Lemme 6.5. i) Si une partition P de Q est stable pour (S, a), alors toute par- tition plus fine que P l?est ´ egalement. ii) La partition P = P ? a S est stable pour (S, a), plus fine que P, et si P n?est pas stable pour (S, a), alors P est strictement plus fine que P. Preuve. Les preuves sont faciles et laiss´ ees au lecteur ` a titre d?exercice. Remarques. ? Il est facile de v´ erifier que les propri´ et´ es ´ enonc´ ees au lemme 6.4 restent vraies si l?on remplace P par une partition P. ? La notation P ? a S ? b T peut s?´ etendre ` a une liste quelconque L = ((S1, a1), . . ., ((Sk, ak)) de couples, et on ´ ecrira alors P ? L ou bien Scinder(P, L). Notons que la r´ egularit´ e ` a droite d?une relation d?´ equivalence sur Q peut s?´ enoncer en termes de stabilit´ e de la fa¸ con suivante : Lemme 6.6. Une relation d?´ equivalence sur Q est r´ eguli` ere ` a droite si et seule- ment si la partition P associ´ ee est stable pour tous les couples (P, a) o` u P ? P et a ? A. 9.6.3 Algorithme de Hopcroft Revenons ` a l?´ equivalence de Nerode. Soit A = (Q, i, T) un automate d´ eterministe complet ` a n ´ etats sur un alphabet A ` a m lettres. Rappelons que l?´ equivalence de Nerode sur Q est d´ efinie par : p ? q ?? Lp = Lq o` u Lp est l?ensemble des ´ etiquettes des chemins de i ` a p. Note 9.6.2 On appelle partition de Nerode la partition de Q associ´ ee ` a cette relation d?´ equiva- lence. On a vu (proposition 5.6) que l?´ equivalence de Nerode est r´ eguli` ere ` a droite. Version 6 f´ evrier 2005 322 Chapitre 9. Automates Nous supposons d´ esormais que l?ensemble T d?´ etats terminaux de A est non vide et distinct de Q. Consid´ erons la partition de Q, P0 = {T, ¯ T}, et R0 la relation d?´ equivalence associ´ ee. Compte tenu des d´ efinitions donn´ ees, on peut ´ enoncer la proposition suivante : Proposition 6.7. L?´ equivalence de Nerode est l?´ equivalence r´ eguli` ere ` a droite la plus grossi` ere qui soit plus fine que R0. Preuve. Soit R l?´ equivalence de Nerode. D?apr` es la proposition 5.6, il est clair que R est r´ eguli` ere ` a droite et plus fine que R0. Soit R une relation d?´ equivalence r´ eguli` ere ` a droite et plus fine que R0. Supposons que R ne soit pas plus fine que R. Dans ce cas il existe p, q ? Q tels que pR q et Lp = Lq. Alors on peut supposer par exemple qu?il existe u ? Lp et u ? Lq. Soit t = p · u et q = q · u. On a t ? T, q ? T et tR q puisque pR q. Ce qui induit une contradiction puisque R0 ? R . Une partition P de l?ensemble Q sera dite admissible si la relation d?´ equivalence associ´ ee est plus fine que R0 et moins fine que l?´ equivalence de Nerode. La propo- sition 6.7 devient : Lemme 6.8. Une partition de l?ensemble Q est la partition de Nerode de l?auto- mate A si et seulement si elle est admissible et stable. Par ailleurs on d´ eduit facilement de ce qui pr´ ec` ede la propri´ et´ e suivante : Lemme 6.9. Si P est une partition admissible, non stable pour le couple (P, a), alors P ? a P est une partition admissible. Pour calculer l?automate minimal de l?automate A = (Q, i, T), nous allons cal- culer son ´ equivalence de Nerode et, pour cela, calculer la partition de Nerode associ´ ee ` a cette relation d?´ equivalence. Le principe de l?algorithme est le suivant. On part de la partition P0 = {T, ¯ T} que l?on raffine par bris successifs; plus pr´ ecis´ ement, tant que P (au d´ ebut P = P0) n?est pas stable, on brise une classe de la partition. Premi` ere ´ ecriture de l?algorithme Soient A = (Q, i, T) un automate sur A et P0 = {T, ¯ T} la partition initiale de Q. Consid´ erons l?algorithme suivant : Version 6 f´ evrier 2005 9.6. Calcul de l?automate minimal 323 proc´ edure Moore1 (A); P := P0 ; tantque ?P ? P et a ? A tels que P n?est pas stable pour (P, a) faire P := P ? a P fintantque. La boucle tantque est ex´ ecut´ ee au plus n ? 1 fois, car ` a chaque ex´ ecution le nombre d?´ el´ ements de P augmente strictement et est major´ e par n. La partition P obtenue est stable. Par ailleurs, P est admissible est un invariant de la boucle tantque en raison du lemme 6.9. Comme P0 est admissible, cela implique que la partition obtenue ` a l?arr? et de la boucle est admissible, c?est donc la partition de Nerode. D?o` u : Proposition 6.10. La proc´ edure Moore1 calcule l?´ equivalence de Nerode. Nous modifions la premi` ere proc´ edure en transformant l?it´ eration de la fa¸ con sui- vante : ` a chaque entr´ ee dans la boucle on dresse la liste L des couples (P, a) pour lesquels P n?est pas stable, et on remplace P par Scinder(P, L). Notons qu?on ne fait plus la m? eme suite de scissions que dans la proc´ edure Moore1, car si L = ((P1, a1), . . . , (Pk, ak)), et si l?on suppose que P2 a ´ et´ e scind´ e lors de la scission relative ` a (P1, a1), alors dans la proc´ edure Moore1 on ne fera pas de scission relativement ` a (P2, a2) parce que P2 n?appartient plus ` a la partition. Il est facile de voir que cette modification n?alt` ere pas la validit´ e de l?algorithme. On peut ´ enoncer le r´ esultat ainsi : Lemme 6.11. Si P est une partition admissible et L est la liste des couples (P, a) (P ? P, a ? A) pour lesquels P n?est pas stable, alors Scinder(P, L) est encore une partition admissible. Preuve. Il suffit de prouver que si P est admissible et que P est une union d?´ el´ ements de P alors P ? a P est encore admissible. La preuve est similaire ` a celle de la Proposition 6.10 et est laiss´ ee au lecteur. On peut donc remplacer la proc´ edure Moore1 par la suivante : Note 9.6.3 proc´ edure Moore2 (A); P := P0 ; tantque P n?est pas stable faire calculer la liste L des couples (P, a) qui brisent P ; PP ? L fintantque. Version 6 f´ evrier 2005 324 Chapitre 9. Automates Donnons un exemple pour montrer que la suite des scissions n?est pas la m? eme dans les proc´ edures Moore1 et Moore2. Exemple. Consid´ erons l?automate de la figure 6.2. b b a,b 1 2 3 4 a a b a,b a b 8 5 7 a b a,b 6 a Figure 6.2: Exemple. La proc´ edure Moore1 donne la suite de scissions suivantes : Note 9.6.4 P : 46 ? 123578 Scission relative ` a (46, a) P : 46 ? 12378 ? 5 Scission relative ` a (5, b) P : 46 ? 17 ? 28 ? 3 ? 5 Scission relative ` a (28, a) P : 46 ? 1 ? 7 ? 2 ? 8 ? 3 ? 5 Termin´ e La proc´ edure Moore2 donne la suite de scissions suivantes : P : 46 ? 123578 L = ((46, a), (46, b), (123578, a), (123578, b)) Scission relative ` a (46, a) P : 46 ? 12378 ? 5 Scission relative ` a (46, b) P : 46 ? 1278 ? 3 ? 5 Scission relative ` a (123578, a) P : pas de changement Scission relative ` a (123578, b) P : pas de changement L = ((1278, a)(1278, b), (3, a), (5, b)) Scission relative ` a (1278, a) : P : 46 ? 178 ? 2 ? 3 ? 5 Scission relative ` a (1278, b) : P : 46 ? 17 ? 8 ? 2 ? 3 ? 5 Scission relative ` a (3, a) : P : pas de changement Scission relative ` a (5, b) : P : 46 ? 1 ? 7 ? 8 ? 2 ? 3 ? 5 L = ? Termin´ e L?automate minimal obtenu est donc le suivant et reconna? ?t le langage {a2 b, b(b2 )? a}{a, b}? : Version 6 f´ evrier 2005 9.6. Calcul de l?automate minimal 325 b b a,b 1 2 3 46 a a b a b 8 5 7 a b a,b a Figure 6.3: Automate minimal obtenu ` a partir de celui de la figure 6.2. Version d´ efinitive de l?algorithme Contrairement ` a ce que laisserait croire l?exemple trait´ e, l?´ ecriture de l?algorithme sous cette forme va nous permettre de mieux exploiter les propri´ et´ es de l?op´ eration Scinder pour am´ eliorer les performances de l?algorithme. Dans un premier temps, au lieu de calculer les couples (P, a) pour lesquels P n?est pas stable, on peut prendre L = P × A; cela revient ` a ajouter des couples pour lesquels P est stable et pour lesquels l?op´ eration Scinder n?aura aucun effet. Ceci fait, en vertu du lemme 6.5 iv), on peut remplacer ` a la premi` ere it´ eration L := { ¯ T, T} × A par L := {T} × A ou L := { ¯ T} × A. On choisira entre T et ¯ T, la partie de plus faible cardinal, pour des raisons qui s?´ eclairciront plus tard mais dont on devine d?ores et d´ ej` a l?int´ er? et (r´ eduction de la taille des ensembles relativement auxquels on fait la scission). Ceci nous am` ene ` a ´ ecrire la version quasiment d´ efinitive de l?algorithme. Ecrivons l?algorithme sous la forme suivante : proc´ edure Hopcroft (A); P := {T, ¯ T}; si Card(T) < Card( ¯ T) alors L := {T} × A sinon L := { ¯ T} × A; tantque L = ? faire (a) enlever un couple (P, a) de L; (b) d´ eterminer l?ensemble B des ´ el´ ements de P bris´ es par (P, a); (c) pour tout B ? B calculer {B , B } = B ? a P ; (d) pour tout B ? B et pour tout b ? A faire si (B, b) ? L alors (e) enlever (B, b) et ajouter (B , b) et (B , b) ` a L (f) sinon si Card(B ) < Card(B ) alors ajouter (B , b) ` a L sinon ajouter (B , b) ` a L finsi fintantque; retourner (P). Version 6 f´ evrier 2005 326 Chapitre 9. Automates Dans cette version de l?algorithme, la liste L repr´ esente certains des couples (P, a) pour lesquels il faut scinder P. Mais ` a un instant donn´ e, L ne repr´ esente pas la liste de tous les couples (P, a), P ? P pour lesquels P n?est pas stable. N´ eanmoins la propri´ et´ e suivante (I) est un invariant de la boucle tantque : si P ? P et (P, a) ? L pour un certain a, alors a) P est stable pour (P, a) ou (I) b) ` a l?arr? et de la boucle tantque , la partition P est stable pour (P, a). Prouvons donc que (I) est un invariant de la boucle tantque en utilisant les lemmes 6.4 et 6.5 . Appelons Pk la partition obtenue avant la k-i` eme it´ eration de la boucle, et PN la partition finale. Avant d?entrer dans la boucle tantque (I) est vrai : supposons que a) soit faux; comme (P, a) ? L, alors ( ¯ P, a) ? L, et les lemmes 6.4 et 6.5 assurent que les transformations de L qui ont lieu en (a), (e), ou (f) sont telles que PN est stable pour ( ¯ P, a) et donc pour (P, a). Supposons maintenant qu?avant la k-i` eme it´ eration, (I) soit vrai et soient respec- tivement Lk et Lk+1 l?´ etat de L avant et apr` es cette k-i` eme it´ eration. Montrons que (I) est vrai pour Pk+1 ` a la sortie de la k-i` eme it´ eration de la boucle tantque . Soit un couple (P, a) ? Lk+1, avec P ? Pk+1 ; ? ou bien P ? Pk ; si (P, a) ? Lj, par hypoth` ese de r´ ecurrence Pk est stable pour (P, a) et donc aussi Pk+1, ou bien PN est stable pour (P, a) (cqfd); si (P, a) ? Lj, il est facile de voir que n´ ecessairement la k-i` eme it´ eration est une scission relativement ` a (P, a) et que P n?a pas ´ et´ e bris´ e lors de cette scission. La partition Pk+1 est donc stable pour (P, a) ainsi que toutes les suivantes (cqfd); ? ou bien P ? Pk ; alors P a ´ et´ e obtenu lors de la k-i` eme it´ eration par bris d?une partie R en deux parties P et P , avec R ? Pk ; si (R, a) ? Lk, alors ` a la sortie de la boucle on a (P, a) ? Lk+1 par hypoth` ese, et donc (P , a) ? Lk+1. Ainsi on est s? ur que PN sera stable pour (P , a) et par hypoth` ese de r´ ecurrence que Pk est stable pour (R, a) ou que PN sera stable pour (R, a). Donc par application du lemme 6.4 ii), PN sera stable pour (P, a) (cqfd); si (R, a) ? Lk, comme (P, a) ? Lk+1, c?est que la scission faite lors de la k-i` eme it´ eration est une scission relative ` a (R, a) (sinon, puisque (R, a) ? Lk, on aurait (P, a) et (P , a) ? Lk+1, ce qui contredit (P, a) ? Lk+1). Donc PN sera stable pour (R, a), et puisque (P, a) ? Lk+1 c?est que (P , a) ? Lk+1, et donc PN sera stable pour (P , a). D?o` u l?on d´ eduit que PN sera stable pour (P, a) (cqfd). Version 6 f´ evrier 2005 9.6. Calcul de l?automate minimal 327 On peut donc ´ enoncer le lemme : Lemme 6.12. L?algorithme Hopcroft s?arr? ete et calcule la partition de Nero- de. Preuve. Il reste uniquement ` a v´ erifier que la boucle tantque s?arr? ete. Or, on ne peut ajouter deux fois un m? eme couple (P, a) dans L, car chaque couple (P, a) ajout´ e dans la boucle en (e) ou (f) est constitu´ e d?une partie P strictement contenue dans une classe de la partition courante, et comme chaque passage dans la boucle supprime un ´ el´ ement de L, la boucle tantque s?arr? ete. Nous ´ enon¸ cons un dernier lemme utile ` a l?´ etude de la complexit´ e de l?algorithme : Lemme 6.13. Le nombre d?it´ erations de la boucle tantque est major´ e par 2mn. Preuve. Il suffit de prouver que le nombre de couples (P, a) introduits dans L est au plus 2mn, puisqu?` a chaque it´ eration on enl` eve un couple de L. Pour chaque couple (P, a) introduit dans L, P est ´ el´ ement de la partition courante. Consid´ erons l?arbre binaire repr´ esentant les scissions successives op´ er´ ees sur P. La racine est la partie Q toute enti` ere et ses fils sont T et ¯ T (si T = Q, on part de T), et chaque n?ud P admet pour fils P et P , r´ esultats d?une scission appliqu´ ee ` a P. Un tel arbre binaire complet a au plus n feuilles et donc au plus 2n ? 1 sommets. D?o` u le r´ esultat. 9.6.4 Complexit´ e de l?algorithme Avant de d´ ecrire les structures de donn´ ees n´ ecessaires ` a l?impl´ ementation de l?algorithme, nous allons d´ etailler l?´ ecriture des instructions (b), (c) et (d) de la proc´ edure Hopcroft. D´ etaillons l?´ ecriture des instructions (b), (c) et (d) de la proc´ edure Hopcroft : On remplace (b) par : (b) calculer a?1 P ; dresser la liste Classes-Rencontr´ ees des classes B ? P telles que B ? a?1 P = ?; Notons que cette liste contient toutes les classes susceptibles d?? etre bris´ ees, mais certaines d?entre elles peuvent ? etre stables pour (P, a). C?est ` a l?´ etape suivante que l?on d´ etermine les classes devant ? etre bris´ ees. Ainsi (c-f) est remplac´ e par : Version 6 f´ evrier 2005 328 Chapitre 9. Automates (c) pour tout B ?Classes-Rencontr´ ees faire si B · a ? P alors cr´ eer une nouvelle classe Jumeau(B); enlever de B et mettre dans Jumeau(B) tous les ´ etats p tels que p · a ? P ; (d) pour tout b ? A faire si avant scission (B, b) ? L alors (e) ajouter (Jumeau(B),b) ` a L (f) sinon si apr` es scission Card(B) ? Card(Jumeau(B)) alors ajouter (B, b) ` a L sinon ajouter (Jumeau(B),b) ` a L finsi finpour finsi finpour. Consid´ erons une it´ eration de la boucle (c) pour laquelle B · a ? P. A la fin de cette it´ eration, B et Jumeau(B) sont exactement les ensembles B et B . D?o` u l?algorithme complet : Version 6 f´ evrier 2005 9.6. Calcul de l?automate minimal 329 proc´ edure Hopcroft (A); P := {T, ¯ T}; si Card(T) < Card( ¯ T) alors L := {T} × A sinon L := { ¯ T} × A; tantque L = ? faire (a) enlever un couple (P, a) de L; (b) Inverse:= a?1 P ; dresser la liste Classes-Rencontr´ ees des classes B ? P telles que B?Inverse= ?; (c) pour tout B ?Classes-Rencontr´ ees faire si B · a ? P alors cr´ eer une nouvelle classe Jumeau(B); d´ eplacer de B dans Jumeau(B) tous les ´ etats p | p · a ? P ; (d) pour tout b ? A faire si avant scission (B, b) ? L alors ajouter (Jumeau(B),b) ` a L sinon si apr` es scission Card(B) ? Card(Jumeau(B)) alors ajouter (B, b) ` a L sinon ajouter (Jumeau(B),b) ` a L finsi finpour finsi finpour fintantque. Structures de donn´ ees ? Les ´ etats de l?automate sont les entiers de 1 ` a n. Les lettres sont les entiers de 1 ` a m. Une partition ayant au plus n ´ el´ ements, un ´ el´ ement d?une partition aura pour nom un entier entre 1 et n, ainsi un couple (P, a) sera repr´ esent´ e comme un ´ el´ ement de {1, . . . , n} × {1, . . . , m}, o` u la premi` ere composante est le nom de la partie P. Comme le nombre de classes grossit au cours du temps, une variable Compt initialis´ ee ` a 2 (ou ` a 1 si T = Q) indique quels sont les entiers d´ ej` a utilis´ es pour nommer les classes, ` a savoir les entiers de 1 ` a Compt. Une partition de Q sera g´ er´ ee gr? ace ` a quatre tableaux indic´ es par les entiers de 1 ` a n : Classe, Part, Card, Place. Pour tout ´ etat i, Classe[i] est le nom de la classe contenant i. Pour toute classe de nom P, Part[P] est un pointeur sur une liste doublement cha? ?n´ ee des ´ el´ ements de P, et Card[P] est le nombre d?´ el´ ements de la classe P. Enfin, pour tout ´ etat i appartenant ` a la classe de nom P, Place[i] est un pointeur sur la place de i dans la liste doublement cha? ?n´ ee Part[P] des ´ el´ ements de la classe de nom P. Cela permet en temps O(1) de supprimer un ´ el´ ement d?une classe et de l?ins´ erer dans une autre. Version 6 f´ evrier 2005 330 Chapitre 9. Automates Exemple. Q = {1, · · ·, 6}, P :35 ? 1 ? 246 2 3 1 3 1 3 2 3 1 3 1 2 4 5 6 CLASSE CARD PART PLACE Figure 6.4: Un exemple. ? Pour calculer Inverse:= a?1 P, on dispose d?un tableau Inv indic´ e par {1, . . . , n} × {1, . . . , m} tel que Inv[p, a] est un pointeur sur une liste cha? ?n´ ee des ´ el´ ements q tels que q · a = p. Ainsi Inverse sera non pas construit physique- ment , mais lu en temps proportionnel ` a sa taille en parcourant la liste Part[P] et, pour chaque ´ el´ ement p de cette liste, en parcourantInv[p, a]. Ainsi l?expression pour tout q dans Inverse est programm´ ee par : pour tout p ? P et pour tout q ?Inv[p, a]. ? La liste L doit ? etre g´ er´ ee de telle sorte que les op´ erations d?adjonction, de recherche, et de suppression d?un ´ el´ ement arbitraire soient ais´ ees (arbitraire fait r´ ef´ erence ici ` a la ligne (1) de la proc´ edure Hopcroft, c?est-` a-dire qu?on veut supprimer un ´ el´ ement de L, peu importe lequel). Comme la taille de L est ma- jor´ ee par mn, on la repr´ esentera par un tableau de bool´ eens Liste indic´ e par {1, . . . , n}×{1, . . . , m} tel que Liste[P, a] est vrai si (P, a) ? L, et simultan´ ement par une liste cha? ?n´ ee. Ainsi, l?adjonction se fait en temps O(1), (la mise ` a jour dans le tableau et dans la liste cha? ?n´ ee prenant un temps constant); la recherche se fait en temps O(1) en utilisant le tableau; enfin la suppression d?un ´ el´ ement arbitraire (ligne (a) de la proc´ edure) se fait en deux temps, on enl` eve le premier ´ el´ ement de la liste cha? ?n´ ee puis on met ` a jour le tableau, ce qui prend un temps Version 6 f´ evrier 2005 9.6. Calcul de l?automate minimal 331 O(1), de m? eme le test L = ? se fait en temps O(1) gr? ace ` a la structure de liste cha? ?n´ ee. ? Le traitement de Classes-Rencontr´ ees et de Jumeau est relativement d´ elicat. Pour dresser la liste de Classes-Rencontr´ ees, et pour g´ erer les scissions, on utilise trois structures de donn´ ees : une liste cha? ?n´ ee Classes-Rencontr´ ees des noms des classes ` a scinder, un tableau d?entiers Partage indic´ e par {1, . . . , n}, tel que pour toute classe B de nom i, Partage[i] est le cardinal de B ? a?1 P (le tableau Partage do? ?t ? etre ` a 0 ` a chaque entr´ ee dans la boucle tantque ) et un tableau Jumeau indic´ e par {1, . . . , n}. L?´ el´ ement Jumeau[i] est le nom de la nouvelle classe cr´ e´ ee pour briser la classe de nom i. Ce tableau est initialis´ e ` a 0 au d´ ebut de l?algorithme. Analyse de la complexit´ e Analysons le temps d?ex´ ecution de la proc´ edure Hopcroft avec les structures de donn´ ees propos´ ees ci-dessus. Notons au passage que pour obtenir une faible complexit´ e en temps il a ´ et´ e n´ ecessaire de ne pas l´ esiner sur l?espace m´ emoire utilis´ e. L?initialisation qui pr´ ec` ede la boucle tantque prend un temps O(mn). Le nom- bre d?it´ erations de la boucle tantque ´ etant major´ e par 2mn, le temps global d?ex´ ecution de la ligne (a) est O(mn). On a vu dans la preuve du lemme 6.13 que le nombre de classes cr´ e´ ees est major´ e par 2n ? 1, donc le temps global d?ex´ ecution du bloc (d) prend un temps O(mn). Il reste ` a ´ evaluer le temps global d?ex´ ecution des blocs (b) et (c). Soit N le nombre de passages dans la boucle tantque . Dans un premier temps, ´ evaluons la somme des tailles des N listes abstraites Inverse parcourues. Proposition 6.14. Soient a ? A, p ? Q. Le nombre de fois o` u l?on supprime de la liste L un couple (P, a) tel que p ? P, est major´ e par log2 n. Preuve. On dira qu?un couple (P, a) est marqu´ e si p ? P (a et p sont fix´ es). Avant d?entrer dans la boucle tantque , L contient au plus un couple marqu´ e, et ceci reste vrai ` a tout instant. Soit (P, a) le premier couple marqu´ e qui soit supprim´ e de L. Le prochain couple (P , a) marqu´ e qui sera introduit dans L dans la boucle tantque est tel que P est une classe r´ esultat de Scinder(P , b), pour un b ? A o` u P est une partie de P et Card(P ) ? Card(P )/2. Tant qu?il n?y a pas de suppression dans L d?un couple marqu´ e, L contient un unique couple marqu´ e dont la premi` ere composante est un sous-ensemble de P , donc sa taille est inf´ erieure ou ´ egale ` a celle de P . Ainsi, le prochain couple marqu´ e qui sera supprim´ e dans L Version 6 f´ evrier 2005 332 Chapitre 9. Automates aura une taille inf´ erieure ou ´ egale ` a Card(P)/2. En it´ erant ce processus, et tenant compte du fait que le premier couple marqu´ e introduit (´ eventuellement) dans L v´ erifie Card(P) ? n/2, il s?ensuit qu? on ne peut supprimer de L plus de log2 n fois un tel couple. Corollaire 6.15. La somme des tailles des N listes Inverse parcourues est major´ ee par mn log2 n. Preuve. Soit un triplet fix´ e (p, a, q) tel que q = p · a. Le nombre de fois o` u p est lu dans la liste Inverse parce que q = p · a, est exactement ´ egal au nombre de couples (P, a) tels que q ? P, qui sont supprim´ es de la liste L. Or par la proposition 6.14 ce nombre est major´ e par log2 n. D?o` u le r´ esultat. Il reste ` a constater que le temps global d?ex´ ecution des blocs (b) et (c) est pro- portionnel ` a la somme des tailles des N listes Inverse. En r´ ealit´ e, les blocs (b) et (c) s?ex´ ecutent en parcourant deux fois la liste Inverse de la mani` ere suivante : (b) cr´ eer une liste vide Classes-Rencontr´ ees; pour tout p ? P et pour tout q ?Inv[p, a] faire i :=Classe[q]; si Partage[i] = 0 alors Partage[i] := 1; ajouter i ` a Classes-Rencontr´ ees sinon Partage[i] :=Partage[i] + 1 finsi finpour; (c) pour tout p ? P et pour tout q ?Inv[p, a] faire i :=Classe[q]; si Partage[i] <Card[i] alors si Jumeau[i] = 0 alors Compt:=Compt+1;Jumeau[i] :=Compt finsi; supprimer q de sa classe et l?ins´ erer dans la classe de nom Jumeau[i] finsi finpour; pour tout j appartenant ` a Classes-Rencontr´ ees faire Partage[j] := 0;Jumeau[j] := 0; Version 6 f´ evrier 2005 Notes 333 En ´ ecrivant ainsi les blocs (b) et (c) et compte-tenu des structures de donn´ ees choisies, il est clair que le temps d?ex´ ecution de chacun de ces blocs prend un temps proportionnel ` a la somme des tailles des N listes Inverse et donc un temps O(mn log n). En conclusion, on peut ´ enoncer le : Th´ eor` eme 6.16. Si A est un alphabet ` a m lettres et A un automate ` a n ´ etats sur cet alphabet, la proc´ edure Hopcroft calcule, dans le pire des cas, en temps O(mn log n) l?automate minimal de A. Notes La th´ eorie des automates, dont nous avons d´ ecrit ici les bases, a connu des d´ eveloppements consid´ erables. Un trait´ e substantiel est l?ouvrage de S. Eilen- berg : S. Eilenberg, Automata, Languages, and Machines, Vol. A Academic Press, 1974. Pour les d´ eveloppements r´ ecents, notamment en rapport avec l?algorithmique des mots, voir : D. Perrin, Finite Automata, in : J. van Leeuwen, ed., Handbook of Theoretical Computer Science, Vol. B, North-Holland, 1990, 1?57. Une th´ eorie des langages rationnels et reconnaissables de mots infinis a vu le jour en m? eme temps que la th´ eorie portant sur les mots finis. On pourra consulter le chapitre de W. Thomas dans ce m? eme volume. Exercices 9.1. Montrer les ´ egalit´ es suivantes pour X, Y, Z ? A? : (XY )?1 Z = Y ?1 (X?1 Z) X?1 (Y Z?1 ) = (X?1 Y )Z?1 (XZ?1 )Y ?1 = X(Y Z)?1 9.2. D´ ecrire un algorithme qui permet de tester si le langage reconnu par un automate donn´ e est vide, fini non vide, ou infini. 9.3. (Lemme de l?´ etoile) D´ emontrer que pour tout langage reconnaissable L, il existe un entier N tel que tout mot w de L de longueur |w| ? N admet une factorisation w = uxv avec 0 < |x| ? N et v´ erifiant ux? v ? L. 9.4. Utiliser le lemme de l?´ etoile pour prouver que les langages {an bn | n ? 0}, {an bp | n ? p ? 0}, {an bp | n = p} ne sont pas reconnaissables. Version 6 f´ evrier 2005 334 Chapitre 9. Automates 9.5. D´ emontrer que si L est un langage reconnaissable, alors l?ensemble des facteurs des mots de L est encore un langage reconnaissable. (M? eme question pour les pr´ efixes, suffixes.) 9.6. Soient A et B deux alphabets. Un morphisme de A? dans B? est une application f : A? ? B? v´ erifiant f(uv) = f(u)f(v) pour u, v ? A? . a) D´ emontrer que si K est un langage rationnel sur A, alors f(K) est un langage rationnel sur B. b) D´ emontrer que f?1 (L) est un langage rationnel sur A pour tout langage ra- tionnel L sur B. 9.7. Une substitution de A? dans B? est une application s de A? dans l?ensemble des parties de B? qui v´ erifie s(uv) = s(u)s(v) pour u, v ? A? , et s(1) = {1}. D´ emontrer que si s(a) est un langage rationnel pour tout a ? A, alors s(K) est un langage rationnel pour tout langage rationnel K sur A. 9.8. Montrer que les deux automates de la figure 6.5 reconnaissent le m? eme langage. a b a a b a b a a b b Figure 6.5: Deux automates non d´ eterministes reconnaissant le m? eme langage. Quel est l?automate minimal d´ eterministe reconnaissant ce langage? Plus g´ en´ e- ralement, montrer que les langages A? wAn , avec A = {a, b}, n > 0 sont reconnus par au moins |w| + 1 automates non d´ eterministes non isomorphes ayant stricte- ment moins d?´ etats que l?automate (d´ eterministe) minimal de ce langage. 9.9. Soient A = (Q, i, T) et A = (Q , i , T ) deux automates d´ eterministes sur un alphaber A. On se propose de tester si ces deux automates sont ´ equivalents, c?est-` a-dire reconnaissent le m? eme langage. 1) Donner un algorithme r´ esolvant ce probl` eme d?´ equivalence en utilisant la min- imisation des automates d´ eterministes. Quelle est sa complexit´ e? 2) a) Soit A = (Q , {i, i }, T ? T ) l?automate union des automates A et A (les ensembles Q et Q sont suppos´ es disjoints). L?automate A est d´ eterministe ` a ceci pr` es qu?il a deux ´ etats initiaux. Pour tout a ? A, on note ?a la restriction ` a Q × {a} de la fonction de transition de l?automate A . Soit P la partition la plus fine de l?ensemble Q telle que i et i soient dans la m? eme classe, et qui soit compatible avec la fonction de transition de l?automate A i.e. v´ erifiant p ? q ? ?a.p ? ?b .q pour tout p, q ? Q et tout a ? A, o` u ? d´ esigne la relation d?´ equivalence associ´ ee ` a la partition consid´ er´ ee. Version 6 f´ evrier 2005 Exercices 335 b) Montrer que les automates A et A sont ´ equivalents si et seulement si l?ensemble T ? T est satur´ e pour la relation d?´ equivalence associ´ ee ` a la partition P. c) En d´ eduire un algorithme r´ esolvant le probl` eme d?´ equivalence de deux auto- mates d´ eterministes. On utilisera pour ce faire l?algorithme union-find . Calculer sa complexit´ e Cet algorithme est d? u ` a Hopcroft et Karp. 9.10. Soit A = (Q, F, I, T) un un automate fini sur un alphabet A reconnaissant un langage L. Soit Ar = (Q, Fr , T, I) l?automate obtenu en renversant les fl` eches de A (i.e. (p, a, q) ? Fr ? (q, a, p) ? F) et en ´ echangeant ´ etats initiaux et terminaux. 1) Montrer que Ar reconna? ?t l?image miroir de L not´ ee Lr , i.e. l?ensemble : Lr = {a1 · · · an ? A? | pour tout ai ? A et an · · · a1 ? L} 2) Soit Ar d l?automate d´ eterminste ´ emond´ e obtenu ` a partir de Ar par la cons- truction donn´ ee dans ce chapitre. Montrer que Ar d est l?automate d´ eterministe minimal reconnaissant Lr . La preuve de ce r´ esultat est due ` a J. Brzozowski. 3) En d´ eduire un algorithme de calcul de l?automate d´ eterministe minimal d?un automate donn´ e, et en donner sa complexit´ e. Version 6 f´ evrier 2005 336 Chapitre 9. Automates Version 6 f´ evrier 2005 337 Chapitre 10 Motifs Dans ce chapitre, nous consid´ erons d?abord le probl` eme de la recherche d?une ou de toutes les occurrences d?un mot x dans un texte t. Nous pr´ esentons l?algorithme na¨ ?f, l?algorithme de Morris et Pratt, et sa variante due ` a Knuth, Morris et Pratt, l?impl´ ementation par automate fini et l?algorithme de Simon, et pour finir l?algorithme de Boyer et Moore, dans sa version de Horspool et dans la version compl` ete. Ensuite, nous consid´ erons la recherche d?une occurrence de plusieurs motifs, et d´ ecrivons l?algorithme de Aho et Corasick. Dans la derni` ere section, nous ´ etudions la recherche d?occurrences de mots d´ ecrits par une expression ra- tionnelle. Introduction La recherche de motifs dans un texte est un probl` eme important qui appara? ?t dans de nombreux domaines scientifiques. En informatique, on le rencontre naturelle- ment en traitement des donn´ ees, dans l?´ edition de textes, en analyse syntaxique ou en recherche d?informations; en particulier, tous les ´ editeurs de textes et de nombreux langages de programmation offrent des possibilit´ es de recherche de motifs. Dans sa forme la plus simple, le probl` eme se ram` ene ` a localiser une occurrence d?un mot, le motif, dans une cha? ?ne de caract` eres, le texte. Par exemple, le texte rechercher contient deux occurrences du motif cher. M? eme pour ce probl` eme simple, il existe de nombreux algorithmes int´ eressants, plus ou moins sophistiqu´ es, et qui sont plus efficaces que la m´ ethode na¨ ?ve qui vient imm´ ediatement ` a l?esprit. Le probl` eme devient plus complexe lorsque l?on autorise des ensembles de motifs ou des motifs repr´ esent´ es par des expressions rationnelles. Par exemple, dans plusieurs traitements de textes courants l?expression ch.*r d´ enote les mots qui commencent par ch et qui se terminent par r. Dans le texte rechercher, les mots cher et chercher sont des occurrences de mots d´ ecrits par cette expression. Version 6 f´ evrier 2005 338 Chapitre 10. Motifs Le r´ esultat effectif de l?algorithme d´ epend de l?application consid´ er´ ee. Dans le cas o` u les donn´ ees sont organis´ ees en lignes par exemple, comme dans un diction- naire ou un listage de programme, nous pouvons ? etre int´ eress´ es par les lignes qui correspondent au motif. En compilation, on vise plut? ot ` a partitionner la cha? ?ne de caract` eres d?entr´ ee en une suite de lex` emes, tels que commentaires, identificateurs, op´ erateurs, o` u la forme des lex` emes est d´ etermin´ ee par une expression rationnelle. Dans l?´ edition de textes, on cherche des occurrences de motifs en vue notamment de les remplacer par d?autres. Dans ce chapitre, nous consid´ erons trois probl` emes : le plus important, et qui sera trait´ e en d´ etail, est la recherche d?une ou de toutes les occurrences d?un mot x dans un texte t. Nous pr´ esentons trois algorithmes pour ce probl` eme. Ensuite, nous consid´ erons la recherche d?une occurrence de plusieurs motifs, et enfin la recherche d?occurrences de mots d´ ecrits par une expression rationnelle. Dans tous les cas, c?est le motif recherch´ e qui subit une analyse pr´ ealable, et jamais le texte. En effet, le motif est consid´ er´ e comme fixe, et le texte est changeant et inconnu. Une situation duale, o` u le texte est fixe et le motif peut varier, se pr´ esente par exemple dans la recherche d?entr´ ees dans un dictionnaire. Une recherche efficace demande alors d?organiser et de coder de mani` ere convenable le dictionnaire. Ce probl` eme ne sera pas consid´ er´ e ici. 10.1 Recherche d?un motif Le probl` eme que nous abordons dans cette section est le suivant : ´ etant donn´ es un texte t ? A? et un motif x ? A? , o` u A est un alphabet, d´ eterminer si x est un facteur de t, et le cas ´ ech´ eant trouver une occurrence de x dans t. L?efficacit´ e d?un algorithme de recherche se mesure en nombre de comparaisons de caract` eres. Posons t = t1 · · · tn et x = x1 · · · xm, o` u les tj et les xi sont des lettres. Les algorithmes que nous pr´ esentons sont b? atis sur le sch´ ema que voici : le motif x est compar´ e aux facteurs tk+1 · · · tk+m de longueur m de t jusqu?` a trouver une co¨ ?ncidence, si elle existe. L?algorithme na¨ ?f fait cette comparaison pour toutes les positions k = 0, . . . , n ? m. Les am´ eliorations que nous examinons ensuite ne font la comparaison que pour un sous-ensemble des positions, en tirant profit de la connaissance du texte t accumul´ ee lors des comparaisons pr´ ec´ edentes et d?un pr´ etraitement du motif x. Le sch´ ema g´ en´ eral est donc : Recherche-d?un-motif(x, t); k := 0; tester l?´ egalit´ e x = tk+1 · · ·tk+m ; s?il y a ´ egalit´ e, reporter k et arr? eter sinon augmenter k et recommencer. Version 6 f´ evrier 2005 10.1. Recherche d?un motif 339 De fa¸ con imag´ ee, la m´ ethode consiste ` a faire glisser le motif x le long de la cha? ?ne t, et ` a comparer x au bloc de t couvert (voir figure 1.1). Les divers algorithmes d´ eterminent selon des crit` eres diff´ erents la position suivante o` u le motif x a des chances de se trouver dans le texte t. L?efficacit´ e d?une m´ ethode sp´ ecifique d´ epend grandement du pr´ etraitement appliqu´ e au motif x. L?information recueillie sur le motif peut ? etre employ´ ee pour former un analyseur, voire un automate fini, qui est ensuite appliqu´ e au texte. que la force soit avec toi texte mo tif la forme la force Figure 1.1: Le motif glissant sur le texte. 10.1.1 Un algorithme na¨ ?f Posons t = t1 · · · tn et x = x1 · · · xm. L?algorithme na¨ ?f consiste ` a comparer le motif x ` a chaque facteur de t de longueur m. Si une occurrence est rencontr´ ee, on la signale; sinon, on recommence avec le facteur suivant de t. Le but est de calculer un entier k o` u commence une occurrence de x, c?est-` a-dire tel que x1 · · ·xm = tk+1 · · · tk+m L?algorithme na¨ ?f suivant r´ ealise cette recherche : proc´ edure Recherche-na¨ ?ve(x, t); i := 1; j := 1; tantque i ? m et j ? n faire si t[j] = x[i] alors i := i + 1; j := j + 1 sinon j := j ? i + 2; i := 1 finsi fintantque; si i > m alors occurrence de x ` a la position j ? m sinon pas d?occurrence finsi. Dans le cas le plus d´ efavorable, le nombre de comparaisons est (n ? m + 1)m = nm ? m2 + m. Ce cas est r´ ealis´ e par exemple pour x = am?1 b, t = an?1 b. Pour m petit devant n, ce nombre est de l?ordre de nm = |x||t|. Toutefois, le comporte- ment moyen de l?algorithme na¨ ?f est plut? ot bon, comme le montre l?observation suivante : Version 6 f´ evrier 2005 340 Chapitre 10. Motifs Proposition 1.1. Si l?alphabet comporte au moins deux lettres, et dans l?hypo- th` ese d?une distribution de probabilit´ e uniforme et ind´ ependante sur les lettres, le nombre moyen de comparaisons pour rechercher un motif dans un texte de longueur n par l?algorithme na¨ ?f est au plus 2n. Bien entendu, les textes et les motifs n?ont, dans la pratique, aucune raison d?? etre ´ equiprobables, ce qui limite quelque peu la port´ ee de la proposition. Preuve. Soit q = |A|. Consid´ erons un motif fix´ e x = x1 · · · xm. Nous montrons que le nombre moyen de comparaisons de caract` eres faites dans la comparaison de x ` a tk+1 · · ·tk+m est major´ e par 2. Ce nombre est m i=1 ici o` u ci est la probabilit´ e pour que l?on fasse exactement i comparaisons. Or m i=1 ici = m i=1 di o` u di = ci +· · ·+cm est la probabilit´ e pour que l?on fasse au moins i comparaisons. Maintenant, on fait au moins i comparaisons lorsque x1 · · · xi?1 = tk+1 · · · tk+i?1 de sorte que di = 1/qi?1 . Le nombre moyen de comparaisons est donc 1 + 1/q + · · · + 1/qm?1 ? 1 + 1 q ? 1 ? 2 Il en r´ esulte que le nombre moyen de comparaisons de l?algorithme na¨ ?f sur un texte t de longueur n est major´ e par 2n. 10.1.2 L?algorithme de Morris et Pratt La lenteur de l?algorithme na¨ ?f, dans le cas le plus d´ efavorable, s?explique par le fait qu?en cas d?´ echec, il recommence ` a z´ ero la comparaison du motif x au facteur suivant de t, sans exploiter l?information contenue dans la r´ eussite partielle de la tentative pr´ ec´ edente. Si l?´ echec s?est produit ` a la i-i` eme lettre du motif x, on a (voir figure 1.2) pour un entier k x1 · · · xi?1 = tk+1 · · · tk+i?1 et xi = tk+i Toute recherche ult´ erieure qui commence dans le facteur tk+1 · · · tk+i?1 peut tirer profit du fait que le mot tk+1 · · · tk+i?1 est un pr´ efixe du motif x. Si une nouvelle recherche commence en position + 1 (avec k < < k + i ? 1), elle compare Version 6 f´ evrier 2005 10.1. Recherche d?un motif 341 k k+1 t : k+i b -1 a b c 1 x : a i -1       ? ? ? a b c ? ? ? l x : a b c ? ? ? Figure 1.2: Echec ` a la i-i` eme lettre du motif. t +1t +2 · · · ` a x1x2 · · ·. Or t +1t +2 · · · est un suffixe de tk+1 · · · tk+i?1 qui lui est ´ egal ` a x1 · · · xi?1. En d?autres termes, on compare x1x2 · · · ` a un suffixe de x1 · · · xi?1, donc ` a un morceau du motif lui-m? eme! Ces comparaisons sont ind´ ependantes du texte t, puisqu?elles ne concernent que des morceaux du motif. On peut donc les faire avant de consid´ erer t, et on peut en attendre un gain de temps substantiel dans la mesure o` u ce pr´ etraitement sur le motif ne sera fait qu?une seule fois et qu?il permettra d?´ eviter, lors de l?examen du texte, de r´ ep´ eter des comparaisons identiques ` a plusieurs endroits diff´ erents du texte. Le pr´ etraitement sur le motif x que nous allons r´ ealiser permettra de reconna? ?tre rapidement les seules configurations o` u la recherche d?une occurrence vaut la peine d?? etre continu´ ee. Pour cela, il s?agit de d´ eterminer les indices i o` u le mot x1 · · · xi?1 se termine par un pr´ efixe de x. Introduisons une d´ efinition. Soit u un mot quelconque non vide; un bord de u est un mot distinct de u qui est ` a la fois pr´ efixe et suffixe de u. Exemple. Le mot u = abacaba poss` ede les trois bords ?, a, et aba. Le mot u = abcabcab poss` ede les bords ?, ab et abcab. On note Bord(x) et on appelle bord maximal le bord le plus long d?un mot non vide x. Si x est de longueur m, on d´ efinit une fonction ? : {0, 1, . . . , m} ? {?1, . . . , m ? 1} d´ ependant de x par ?(0) = ?1 et pour i > 0, par ?(i) = |Bord(x1 · · · xi)| Bien entendu, ?(i) ? i ? 1. Voici par exemple les bords maximaux et leurs longueurs, pour les pr´ efixes du mot abacabac : a b a c a b a c Indice 0 1 2 3 4 5 6 7 8 Bord ? ? ? a ? a ab aba abac ? ?1 0 0 1 0 1 2 3 4 Version 6 f´ evrier 2005 342 Chapitre 10. Motifs Revenons ` a l?am´ elioration de l?algorithme na¨ ?f. Si (voir figure 1.3) x1 · · · xi?1 = tk+1 · · · tk+i?1 et xi = tk+i, alors le mot tk+p+1 · · · tk+i?1 ne peut ? etre d´ ebut d?une occurrence de x que s?il est un bord de x1 · · · xi?1. Il suffit donc, pour chercher une occurrence, de d´ ecaler x k 1 k+1 k+p+1 t : x :     x : k+i Bord(x1...x ) ? ? ? ( ) i a b ? ? -1 i ? ? -1 i -1 ( ) i -1 1+ ? ? ? ? ? ? i -1 =s(i) Figure 1.3: D´ ecalage d?une position. d?une longueur appropri´ ee pour superposer x1 · · · xi?1 avec son plus grand bord. Le d´ ecalage se r´ ealise en poursuivant les comparaisons entre la lettre tk+i et la lettre x1+?(i?1). Dans la pratique, on utilise ` a la place de ? une fonction s : {1, . . . , m} ? {0, . . . , m} d´ efinie pour i = 1, . . . , m par s(i) = 1 + ?(i ? 1) de sorte que le d´ ecalage consiste ` a remplacer i par s(i). La fonction s est appel´ ee la fonction de suppl´ eance du motif x. Voici par exemple les fonctions ? et s pour le mot abacabac : a b a c a b a c 0 1 2 3 4 5 6 7 8 ? ?1 0 0 1 0 1 2 3 4 s 0 1 1 2 1 2 3 4 Avec la fonction de suppl´ eance, on obtient l?algorithme ci-dessous, d? u ` a Morris et Pratt. Dans cet algorithme, j est l?indice de la lettre courante du texte t, et i l?indice de la lettre courante du motif x. A chaque tour dans la boucle tantque, on a x1 · · · xi?1 = tj?i+1 · · · tj?1 Si tj = xi, on progresse dans l?analyse, et sinon on d´ ecale x en rempla¸ cant i par s(i) = 1 + ?(i ? 1). Version 6 f´ evrier 2005 10.1. Recherche d?un motif 343 proc´ edure Morris-Pratt(x, t); i := 1; j := 1; tantque i ? m et j ? n faire si i ? 1 etalors t[j] = x[i] alors i := s(i) sinon i := i + 1; j := j + 1 finsi fintantque; si i > m alors occurrence de x ` a la position j ? m sinon pas d?occurrence de x dans t finsi. Proposition 1.2. L?algorithme de Morris et Pratt calcule une occurrence d?un motif x dans un texte t en au plus 2|t| ? 1 comparaisons de caract` eres, si l?on dispose de la fonction de suppl´ eance sur x. Preuve. Posons n = |t|. Appelons test positif un test pour lequel t[j] = x[i], et test n´ egatif un test pour lequel t[j] = x[i]. Chaque test positif incr´ emente i et j, et chaque test n´ egatif diminue i, ´ eventuellement de plus d?une unit´ e. Comme chaque test positif augmente j, il y a au plus n tests positifs. Il n?y a n tests positifs que si i ne s?annule pas. Pour compter le nombre de tests n´ egatifs, consid´ erons l?entier j ? i. Au d´ ebut, j?i = 0. Un test positif ne change pas la valeur de j?i, un test n´ egatif l?augmente strictement. Donc le nombre de tests n´ egatifs est major´ e par la valeur qu?a j ? i ` a la fin du calcul, donc par n ou par n ? 1 selon que i s?annule ou non. Exemple. La table suivante donne, pour la recherche du motif x = abacabac dans le texte t = babacacabacaab, la suite des valeurs que prend l?indice i dans l?algorithme : j 1 2 3 4 5 6 7 8 9 10 11 12 13 14 b a b a c a c a b a c a a b i 1 0 1 2 3 4 5 6 2 1 0 1 2 3 4 5 6 2 1 2 La figure 1.4 montre les d´ ecalages successifs du motif. Les diff´ erences sont cons- tat´ ees aux positions sombres du texte. Le nombre total de comparaisons est 18. Lorsque j = 7 et i = 6, on a tj = xi, et on compare t7 ` a la lettre qui suit le bord maximal de x1 · · · x5, ` a savoir x2. Le m? eme sch´ ema se r´ ep` ete pour j = 13, et en fait chaque fois qu?une lettre tj est compar´ ee ` a x6. A chaque fois, on compare tj ` a x2, et cette comparaison est inutile parce que x6 = x2. Une version de l?algorithme, due ` a Knuth, Morris et Pratt et que nous pr´ esentons plus loin permet d?´ eliminer en partie ces comparaisons redondantes. Version 6 f´ evrier 2005 344 Chapitre 10. Motifs t : x : b b a a c c a b a c a b a a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 a a b c b a a c a a b c b a a c a a b c b a a c a a b c b a a c a a b c b a a c a a b c b a a c a a b c b a a c Figure 1.4: D´ ecalages successifs du motif. 10.1.3 Bords Pour compl´ eter l?expos´ e de l?algorithme de Morris et Pratt, il faut indiquer com- ment calculer la fonction ? ou, de mani` ere ´ equivalente, la fonction de suppl´ eance. Cela demande une ´ etude plus approfondie des bords d?un mot. Proposition 1.3. Soit x un mot non vide, et soit k le plus petit entier tel que Bordk (x) = ?. (1) Les bords de x sont les mots Bord(x), Bord2 (x), . . . , Bordk (x). (2) Soit a une lettre. Alors Bord(xa) est le plus long pr´ efixe de x qui est dans l?ensemble {Bord(x)a, Bord2 (x)a, . . . , Bordk (x)a, ?}. Preuve. (1) Un bord de Bord(x) est aussi un bord de x, donc les mots Bord(x), Bord2 (x), . . ., Bordk (x) sont tous des bords de x. R´ eciproquement, soit z un bord de x. Ou bien z = Bord(x), ou alors z est un bord de Bord(x). Par r´ ecurrence, z est un des mots Bord(x), Bord2 (x), . . ., Bordk (x). (2) Soit z un bord de xa. Si z = ?, alors z = z a, o` u z est un bord de x. Donc, par (1), z est un des mots de l?ensemble B = {Bord(x)a, Bord2 (x)a, . . . , Bordk (x)a, ?} R´ eciproquement, tout mot de B est suffixe de xa, donc est un bord de xa s?il est pr´ efixe de xa. On d´ eduit de la proposition la caract´ erisation suivante du plus long bord : Corollaire 1.4. Soit x un mot non vide et soit a une lettre. Alors Bord(xa) = Bord(x)a si Bord(x)a est pr´ efixe de x, Bord(Bord(x)a) sinon. Version 6 f´ evrier 2005 10.1. Recherche d?un motif 345 Preuve. Si Bord(x)a est pr´ efixe de x, alors Bord(xa) = Bord(x)a. Dans le cas contraire, posons y = Bord(x). Alors Bord(xa) est pr´ efixe de y, et par le (2) de la proposition 1.3, Bord(xa) est le plus long pr´ efixe de x, donc de y, dans l?ensemble {Bord(y)a, Bord2 (y)a, . . . , Bordk?1 (y)a, ?}. A nouveau par 1.3(2), cela signifie que Bord(xa) = Bord(ya). Voici quelques exemples : x = ababb Bord(x) = ? Bord(xa) = Bord(x)a x = babbaa Bord(x) = ? Bord(xa) = Bord(a) = ? x = abaaab Bord(x) = ab Bord(xa) = Bord(x)a = aba x = abbaab Bord(x) = ab Bord(xa) = Bord(aba) = a Un autre corollaire de la proposition 1.3 indique comment calculer efficacement la fonction ?. On a en effet : Corollaire 1.5. Soit x un mot de longueur m. Pour j = 0, . . . , m ? 1, on a ?(1 + j) = 1 + ?k (j) o` u k ? 1 est le plus petit entier tel que l?une des deux conditions suivantes est v´ erifi´ ee (i) 1 + ?k (j) = 0; (ii) 1 + ?k (j) = 0 et x1+?k(j) = x1+j. Ce corollaire se traduit en une proc´ edure qui calcule la fonction ? pour un mot x, sous la forme d?un tableau : proc´ edure Bords-maximaux(x, ?); ?[0] := ?1; pour j de 1 ` a m faire i := ?[j ? 1]; tantque i ? 0 etalors x[j] = x[i + 1] faire i := ?[i] fintantque; ?[j] := i + 1 finpour. Une proc´ edure tout ` a fait semblable calcule la fonction de suppl´ eance : proc´ edure Suppl´ eance(x, s); s[1] := 0; pour j de 1 ` a m ? 1 faire i := s[j]; tantque i > 0 etalors x[j] = x[i] faire i := s[i] fintantque; s[j + 1] := i + 1 finpour. Version 6 f´ evrier 2005 346 Chapitre 10. Motifs Une preuve analogue ` a celle de la proposition 1.2 montre que le calcul de la fonction ? d?un motif de longueur m se fait en 2m?3 comparaisons de caract` eres. Corollaire 1.6. La recherche d?une occurrence d?un motif x de longueur m dans un texte t de longueur n par l?algorithme de Morris et Pratt demande au plus 2(n + m) ? 4 comparaisons de caract` eres. 10.1.4 L?algorithme de Knuth, Morris et Pratt L?algorithme de Knuth, Morris et Pratt que nous pr´ esentons maintenant est une am´ elioration de l?algorithme pr´ ec´ edent, bas´ ee sur l?´ elimination de situations qu?il est inutile d?examiner.  ? ? ? ? ? ? ?   ? ? ? ? ? ? ?   ? ? ? ? ? ? ?  ????????????? ????????????? ????????????? k 1 k+1 k+p t : x : k+i a b -1 i -1 i k+i 1 i-p p ??????????????? ??????????????? ??????????????? ? ?? ? ? c Figure 1.5: Lorsque b = a, le d´ ecalage est inutile si c = a. Revenons ` a la configuration o` u une recherche du motif x = x1 · · · xm dans un texte t = t1 · · · tn a ´ echou´ e parce que x1 · · · xi?1 = tk+1 · · · tk+i?1 et xi = tk+i Le d´ ecalage propos´ e par l?algorithme de Morris et Pratt est d´ etermin´ e par la longueur du bord Bord(x1 · · · xi?1); la nouvelle position du motif d´ ebute ` a la lettre d?indice p + 1, avec p = i ? 1 ? ?(i ? 1) (voir figure 1.5). Ce d´ ecalage n?est utile que si l?on est assur´ e de pouvoir r´ eellement progresser, c?est-` a-dire si la lettre tk+i est ´ egale ` a la lettre de x qui va lui ? etre compar´ ee, ` a savoir la lettre xi?p ; sinon, il faut chercher un autre bord. Or, cette condition ne peut pas ? etre traduite en une condition sur le mot x seul, donc ne peut pas ? etre incluse dans le pr´ etraitement de x. Mais on peut la remplacer par une condition plus faible et exiger de ne pas se retrouver dans la m? eme situation que pr´ ec´ edemment, ` a savoir que xi?p = xi. C?est cette condition suppl´ ementaire qui est test´ ee dans l?algorithme de Knuth, Morris et Pratt. Pour la mettre en ?uvre, on d´ efinit une fonction analogue ` a la fonction ? de Morris et Pratt, et qui va tenir compte de cette condition. Aupa- ravant, introduisons une d´ efinition. Version 6 f´ evrier 2005 10.1. Recherche d?un motif 347 Soit x = x1 · · · xm. Deux pr´ efixes u et v de x sont disjoints (dans x) si x1+|u| = x1+|v| ou si l?un des deux mots est x tout entier. Le pr´ efixe u est un bord disjoint du pr´ efixe v si u est un bord de v, et si u et v sont des pr´ efixes disjoints de x. Si v poss` ede un bord disjoint dans x, on note DBord(v) le plus long bord disjoint de v, appel´ e bord disjoint maximal de v. Contrairement ` a la notion de bord, le concept de bord disjoint n?est d´ efini que sur les pr´ efixes d?un mot x. Exemple. Soit x = abcababcac. Le pr´ efixe v = abcababca de x poss` ede les trois bords ?, a, abca qui sont tous les trois disjoints de v. Les pr´ efixes ab et abcabab de x ne sont pas disjoints car ils sont tous les deux suivis de la lettre c. Le pr´ efixe w = abcababc enfin a les deux bords ? et abc, dont aucun n?est disjoint de w; il n?a donc pas de bord maximal disjoint. On d´ efinit la fonction ? = ?x : {0, . . . , m} ? {?1, . . . , m ? 1} par ?(0) = ?1 et, pour j = 1, . . . , m, ?(j) = |DBord(x1 · · ·xj)| si x1 · · · xj a un bord disjoint dans x; ?1 sinon. Exemple. Voici les fonctions ? et ? tabul´ ees pour le motif x = abcababcac. Leur comparaison illustre le gain que l?on peut attendre de l?usage de ? ` a la place de ?. a b c a b a b c a c j 0 1 2 3 4 5 6 7 8 9 10 ?(j) ?1 0 0 0 1 2 1 2 3 4 0 ?(j) ?1 0 0 ?1 0 2 0 0 ?1 4 0 Soit v un pr´ efixe du mot x. Les bords de v sont, par la proposition 1.3, les mots Bord(v), Bord2 (v), . . . , Bordk (v), ?, o` u k est le plus grand entier tel que Bordk (v) = ?. Les longueurs des bords de v sont donc les nombres ?(j), ?2 (j), . . ., ?k (j), 0, avec j = |v|. Il en r´ esulte que si ?(j) = ?1, alors ?(j) = ?d (j), o` u d est le plus petit entier tel que Bordd (v) est disjoint de v. Proposition 1.7. Soit x = x1 · · · xm un mot non vide; la fonction ? = ?x v´ eri- fie, pour j ? 1 ?(j) = ?(j) si j = m ou x1+j = x1+?(j), ?(?(j)) sinon. Preuve. Soit j ? 1. Si j = m, alors ?(m) = ?(m). Supposons donc j < m, et soit x1 · · · xi le bord maximal de x1 · · · xj. On a donc i = ?(j). Si x1+i = x1+j, alors ?(j) = ?(j). Si x1+i = x1+j, les bords disjoints de x1 · · · xi sont exactement les bords disjoints de x1 · · ·xj car si x1 · · · xk est un tel bord, on a x1+k = x1+j si et seulement si x1+k = x1+i, donc ?(j) = ?(i). Version 6 f´ evrier 2005 348 Chapitre 10. Motifs Cette proposition permet de calculer ? ` a partir de la fonction ?. R´ eciproquement, ? peut s?exprimer en fonction de ?, et la combinaison de ces deux relations permet d?´ evaluer ? sans calculer pr´ ealablement la fonction ?. Proposition 1.8. Soit x un mot de longueur m. Pour j = 0, . . . , m ? 1, on a ?(1 + j) = 1 + ?k (?(j)) o` u k ? 0 est le plus petit entier tel que l?une des deux conditions suivantes est v´ erifi´ ee : (i) 1 + ?k (?(j)) = 0; (ii) 1 + ?k (?(j)) = 0 et x1+?k(?(j)) = x1+j. Preuve. Posons i = ?(j) et y = x1 · · · xi, et soit a = x1+i, et b = x1+j. Si a = b, alors ?(1 + j) = 1 + ?(j), et la formule est vraie avec k = 0. Sinon, ?(1 + j) est soit nul, soit l?un des nombres 1 + ?r (j). Or, parmi les mots y, Bord(y), . . ., il suffit d?examiner ceux qui sont suivis d?une lettre autre que b. Il suffit donc de chercher le bord maximal disjoint de y, dont la longueur est ?(i). En vertu des propositions 1.7 et 1.8, on obtient la proc´ edure que voici pour le calcul de ?. La boucle tantque calcule en fait ?(j) : proc´ edure Bords-disjoints-maximaux(x, ?); ?[0] := ?1; i := ?1; pour j de 1 ` a m faire {ici i = ?(j ? 1)} tantque i ? 0 etalors x[j] = x[i + 1] faire i := ?[i] fintantque; i := i + 1; {ici i = ?(j)} si x[1 + j] = x[1 + i] alors ?[j] := i sinon ?[j] := ?[i] finpour. Introduisons une deuxi` eme fonction de suppl´ eance r d´ efinie par r(i) = 1 + ?(i ? 1) On peut alors calculer r par proc´ edure Deuxi` eme-suppl´ eance(x, r); r[1] := 0; i := 0; pour j de 1 ` a m ? 1 faire tantque i > 0 etalors x[j] = x[i] faire i := r[i] fintantque; i := i + 1; si x[1 + j] = x[i] alors r[1 + j] := i sinon r[1 + j] := r[i] finpour. Version 6 f´ evrier 2005 10.1. Recherche d?un motif 349 Avec cette deuxi` eme fonction de suppl´ eance, l?algorithme de Knuth, Morris et Pratt s?´ ecrit exactement comme l?algorithme de Morris et Pratt. La seule modi- fication est le remplacement de s par r. Nous changeons tr` es l´ eg` erement sa struc- ture, en rempla¸ cant le double test sur i et j par deux boucles tantque imbriqu´ ees, ceci pour pouvoir mettre en ´ evidence la notion de d´ elai entre l?examen de deux caract` eres : proc´ edure Knuth-Morris-Pratt(x, t); i := 1; j := 1; tantque i ? m et j ? n faire tantque i > 0 etalors t[j] = x[i] faire i := r[i] fintantque; i := i + 1; j := j + 1 fintantque; si i > m alors occurrence de x ` a la position j ? m sinon pas d?occurrence de x dans t finsi. Revenons sur un exemple pr´ ec´ edent, o` u l?on cherche le motif x = abacabac dans le texte t = babacacabacaab. Les deux fonctions de suppl´ eance s et r sont les suivantes : a b a c a b a c 1 2 3 4 5 6 7 8 s 0 1 1 2 1 2 3 4 r 0 1 0 2 0 1 0 2 La figure 1.6 montre les d´ ecalages successifs du motif. Les diff´ erences sont consta- t´ ees aux positions sombres du texte. Le nombre total de comparaisons est 16. t : x : b b a a c c a b a c a b a a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 a a b c b a a c a a b c b a a c a a b c b a a c a a b c b a a c a a b c b a a c Figure 1.6: D´ ecalages successifs du motif. Version 6 f´ evrier 2005 350 Chapitre 10. Motifs Le tableau donne, pour chaque lettre, la suite des valeurs que prend l?indice i dans l?algorithme : j 1 2 3 4 5 6 7 8 9 10 11 12 13 14 b a b a c a c a b a c a a b i 1 0 1 2 3 4 5 6 1 0 1 2 3 4 5 6 1 2 Lorsque j = 7 et i = 6, on a tj = xi, et on compare cette fois-ci t7 directement ` a la lettre x1. La diff´ erence entre les deux fonctions de suppl´ eance appara? ?t bien si on trace leur graphe (figure 1.7). Il est clair que l?algorithme de Knuth, Morris et 1 8 2 3 4 5 6 7 0  ? ? ?   ? ? ?   ? ? ?   ? ? ?   ? ? ?  ??????? ??????? ??????? ??????? ??????? ????? ????? ????? ????? ????? ??????????? ??????????? ??????????? ??????????? ??????????? ??????????? ??????????? ??????????? ????? ????? ????? ????? ????? ?? ? ? ? ?? ? ?? s r Figure 1.7: Les graphes des deux fonctions de suppl´ eance. Pratt est plus efficace que l?algorithme de Morris et Pratt, m? eme si, dans le cas le plus d´ efavorable, leur complexit´ e est la m? eme. Une diff´ erence de comportement notable entre ces deux algorithmes concerne le d´ elai, c?est-` a-dire le nombre ma- ximum de comparaisons de caract` eres faites sur un caract` ere du texte ` a analyser. Dans l?algorithme ci-dessus, c?est le nombre de tours effectu´ es dans la boucle tant- que interne. Le d´ elai est le temps que l?on doit attendre avant de pouvoir passer au caract` ere suivant du texte t, et il mesure donc jusqu?` a quel point l?algorithme est diff´ erent d?un algorithme en temps r´ eel, c?est-` a-dire est capable de traiter un symbole par unit´ e de temps. Il a ´ et´ e prouv´ e que le d´ elai de l?algorithme de Morris et Pratt peut atteindre la longueur m du motif, alors que pour Knuth, Morris et Pratt, il ne d´ epasse jamais 1 + log? m, o` u ? = (1 + ? 5)/2. En ce sens aussi, l?algorithme de Knuth, Morris et Pratt, sans ? etre plus difficile ` a programmer, est plus efficace. 10.1.5 L?automate des occurrences Dans cette section, nous montrons comment l?algorithme de Knuth, Morris et Pratt s?interpr` ete en termes d?automates finis. Soit A l?alphabet sur lequel sont ´ ecrits le texte et le motif. Soit x ? A? le motif dont on cherche ` a d´ eterminer les Version 6 f´ evrier 2005 10.1. Recherche d?un motif 351 occurrences dans le texte t. Comme x a une occurrence dans t si et seulement si t ? A? xA? , d´ eterminer les occurrences de x dans t ´ equivaut ` a trouver les pr´ efixes de t qui appartiennent au langage (rationnel) A? x. Pour cela, il suffit de construire l?automate reconnaissant A? x, et de lui faire lire le texte t. Or, un automate reconnaissant A? x est vite construit. C?est l?automate A = (P, ?, x, F) o` u P est l?ensemble des pr´ efixes de x, l?´ etat initial est le mot vide, l?unique ´ etat final est le motif x, et dont les fl` eches sont F = {(?, a, ?) | a ? A} ? {(p, a, pa) | p, pa ? P, a ? A} Exemple. Pour A = {a, b, c}, et pour x = abcababcac, l?automate A est donn´ e dans la figure 1.8, o` u les ´ etats sont repr´ esent´ es par leur longueur. a a ,b,c 0 1 2 3 4 5 6 7 8 9 b c a b a b c a c 10 Figure 1.8: Automate reconnaissant le langage A?abcababcac. Dans la mesure o` u cet automate n?est pas d´ eterministe, il n?est pas facilement exploitable. Nous allons voir que l?automate minimal d´ eterministe reconnaissant A? x n?est pas difficile ` a calculer et a autant d?´ etats que l?automate ci-dessus, ` a savoir 1 + m, o` u m est la longueur de x. Pour le caract´ eriser, nous consid´ erons la fonction fx qui ` a tout mot u associe fx(u) = le plus long suffixe de u qui est pr´ efixe de x Par exemple, pour x = abcababcac, on a fx(abacababc) = abc; si p est pr´ efixe de x, on a ´ evidemment fx(p) = p. Proposition 1.9. Soit x un mot et soit P l?ensemble de ses pr´ efixes. L?automate minimal reconnaissant A? x est l?automate d´ eterministe A(x) = (P, ?, x) dont la fonction de transition est d´ efinie par p · a = fx(pa). Preuve. Nous allons v´ erifier que pour tout u ? A? , u?1 (A? x) = fx(u)?1 (A? x) Ceci prouve que les ´ etats de l?automate minimal s?identifient aux pr´ efixes de x, et que la fonction de transition est bien celle indiqu´ ee. Soit donc u ? A? , et soit u tel que u = u fx(u). On a u?1 (A? x) = fx(u)?1 u ?1 (A? x) ? fx(u)?1 (A? x) Version 6 f´ evrier 2005 352 Chapitre 10. Motifs Pour prouver l?inclusion r´ eciproque, soit w ? u?1 (A? x). Alors uw ? A? x, et il existe donc un mot v tel que uw = vx. Si x est suffixe de w, alors w ? A? x, donc fx(u)w ? A? x et w ? fx(u)?1 (A? x). Si en revanche w est suffixe de x, appelons z le mot tel que x = zw. Alors on a aussi u = vz, donc z est suffixe de u et pr´ efixe de x. Par d´ efinition de fx(u), il existe y tel que fx(u) = yz. Mais alors fx(u)w = yzw = yx, montrant que w ? fx(u)?1 (A? x). Ceci prouve l?inclusion et ach` eve la d´ emonstration. L?automate A(x) est l?automate des occurrences. On obtient imm´ ediatement l?al- gorithme suivant de recherche de motifs, o` u le texte t = t1 · · ·tn est de longueur n. Dans la mesure o` u l?automate des occurrences A(x) est disponible et rang´ e dans une table (de taille O(|A|(|x| + 1))), le calcul de l?´ etat suivant se fait en temps constant, et le temps d?ex´ ecution de l?algorithme est O(n) pour un texte de longueur n. proc´ edure Recherche-automate(x, t); q :=´ etat initial; pour j de 1 ` a n faire q := q · t[j]; si q est ´ etat final alors j est une fin d?occurrence finsi finpour. L?automate A(x) pour x = abcababcac est donn´ e dans la figure 1.9. Les ´ etats sont repr´ esent´ es par leurs longueurs. L?expression donn´ ee ci-dessous fait le lien avec a b,c b c a b a b c a c 1 2 3 4 5 6 7 8 9 10 c b b,c c a a a c a a a a b b c b b,c b,c 0 Figure 1.9: Automate d´ eterministe A(abcababcac). l?algorithme de Morris et Pratt. Version 6 f´ evrier 2005 10.1. Recherche d?un motif 353 Proposition 1.10. La fonction de transition de l?automate des occurrences A(x) v´ erifie, pour tout pr´ efixe p non vide de x et toute lettre a, p · a = pa si pa est pr´ efixe de x; Bord(pa) sinon. Preuve. Si pa est pr´ efixe de x, alors fx(pa) = pa; sinon, fx(pa) est le plus long suffixe de pa qui est pr´ efixe de x, donc pr´ efixe de pa, c?est-` a-dire Bord(pa). Le calcul de la fonction de transition de l?automate des occurrences est en fait assez facile, et est r´ ealisable en temps lin´ eaire. Ceci r´ esulte du corollaire suivant : Corollaire 1.11. La fonction de transition de l?automate des occurrences A(x) v´ erifie, pour tout pr´ efixe p non vide de x et toute lettre a p · a = pa si pa est pr´ efixe de x; Bord(p) · a sinon. Preuve. L?´ enonc´ e r´ esulte imm´ ediatement de la proposition si pa est pr´ efixe de x. Si pa n?est pas pr´ efixe de x, alors en vertu de 1.4 p · a = Bord(pa) = Bord(p)a si Bord(p)a est pr´ efixe de p, Bord(Bord(p)a) sinon, donc Bord(pa) = Bord(p) · a. Corollaire 1.12. La fonction de transition de l?automate des occurrences A(x) v´ erifie, pour tout pr´ efixe p de x et toute lettre a p · a = pa si pa est pr´ efixe de x; DBord(p) · a si DBord(p) existe; ? sinon. Preuve. Si p = ? et pa n?est pas pr´ efixe de x, alors p.a = Bord(pa). Si Bord(pa) = ?, alors Bord(pa) = qa, o` u q est le plus long bord de p tel que qa est pr´ efixe de x. Comme pa n?est pas pr´ efixe de x, le mot q est un bord disjoint de p; d?o` u la formule par r´ ecurrence. Exemple. Pour l?automate de la figure 1.9, les fonctions ? et ? prennent les valeurs suivantes : a b c a b a b c a c 0 1 2 3 4 5 6 7 8 9 10 ? ?1 0 0 0 1 2 1 2 3 4 0 ? ?1 0 0 ?1 0 2 0 0 ?1 4 0 On en d´ eduit par exemple que 5 · b = 2 · b = 0, et de fa¸ con similaire 9 · a = 4 · a(= 1 · a) = 0 · a = 1, selon que l?on utilise la formule du premier ou du deuxi` eme corollaire. Enfin, 3 · b = 3 · c = 0. Version 6 f´ evrier 2005 354 Chapitre 10. Motifs La recherche d?un motif x avec un automate fini se fait en temps r´ eel. La fonction de transition de l?automate se calcule, ` a partir de ? ou de ?, en temps lin´ eaire, c?est-` a-dire en temps O(|x| · |A|), o` u A est l?alphabet de base. L?inconv´ enient majeur est l?encombrement de l?automate : sa taille, qui est ´ egalement O(|A|(|x|+ 1)), devient prohibitive si A est par exemple l?alphabet des 256 caract` eres Ascii ´ etendus. 10.1.6 L?algorithme de Simon I. Simon a propos´ e un algorithme qui est un compromis entre l?algorithme de Knuth, Morris et Pratt, et l?impl´ ementation par automate. Simon part de l?au- tomate minimal A(x) associ´ e ` a un motif x de longueur m, et remarque qu?il n?y a que peu de fl` eches significatives : il y a d?abord les fl` eches avant , qui font passer d?un ´ etat i ` a l?´ etat i + 1, et les fl` eches arri` ere , qui font passer d?un ´ etat i ` a un ´ etat j < i, avec j = 0. Les autres fl` eches m` enent ` a l?´ etat 0, et ne sont pas significatives . Nous prouverons que les fl` eches significatives (nous dirons actives) sont en nombre au plus 2m, et si l?on ne stocke que celles-ci, on est ramen´ e ` a un algorithme en place lin´ eaire, ind´ ependamment de la taille de l?alphabet. En contrepartie, la recherche de la bonne fl` eche pour effectuer une transition ne se fait plus en temps constant (donc l?algorithme n?est pas en temps r´ eel), mais le rangement des transitions peut ? etre organis´ e de mani` ere ` a rendre cette recherche toujours au moins aussi efficace que dans l?algorithme de Knuth, Morris et Pratt. Soit donc x ? A? un motif de longueur m, et soit A(x) = (P, ?, x) l?automate minimal reconnaissant A? x. On identifiera souvent un ´ etat de P, c?est-` a-dire un pr´ efixe p de x, ` a sa longueur. Une fl` eche (p, a, q) de l?automate est une fl` eche active si q = ?, elle est passive si q = ?. Une fl` eche active (p, a, q) est une fl` eche avant si q = pa, c?est une fl` eche arri` ere si q = pa (et q = ?). Exemple. La figure 1.10 donne l?automate de la figure 1.9, o` u l?on n?a conserv´ e que les fl` eches actives. Il y a 9 fl` eches arri` ere. a b c a b a b c a c 1 2 3 4 5 6 7 8 9 10 a a a c a a a a b 0 Figure 1.10: Automate A(abcababcac), sans ses fl` eches passives. Version 6 f´ evrier 2005 10.1. Recherche d?un motif 355 Le motif x ´ etant de longueur m, l?automate A(x) a m fl` eches avant. Nous allons prouver qu?il a au plus m fl` eches arri` ere. Pour cela, nous avons besoin d?une d´ efinition qui a par ailleurs son int´ er? et propre. Soit w = a1 · · · an un mot, avec a1, . . . , an des lettres. Une p´ eriode de w est un entier p > 0 tel que ai = ap+i pour tout i = 1, . . . , n ? p Notons que |w| est toujours une p´ eriode de w. Par exemple, le mot w = abcababca, de longueur 9, a les p´ eriodes 9, 8, 5. On peut voir une p´ eriode comme un d´ ecalage qui conserve la co¨ ?ncidence des lettres qui se superposent. Plus pr´ ecis´ e- ment, on a le lemme suivant : Lemme 1.13. Soit w un mot de longueur n, et soit p > 0. Alors p est une p´ eriode de w si et seulement si w poss` ede un bord de longueur n ? p. Preuve. Soit w = a1 · · · an. Alors p est une p´ eriode si et seulement si a1 · · ·an?p = a1+p · · · an, donc si et seulement si le pr´ efixe de longueur n ? p de w est aussi suffixe de w. Notons p´ er(w) la plus petite p´ eriode de w. Il r´ esulte du lemme 1.13 que p´ er(w) + ?(w) = |w| (1.1) o` u ?(w) est la longueur du plus long bord de w. Revenons ` a l?automate A(x). Proposition 1.14. L?automate A(x) a au plus |x| fl` eches arri` ere. Preuve. Nous allons d?abord prouver l?assertion que voici : si (p, a, q) et (p , a , q ) sont deux fl` eches arri` ere distinctes, alors p´ er(pa) = p´ er(p a ). Soient en effet (p, a, q) et (p , a , q ) deux fl` eches arri` ere. Par la proposition 1.10, on a q = Bord(pa), q = Bord(p a ), et q = ?, q = ?. Supposons, en raisonnant par l?absurde, que pa et p a ont m? eme p´ eriode, disons t = p´ er(pa) et, pour fixer les id´ ees, supposons |p| ? |p |. Si k = |pa|, on a t < k par l?´ equation 1.1. Notons b la lettre d?indice k dans p a . Alors a = b. Ceci est clair si |p | > |p| parce que p est pr´ efixe de x, alors que pa ne l?est pas. C?est vrai aussi si |p | = |p| parce qu?alors b = a = a. Comme t est une p´ eriode de pa, les lettres d?indice k et k ? t de pa sont les m? emes. Comme p est pr´ efixe de x, la lettre d?indice k ? t de pa est xk?t, donc xk?t = a. Or t est aussi une p´ eriode de p a , et donc les lettres d?indice k et k ? t de p a sont les m? emes. On a donc aussi xk?t = b, ce qui est impossible puisque a = b. Ceci prouve l?assertion. Il r´ esulte de l?assertion que l?application qui ` a une fl` eche arri` ere (p, a, Bord(pa)) as- socie p´ er(pa) est injective. Or p´ er(pa) = |pa|?Bord(pa) < |pa| d?apr` es l?´ equation 1.1, donc 1 ? p´ er(pa) ? |x|, ce qui montre la proposition. Version 6 f´ evrier 2005 356 Chapitre 10. Motifs L?impl´ ementation de Simon de l?automate A(x) consiste ` a associer, ` a chaque ´ etat p, la liste des fl` eches avant et arri` ere issues de p, ordonn´ ees par num´ ero d´ ecroissant d?´ etat d?arriv´ ee. Chaque fl` eche u = (p, a, q), pour p fix´ e, est repr´ esent´ ee par un couple (lettre(u),´ etat(u)) = (a, q). Avec cette structure de donn´ ees, le calcul de l?´ etat suivant se fait par la fonction : fonction Etat-suivant-par-Simon(p, a); u :=t? ete-liste(p); tantque u = vide faire si lettre(u) = a alors retourner ´ etat(u) sinon u := suivant(u) fintantque; retourner(0). et l?algorithme de recherche du motif x, de longueur m, dans un texte t de longueur n est, comme pour tout automate (voir la proc´ edure Recherche-automate) : proc´ edure Simon(x, t); p := 0; pour j de 1 ` a n faire p :=Etat-suivant-par-Simon(p, t[j]); si p = m alors j est une fin d?occurrence finpour. Exemple. L?impl´ ementation de l?automate A(abcababcac) est repr´ esent´ ee dans la figure 1.11; les pr´ efixes sont repr´ esent´ es par leur longueur. a ,1 b,2 c,3 a ,4 b,5 a ,6 b,7 c,8 a ,9 c,10 1 2 3 4 5 6 7 8 9 10 0 a ,1 a ,1 a ,1 a ,1 a ,1 a ,1 a ,1 a ,1 c,3 b,5 Figure 1.11: Impl´ ementation de l?automate A(abcababcac). Proposition 1.15. L?algorithme de Simon calcule les occurrences d?un motif x dans un texte t en un nombre de comparaisons de caract` eres inf´ erieur ou ´ egal ` a celui de l?algorithme de Knuth, Morris et Pratt. Version 6 f´ evrier 2005 10.1. Recherche d?un motif 357 Preuve. Soit p un ´ etat, et soit a une lettre. Le nombre de comparaisons faites par l?algorithme de Simon pour d´ eterminer l?´ etat suivant est ´ egal au nombre de comparaisons faites dans la liste associ´ ee ` a l?´ etat p. La premi` ere comparaison concerne la fl` eche avant, les suivantes des fl` eches arri` ere; si toutes les comparaisons sont n´ egatives, c?est une fl` eche passive qui est utilis´ ee. Soit (p, b, p · b) une fl` eche arri` ere. Alors par le corollaire 1.11, p · b = qb, et q est un bord disjoint de p. En d?autres termes, si (p, a1, q1a1), . . . , (p, ak, qkak) est la suite ordonn´ ee des fl` eches arri` ere, les ´ etats q1, . . . , qk sont des bords disjoints de p, et mutuellement disjoints. Ils figurent donc dans l?ensemble {DBord(p), DBord2 (p), . . .} Comme les ´ etats sont rang´ es en ordre d´ ecroissant, ces bords disjoints sont cal- cul´ es successivement dans l?algorithme de Knuth, Morris et Pratt, alors que l?algorithme de Simon n?en s´ electionne qu?un sous-ensemble. Il reste ` a pr´ eciser comment r´ ealiser, en temps lin´ eaire, l?impl´ ementation de Simon, c?est-` a-dire le calcul de la suite ordonn´ ee des fl` eches actives pour chaque ´ etat. Notons F(p) la suite ordonn´ ee des fl` eches actives issues de l?´ etat p; chaque fl` eche est repr´ esent´ ee par le couple (lettre, ´ etat d?arriv´ ee), comme dans la figure 1.11. Soit x = x1 · · · xm un motif. Pour l?´ etat initial ? de l?automate A(x), la suite F(?) des fl` eches actives est r´ eduite ` a l?´ el´ ement (x1, 1). Soit p un autre ´ etat, et soit i = |p| sa longueur. La suite F(p) contient tout d?abord la fl` eche (xi+1, i+1), sauf lorsque i = m. Pour d´ eterminer les autres fl` eches, nous utilisons le corollaire 1.12. Si DBord(p) existe, c?est-` a-dire si ?(i) = ?1, alors on a p · a = DBord(p) · a pour toute lettre a = xi+1. Ainsi, la suite F(p) se prolonge par la suite F(DBord(p)) des fl` eches actives de DBord(p), purg´ ee de la fl` eche dont la lettre est xi, si cette fl` eche y figure. Si en revanche DBord(p) n?existe pas, la suite F(p) est r´ eduite ` a son premier ´ el´ ement. Il est clair que la copie d?une liste, avec purge ´ eventuelle d?un ´ el´ ement, se fait en temps lin´ eaire. L?impl´ ementation de Simon se calcule donc en temps lin´ eaire, puisque la fonction ? se calcule, elle aussi, en temps lin´ eaire. Exemple. La fonction ?x pour x = abcababcac a d´ ej` a ´ et´ e donn´ ee plus haut. Ses valeurs sont : a b c a b a b c a c j 0 1 2 3 4 5 6 7 8 9 10 ?(j) ?1 0 0 ?1 0 2 0 0 ?1 4 0 La liste F(8) est r´ eduite ` a (a, 9) parce que ?(8) = ?1; la liste F(9) est la con- cat´ enation de (c, 10) et de F(4); enfin, la liste F(5) est compos´ ee de (a, 6) et de la liste F(2), purg´ ee de son ´ el´ ement (a, 1), donc r´ eduite ` a (c, 3). Version 6 f´ evrier 2005 358 Chapitre 10. Motifs 10.2 L?algorithme de Boyer et Moore L?algorithme de Boyer et Moore se rattache au sch´ ema g´ en´ eral des algorithmes de recherche que nous avons expos´ e au d´ ebut de la section pr´ ec´ edente : on compare le motif x ` a certains facteurs du texte t, en faisant glisser x de gauche ` a droite le long du texte t. La diff´ erence principale entre l?algorithme de Boyer et Moore et les algorithmes pr´ ec´ edents r´ eside dans la mani` ere de comparer le motif x aux facteurs du texte. Alors que l?algorithme na¨ ?f et l?algorithme de Knuth, Morris et Pratt comparent les lettres du motif x aux lettres du facteur de t de la gauche vers la droite, l?algorithme de Boyer et Moore les compare de la droite vers la gauche. Cette modification apparemment anodine est tr` es rentable puisqu?en pratique, l?algo- rithme de Boyer et Moore est le plus rapide des algorithmes connus. 10.2.1 Algorithme de Horspool Dans sa version la plus simple, l?algorithme (appel´ e algorithme de Boyer-Moore- Horspool) compare le motif x = x1 · · · xm ` a un facteur tk+1 · · · tk+m du texte. Si une diff´ erence entre x et ce facteur est constat´ ee, on d´ ecale le motif vers la droite de mani` ere ` a faire co¨ ?ncider la derni` ere lettre du facteur, c?est-` a-dire la lettre tk+m, avec son occurrence la plus ` a droite dans x. Exemple. La figure 2.1 montre le fonctionnement de l?algorithme de Boyer- Moore-Horspool sur le texte t = aabbbababacaabbaba · · · et le motif x = aababab. Les diff´ erences sont constat´ ees aux positions 4, 11, 18 du texte (cases sombres du t : x : a b a a a b b a b a a b b a b a c a b a b a a b b a b a a a b b a b a a a b b a b a a a b b a b a a a b b 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Figure 2.1: Algorithme de Horspool. texte et de l?occurrence du motif). Les lettres qui d´ eterminent le d´ ecalage sont soulign´ ees (les indices correspondants sont gras). La premi` ere diff´ erence constat´ ee conduit ` a d´ ecaler le motif de 2 vers la droite pour faire co¨ ?ncider la lettre b ` a la cinqui` eme position dans x avec la septi` eme lettre du texte. La deuxi` eme diff´ erence entra? ?ne ` a nouveau un d´ ecalage de 2. La troisi` eme diff´ erence constat´ ee doit entra? ?ner un d´ ecalage pour faire co¨ ?ncider la lettre c avec une lettre du motif. Version 6 f´ evrier 2005 10.2. L?algorithme de Boyer et Moore 359 Comme il n?y a pas d?occurrence de la lettre c dans le motif, le motif est d´ ecal´ e de toute sa longueur. Le dernier d´ ecalage est d?une unit´ e, parce qu?il y a une occurrence de a en avant-derni` ere position dans x. Soit x un mot de longueur m. Pour toute lettre a de l?alphabet, soit d(a) la distance entre la derni` ere occurrence de a dans x (la derni` ere place except´ ee) et la derni` ere lettre de x. Plus pr´ ecis´ ement d(a) = |u| si au est suffixe de x, u = ? et a ne figure pas dans u, |x| si a ne figure pas dans x. La fonction d est la fonction de derni` ere occurrence. Par exemple, pour le mot x = aababab, la fonction de derni` ere occurrence vaut : a b c d 1 2 7 L?algorithme esquiss´ e plus haut est le suivant (x est un mot de longueur m, et t un texte de longueur n). La version que nous donnons calcule toutes les occurrences de x dans t : Algorithme Boyer-Moore-Horspool(x, t); j := m; tantque j ? n faire i := m; tantque i > 0 etalors tj?m+i = xi faire i := i ? 1 fintantque; si i = 0 alors j est une fin d?occurrence de x; j := j + 1 sinon j := j + d[tj] finsi fintantque. Sur notre exemple, les valeurs successives que prend l?indice j dans la boucle externe sont 7, 9, 11, 18, 19. Le nombre de comparaisons de caract` eres n?est que 12. Cet exemple illustre l?efficacit´ e des algorithmes du type Boyer et Moore : en pra- tique, on constate que le nombre total de comparaisons est tr` es souvent inf´ erieur ` a la longueur du texte. En d?autres termes, ces algorithmes n?examinent m? eme pas tous les caract` eres, par opposition ` a tous les algorithmes op´ erant de la gauche vers la droite qui, eux, examinent au moins une fois chaque caract` ere. En revanche, il n?est pas difficile de voir que l?algorithme est en temps O(|x||t|) dans le cas le plus d´ efavorable. Consid´ erons le motif x = bam?1 dont on cherche une occurrence Version 6 f´ evrier 2005 360 Chapitre 10. Motifs dans an . La fonction de d´ ecalage n?apporte pas d?am´ elioration puisque d(a) = 1. On fait donc n ? m d´ ecalages, et chaque test demande (s?il est fait de droite ` a gauche) m comparaisons de caract` eres. Le comportement en moyenne de l?algorithme a fait l?objet d?´ etudes exp´ erimen- tales et est tout ` a fait excellent. On peut prouver, mais cela d´ epasse le cadre de ce texte, que l?algorithme est sous-lin´ eaire en moyenne (voir les notes). La comparaison entre x et tj?m+1 · · · tj est faite de droite ` a gauche, mais on pourrait aussi bien la faire de gauche ` a droite; ce qui importe c?est le calcul du d´ ecalage en fonction de la derni` ere lettre du facteur. Il reste ` a calculer la fonction de derni` ere occurrence d pour le motif x. Cela se fait tr` es simplement comme suit : proc´ edure Derni` ere-occurrence (x, d); pour toute lettre a de A faire d[a] := m finpour; pour i de 1 ` a m ? 1 faire d[xi] := m ? i finpour. Bien entendu, ce calcul de d peut ? etre inclus au d´ ebut de la proc´ edure pour l?algorithme de Boyer, Moore et Horspool. 10.2.2 Algorithme de Boyer et Moore La fonction de derni` ere occurrence peut ? etre employ´ ee diff´ eremment : alors que dans la version de Horspool, le d´ ecalage est d´ etermin´ e par la derni` ere lettre du facteur examin´ e, on peut utiliser la lettre du facteur o` u la diff´ erence a ´ et´ e consta- t´ ee. Ainsi, la superposition du motif x = aababab au facteur aabcbab conduit, dans Horspool, ` a un d´ ecalage de 2 ` a cause de la lettre b terminant le facteur, et ceci ind´ ependamment du fait que c?est ` a l?occurrence de la lettre c dans le facteur que la diff´ erence a ´ et´ e constat´ ee. Dans une variante de l?algorithme de Boyer et Moore (pour ? etre historiquement exact, c?est Horspool qui a introduit une variante de l?algorithme de Boyer et Moore), c?est la lettre o` u la diff´ erence se manifeste qui d´ etermine le d´ ecalage. Plus pr´ ecis´ ement, lorsqu?une co¨ ?ncidence partielle du texte et du motif est constat´ ee : xi = tj, xi+1 · · ·xm = tj+1 · · · tm+j?i on d´ ecale le motif pour faire co¨ ?ncider la lettre tj avec xd(tj ), c?est-` a-dire avec la derni` ere occurrence de tj dans x, puis on recommence les comparaisons sur le nou- veau facteur du texte; toutefois, ce d´ ecalage n?est fait que si cela fait r´ eellement avancer le motif, c?est-` a-dire lorsque d(tj) > m ? i; sinon, on d´ ecale le motif de 1. En d?autres termes, la comparaison est reprise pour les nouvelles valeurs j := j + max(d(tj), m ? i + 1); i := m Voici l?algorithme obtenu : Version 6 f´ evrier 2005 10.2. L?algorithme de Boyer et Moore 361 Algorithme Boyer-Moore-simplifi´ e(x, t); j := m; tantque j ? n faire i := m; tantque i > 0 etalors tj = xi faire i := i ? 1; j := j ? 1 fintantque; si i = 0 alors fin d?une occurrence de x en j ; j := j + max(d[tj], m ? i + 1); fintantque. Exemple. Reprenons l?exemple pr´ ec´ edent de la recherche du motif x = aababab dans le texte t = aabbbababacaabbaba · · · avec l?algorithme de Boyer-Moore sim- plifi´ e. La figure 2.2 montre les d´ ecalages successifs du motif. Les diff´ erences sont t : x : a b a a a b b a b a a b b a b a c a b a b a a b b a b a a a b b a b a a a b b a b a a a b b a b a a a b b 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a b a a a b b a b a a a b b Figure 2.2: Algorithme de Boyer-Moore simplifi´ e. constat´ ees aux positions sombres du texte. Les valeurs successives que prend l?indice j en d´ ebut de la boucle tantque ext´ erieure sont indiqu´ ees en gras. Le nombre total de comparaisons de caract` eres est 14. La version compl` ete de l?algorithme de Boyer et Moore fait intervenir, en plus de la fonction de derni` ere occurrence d, une deuxi` eme fonction qui prend en compte le suffixe o` u la diff´ erence entre le motif et le texte a ´ et´ e constat´ ee. La fonction de derni` ere occurrence est employ´ ee de la fa¸ con que nous venons d?indiquer. Avant la description formelle, donnons une description sommaire de la deuxi` eme fonction de d´ ecalage. Supposons que la comparaison, de droite ` a gauche, du motif x = x1 · · · xm ` a un facteur du texte t ait mis en ´ evidence une co¨ ?ncidence avec un suffixe propre u = xi+1 · · · xm de x, mais que la lettre xi soit diff´ erente de la lettre correspondante tj du texte. On a donc (voir figure 2.3) : xi = tj, xi+1 · · ·xm = tj+1 · · · tj+m?i Version 6 f´ evrier 2005 362 Chapitre 10. Motifs t : x : a u z u i j Figure 2.3: Co¨ ?ncidence partielle du motif et du texte. Un d´ ecalage qui tient compte de cette information va aligner x sur la derni` ere occurrence de u dans x qui est pr´ ec´ ed´ ee d?une lettre diff´ erente de xi (voir figure 2.4). Le d´ ecalage (not´ e d2(i) dans la figure) est la quantit´ e dont l?indice j va t : x : a u z u i j b u p d i = ( ) 2 Figure 2.4: D´ ecalage : premier cas. ? etre augment´ ee; il est ´ egal ` a la longueur p du plus court suffixe v de x qui a u comme bord, et qui n?est pas pr´ ec´ ed´ e de la lettre xi. Il se peut que x n?ait pas x : a u i u p d i = ( ) 2  ? ? ? ? ? ? ?   ? ? ? ? ? ? ?   ? ? ? ? ? ? ?  Figure 2.5: D´ ecalage : deuxi` eme cas. d?occurrence du suffixe u pr´ ec´ ed´ ee d?une lettre diff´ erente de xi. Dans ce cas, on cherche le plus long suffixe de u qui est un pr´ efixe de x; le d´ ecalage (encore not´ e d2(i)) d´ epasse alors |x| (voir figure 2.5). Cette situation se produit en particulier si x = u. Dans ce cas, i = 0 et d2(0) = |x| + |Bord(x)|. Il est commode d?appeler, par analogie avec la notion de bord disjoint, bord dis- joint droit d?un suffixe v de x un bord u de v tel que les suffixes u et v ne sont pas pr´ ec´ ed´ es de la m? eme lettre dans x. Pour tout suffixe u de x on pose V (u) = {v | v est suffixe de x, u est bord disjoint droit de v} et W(u) = {w | x est suffixe de w, u est bord de w, |w| ? |ux|} L?ensemble V (u) contient les suffixes de x pour lesquels le premier type de d´ ecalage est possible, et W(u) contient les mots intervenant dans le deuxi` eme Version 6 f´ evrier 2005 10.2. L?algorithme de Boyer et Moore 363 cas; on peut clairement se limiter aux mots de longueur major´ ee par |ux|. La deuxi` eme fonction de d´ ecalage, que nous appellerons la fonction du bon suffixe est traditionnellement not´ ee d2. Elle est d´ efinie, pour i = 0, . . . , m, en posant u = xi+1 · · · xm par d2(i) = min v?V (u)?W (u) |v| Notons que les mots de W(u) sont de longueur sup´ erieure ` a |x|; on les consid` ere donc uniquement lorsque V (u) = ?. Exemple. Consid´ erons le mot x = aababab. La fonction du bon suffixe est : 0 1 2 3 4 5 6 7 x a a b a b a b d2(i) 14 13 12 6 10 6 8 1 Pour i = 5, le suffixe u = ab est bord des suffixes abab et ababab. Seul le deuxi` eme est disjoint de u, donc V (u) = {ababab}, et d2(5) = 6. Pour i = 4, le suffixe est u = bab; on a V (u) = ? et W(u) = {ux}, donc d2(4) = 10. Pour i = 7, le mot vide est bord disjoint de b, donc d2(1) = 1. L?algorithme de Boyer et Moore proc` ede comme suit : Le motif x = x1 · · · xm est compar´ e aux facteurs de longueur m du texte t. Pour une position donn´ ee, on compare les lettres de la droite vers la gauche. Lorsqu?une diff´ erence est constat´ ee, c?est-` a-dire lorsque xi = tj pour des indices i et j, l?indice j est incr´ ement´ e, l?indice i remis ` a m, et la comparaison recommence sur les lettres tj et xi. Pour l?incr´ ementation de j, on peut choisir l?une ou l?autre des fonctions de d´ ecalage; en fait, on choisit celle qui fournit la plus grande valeur. D?o` u l?algorithme : Algorithme Boyer-Moore(x, t); j := m; tantque j ? n faire i := m; tantque i > 0 etalors tj = xi faire i := i ? 1; j := j ? 1 fintantque; si i = 0 alors j est une fin d?occurrence de x; j := j + d2[i] sinon j := j + max(d[tj], d2[i]) finsi fintantque. Exemple. Reprenons le m? eme exemple du texte t = aabbbababacaabbaba · · · et du motif x = aababab avec l?algorithme de Boyer et Moore complet. La Version 6 f´ evrier 2005 364 Chapitre 10. Motifs t : x : a b a a a b b a b a a b b a b a c a b a b a a b b a b a a a b b a b a a a b b a b a a a b b 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Figure 2.6: Algorithme de Boyer-Moore complet. figure 2.6 montre les d´ ecalages successifs du motif. Les diff´ erences sont constat´ ees aux positions sombres du texte. Les valeurs successives que prend l?indice j en d´ ebut de la boucle tantque ext´ erieure sont indiqu´ ees en gras. Le nombre total de comparaisons de caract` eres est 8. Malgr´ e son efficacit´ e exp´ erimentale, l?algorithme de Boyer et Moore peut prendre un temps en O(|x||t|) lorsque l?on cherche toutes les occurrences d?un motif dans un texte (prendre x = am et t = an ). Une modification de l?algorithme a ´ et´ e propos´ ee qui permet, au moyen d?un pr´ etraitement plus compliqu´ e, d?obtenir un temps lin´ eaire dans tous les cas. R. Cole a prouv´ e r´ ecemment qu?avec cet algorithme, le nombre de comparaisons est toujours born´ e par 3|t|. La preuve est compliqu´ ee et ne sera pas donn´ ee ici. 10.2.3 Fonction du bon suffixe Pour compl´ eter l?expos´ e de l?algorithme de Boyer et Moore, nous allons calculer la fonction du bon pr´ efixe d2. Il s?av` ere que l?on peut se ramener ` a des concepts familiers en retournant le motif (c?est-` a-dire en prenant son image miroir). Nous allons en fait calculer une fonction du bon pr´ efixe du motif. Soit x = x1 · · · xm un mot, et soit u un pr´ efixe de x. Posons V ? (u) = {v | v est pr´ efixe de x et u est bord disjoint de v} Par ailleurs, soit (en conformit´ e avec la notation de la section 10.2.5) fu(x) le plus long suffixe de x qui est pr´ efixe de u et wu = gu(x)u, o` u gu(x) est d´ efini par gu(x)fu(x) = x. On d´ efinit la fonction du bon pr´ efixe ? pour i = 0, . . . , m ? 1 et u = x1 · · · xi par ?(i) = min v?V ?(u)?{wu} |v| Si d2 est la fonction du bon suffixe de x? = xm · · · x1, alors par construction d2(i) = ?(m ? i) i = 1, . . . , m ? 1 Pour d´ eterminer la fonction du bon pr´ efixe, il faut ´ evaluer l?ensemble V ? (u) et le mot wu pour chaque pr´ efixe u de x. Les mots wu se calculent bien ` a l?aide de la Version 6 f´ evrier 2005 10.2. L?algorithme de Boyer et Moore 365 fonction ? = ?x qui donne, pour chaque pr´ efixe x1 · · ·xj de x, la longueur ?(j) du bord maximal de x1 · · · xj. Nous avons d´ ej` a expliqu´ e plus haut comment calculer cette fonction. Consid´ erons alors les nombres m, ?(m), ?2 (m), . . . , ?r (m) = 0 et soit u = x1 · · · xi un pr´ efixe de x. Si i est dans l?intervalle [?k (m), ?k?1 (m)[, on a |fu(x)| = ?k (m), puisque fu(x) est un bord de x. Il en r´ esulte que |wu| = |gu(x)| + |u| = m ? ?k (m) + i Ceci conduit aux instructions suivantes qui calculent les longueurs |wu| pour les pr´ efixes de x : j := m; tantque j > 0 faire pour i de ?[j] ` a j ? 1 faire ?[i] := m ? ?[j] + i; j := ?[j] fintantque Venons-en aux mots de V ? (u). Posons u = x1 · · · xi. Alors V ? (u) = {x1 · · ·xj | ?(j) = i et xj+1 = xi+1} ? ?i o` u ?i est un terme correctif d´ efini par ?i = {x} si ?(m) = i; ? sinon. Pour ´ evaluer correctement ces mots, il semble ` a premi` ere vue n´ ecessaire de d´ eter- miner tous les bords disjoints de tous les pr´ efixes de x, ce qui conduit ` a un algorithme qui n?est plus lin´ eaire en temps. En fait, le morceau de programme suivant convient : (1) pour j de 1 ` a m ? 1 faire (2) i := ?[j]; (3) tantque i ? 0 etalors xj+1 = xi+1 faire (4) ?[i] := min(?[i], j); (5) i := ?[i] (6) fintantque (7) finpour Expliquons pourquoi ce programme est correct. Si l?on remplace les lignes (3)?(6) par Version 6 f´ evrier 2005 366 Chapitre 10. Motifs (3 ) tantque i ? 0 faire (4 ) si xj+1 = xi+1 alors ?[i] := min(?[i], j); (5 ) i := ?[i] (6 ) fintantque le programme calcule tous les bords disjoints, et choisit le plus petit. Le premier programme ne calcule qu?un sous-ensemble des bords disjoints; pour un indice j donn´ e, il calcule uniquement la suite de bords disjoints cons´ ecutifs ` a partir du plus grand bord de x1 . . . xj. En d?autres termes, d` es que l?on rencontre un bord, disons x1 · · · xk, qui n?est pas disjoint de x1 . . . xj, le calcul des bords est interrompu. Ceci se justifie par la double observation suivante : un bord de x1 · · · xk est disjoint de x1 · · · xk si et seulement s?il est disjoint de x1 · · · xj, et les bords disjoints de x1 · · · xk (donc les bords disjoints manquants de x1 · · · xj) ont d´ ej` a ´ et´ e calcul´ es lorsque l?indice de la boucle pour a pris la valeur k. En composant les deux parties que nous venons de d´ evelopper, on obtient le programme complet calculant la fonction du bon pr´ efixe : proc´ edure Bon-Pr´ efixe(x, ?); j := m; tantque j > 0 faire pour i de ?[j] ` a j ? 1 faire ?[i] := m ? ?[j] + i; j := ?[j] fintantque; pour j de 1 ` a m ? 1 faire i := ?[j]; tantque i ? 0 etalors xj+1 = xi+1 faire ?[i] := min(?[i], j); i := ?[i] fintantque finpour. Cette proc´ edure calcule la fonction du bon pr´ efixe en temps lin´ eaire. La fonction du bon suffixe s?obtient en trois ´ etapes; on prend l?image miroir du motif, on en calcule la fonction du bon pr´ efixe, et on en d´ eduit d2 : proc´ edure Bon-Suffixe(x, d2); pour i de 1 ` a m faire y[i] := x[m + 1 ? i]; Bords-maximaux(y, ?); Bon-Pr´ efixe(y, ?); d2[0] := m + ?[0]; pour i de 1 ` a m faire d2[i] := ?[m ? i]. On peut ne pas passer par l?image miroir et on peut incorporer le calcul de ? ` a l?int´ erieur de la proc´ edure, mais le programme devient moins facile ` a comprendre. Version 6 f´ evrier 2005 10.3. L?algorithme de Aho et Corasick 367 10.3 L?algorithme de Aho et Corasick Soit X un ensemble fini de mots. Nous consid´ erons ici le probl` eme de localisation des occurrences des mots de X dans un texte t. On peut faire cette recherche s´ equentiellement, et chercher successivement les oc- currences de chaque motif dans le texte, ` a l?aide d?un des algorithmes pr´ esent´ es pr´ ec´ edemment. Cette d´ emarche n?est pas efficace, puisqu?elle oblige ` a lire le texte t autant de fois qu?il y a de motifs. En revanche, un algorithme qui effectue la recherche parall` element pour chaque motif semble prometteur. C?est essentielle- ment le fonctionnement de l?algorithme de Aho et Corasick que nous pr´ esentons ici. Il g´ en´ eralise l?algorithme de Knuth, Morris et Pratt au cas de plusieurs motifs ` a rechercher dans un texte. L?algorithme se pr´ esente comme une g´ en´ eralisation de l?automate des occurrences. On construit un automate d´ eterministe reconnaissant l?ensemble A? X, sans toutefois expliciter compl` etement sa fonction de transition, puis on utilise une fonction de suppl´ eance similaire ` a celle d´ ecrite pr´ ec´ edemment pour guider le cheminement dans l?automate. Soit donc X un ensemble fini de mots sur un alphabet A, et soit P l?ensemble des pr´ efixes des mots de X. On construit un automate A = (P, ?, P ? A? X) reconnaissant A? X, dont P est l?ensemble d?´ etats, ? est l?´ etat initial et P ? A? X l?ensemble d?´ etats terminaux. La fonction de transition est d´ efinie, pour p ? P et a ? A, par p · a = fX (pa) o` u fX est une extension de la fonction fx utilis´ ee dans l?algorithme de Knuth, Morris et Pratt. Elle est d´ efinie par fX(u) = le plus long suffixe de u qui est dans P. En particulier, p · a = pa si pa ? P. La partie de l?automate form´ ee seulement des fl` eches (p, a, pa), avec p et pa dans P, est appel´ ee le squelette de l?automate. Exemple. Consid´ erons l?ensemble X = {aba, bab, acb, acbab, cbaba} de 5 mots sur l?alphabet A = {a, b, c}. Le squelette de l?automate A est donn´ e dans la figure 3.1. Les ´ etats sont num´ erot´ es de fa¸ con arbitraire. La fa¸ con d?obtenir que 4 est ´ etat terminal sera expliqu´ e plus loin. Pour poursuivre l?analogie avec l?automate des occurrences, d´ efinissons, pour tout mot u non vide, le mot BordX(u) comme le plus long suffixe propre de u qui est dans P. Voici la fonction BordX pour l?ensemble ci-dessus. On a remplac´ e les pr´ efixes par leurs num´ eros. i = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 BordX(i) = ? 0 13 14 15 8 0 13 14 1 2 3 15 0 6 7 Version 6 f´ evrier 2005 368 Chapitre 10. Motifs c 0 1 2 3 4 5 6 7 8 9 b a b a b a c b 10 a 11 b 12 a b a b 15 13 14    ??? ??? Figure 3.1: Automate pour l?ensemble X. La fonction de transition de l?automate s?exprime ` a l?aide des bords. En effet : p · a = pa si pa ? P; BordX (pa) sinon; et de plus, BordX (pa) = BordX (p) · a si p = ?; ? sinon. Ces formules permettent d?´ evaluer la fonction de transition comme suit : fonction Transition(p, a); tantque pa / ? P et p = ? faire p := BordX(p) fintantque; si pa ? P alors retourner(pa) sinon retourner(?). Pour mettre en ?uvre cette fonction, on doit r´ esoudre deux probl` emes : il faut conna? ?tre la fonction BordX , et il faut savoir tester rapidement si pa est dans P. Consid´ erons d?abord la r´ ealisation du test. On peut calculer une table g indic´ ee par P × A, avec g[p, a] = pa si pa ? P ; ´ echec sinon, mais cette fa¸ con de faire est irr´ ealiste, car la table occupe trop de place d` es que l?alphabet est grand (par exemple, si A est l?ensemble des caract` eres Ascii). Si, dans une application donn´ ee, un tableau de cette taille ne cr´ ee pas de probl` eme, alors mieux vaut remplir avec la fonction de transition compl` ete de l?automate les cases qui contiendraient ´ echec , ce qui acc´ el` ere ensuite la recherche. De fa¸ con plus concr` ete, on range l?ensemble P des pr´ efixes des motifs de X dans un arbre; tester si, pour un pr´ efixe p et une lettre a, le mot pa est pr´ efixe, revient ` a tester s?il y a un arc sortant de p et ´ etiquet´ e par a. Ce test peut prendre un temps proportionnel ` a |A| (ou log(|A|) si l?on programme plus soigneusement, en Version 6 f´ evrier 2005 10.4. Recherche d?expressions 369 rangeant les fils d?un sommet dans un arbre binaire ´ equilibr´ e). La place prise par l?arbre est proportionnelle ` a Card(P) ? m, o` u m = x?X |x| est la somme des longueurs des motifs. La recherche des occurrences des mots de X dans un texte t = t1 . . . tn se fait par l?algorithme suivant, o` u l?on a incorpor´ e l?´ evaluation des transitions : proc´ edure Aho-Corasick(X, t) q := ?; {´ etat initial} pour i de 1 ` a n faire tant que qti / ? P et q = ? faire q := BordX [q] fintantque; si qti ? P alors q := qti sinon q := ? finsi; si q est un ´ etat final alors afficher(q) finsi finpour. Une table repr´ esentant la fonction BordX se calcule ` a l?aide d?un parcours en largeur du squelette de A. Simultan´ ement, on calcule les ´ etats terminaux autres que ceux correspondant aux mots de X. L?algorithme est le suivant : proc´ edure Bords-de-X(P, BordX ) pour a ? A faire BordX[a] := ? finpour; pour p ? P \ ? et a ? A tels que pa ? P faire q := BordX[p]; tantque qa / ? P et q = ? faire q := BordX[q] fintantque; si qa ? P alors BordX [pa] := qa sinon BordX[pa] := ? finsi; si qa est terminal alors ajouter pa aux ´ etats terminaux finsi; finpour. Il n?est alors pas difficile de voir que l?algorithme de calcul des occurrences des mots de X dans t est en temps O(n + m) et en place O(m) (plus pr´ ecis´ ement en temps O((n + m)|A|) ou O((n + m) log |A|) si l?on tient compte de la taille de l?alphabet). 10.4 Recherche d?expressions Le probl` eme que nous consid´ erons dans cette section est le suivant : ´ etant donn´ es une expression rationnelle e et un texte t, d´ eterminer s?il existe un mot dans le langage X = L(e) d´ enot´ e par e qui figure dans le texte t, et dans l?affirmative rapporter le mot et son occurrence. Ce probl` eme appara? ?t couramment dans les ´ editeurs de textes, d` es qu?ils ont des possibilit´ es de recherche un peu sophistiqu´ ees. Version 6 f´ evrier 2005 370 Chapitre 10. Motifs Comme pour la recherche de motifs, la question revient ` a chercher le ou les pr´ efixes du texte t qui appartiennent au langage A? X ; la d´ emarche est aussi la m? eme : on construit d?abord, en pr´ etraitement , un automate reconnaissant A? X, puis on cherche les pr´ efixes de t reconnus par cet automate. La construction d?un automate d´ eterministe pour le langage A? X n?est pas diffi- cile, mais il peut avoir un nombre consid´ erable d?´ etats, m? eme pour une expression courte : l?exemple donn´ e dans le chapitre pr´ ec´ edent montre que le nombre d?´ etats peut ? etre exponentiel en fonction de la taille de l?expression. Si l?on se contente d?un automate qui n?est pas n´ ecessairement d´ eterministe, c?est en revanche la reconnaissance d?un mot qui s?en trouve compliqu´ ee. Nous proposons un compro- mis entre ces deux possibilit´ es : on construit d?abord un automate asynchrone particulier pour le langage d´ enot´ e par une expression rationnelle e, et dont le nombre d?´ etats et de fl` eches est lin´ eaire en fonction de la taille de e. On montre ensuite que la recherche des occurrences des mots du langage dans un texte t de longueur n peut se faire en temps O(nm), o` u m est la taille de l?expression e. 10.4.1 Calcul efficace d?un automate Nous ´ etudions ici un proc´ ed´ e de calcul efficace d?un automate reconnaissant le langage d´ enot´ e par une expression rationnelle. Soit A un alphabet, et soit e une expression rationnelle sur A. La taille de e, not´ ee |e|, est le nombre de symboles figurant dans e. Plus pr´ ecis´ ement, on a |0| = |1| = |a| = 1 pour a ? A |e + f| = |e · f| = 1 + |e| + |f|, |e? | = 1 + |e| Nous allons construire, pour toute expression e, un automate reconnaissant L(e) qui a des propri´ et´ es particuli` eres. Un automate asynchrone A est dit normalis´ e s?il v´ erifie les conditions suivantes : (i) il existe un seul ´ etat initial, et un seul ´ etat final, et ces deux ´ etats sont distincts; (ii) aucune fl` eche ne pointe sur l?´ etat initial, aucune fl` eche ne sort de l?´ etat final; (iii) tout ´ etat est soit l?origine d?exactement une fl` eche ´ etiquet´ ee par une lettre, soit l?origine d?au plus deux fl` eches ´ etiquet´ ees par le mot vide ?. Notons que le nombre de fl` eches d?un automate normalis´ e est au plus le double du nombre de ses ´ etats. Proposition 4.1. Pour toute expression rationnelle e de taille m, il existe un automate normalis´ e reconnaissant L(e), et dont le nombre d?´ etats est au plus 2m. Preuve. Elle est constructive, et elle constitue en fait une autre d´ emonstration de ce que tout langage rationnel est reconnaissable. On proc` ede par r´ ecurrence Version 6 f´ evrier 2005 10.4. Recherche d?expressions 371 i t " i t a i t (1) (2) (3) Figure 4.1: Automates normalis´ es reconnaissant (1) l?ensemble vide, (2) le mot vide, (3) la lettre a. sur la taille de e. Pour e = 0, e = 1, et e = a, o` u a ? A, les automates de la figure 4.1 donnent des automates normalis´ es ayant 2 ´ etats. Si e = e + e , soient A = (Q , i , t ) et A = (Q , i , t ) deux automates normalis´ es reconnaissant des langages X = L(e ) et X = L(e ). On suppose Q et Q disjoints. t i A A i 0 0 0 i 0 0 0 0 t 0 0 t 1 1 1 1 Figure 4.2: Automate pour l?union. L?automate A = (Q ? Q ? {i, t}, i, t) o` u i et t sont deux nouveaux ´ etats distincts et dont les fl` eches sont, en plus de celles de A et de A , les quatre fl` eches (i, 1, i ), (i, 1, i ), (t , 1, t), (t , 1, t) reconna? ?t X ? X = L(e) (voir figure 4.2). L?automate est normalis´ e, et |Q| ? 2|e|. Si e = e · e , consid´ erons l?automate A = ((Q \ t ) ? Q , i , t ) obtenu en identifiant t et i , c?est-` a-dire en rempla¸ cant toute fl` eche aboutissant en t par la m? eme fl` eche, mais aboutissant en i (voir figure 4.3). i0 A 0 A 0 0 0 0 t 0 0 i Figure 4.3: Automate pour le produit. Cet automate reconna? ?t le langage X X ; clairement, son nombre d?´ etats est major´ e par 2|e|. Enfin, si e = e ? , l?automate A = (Q ? {i, t}, i, t) de la figure 4.4 qui, en plus des fl` eches de A , poss` ede les quatre fl` eches (i, 1, i ), (i, 1, t), (t , 1, i ), (t , 1, t) reconna? ?t le langage X ? = L(e). Il est normalis´ e et a 2 ´ etats de plus que A . Version 6 f´ evrier 2005 372 Chapitre 10. Motifs t i A i 0 0 0 t 1 1 1 1 Figure 4.4: Automate pour l?´ etoile. Exemple. Pour l?expression (a+b)? b(1+a)(1+a)? , la construction de la preuve produit l?automate de la figure 4.5, dans laquelle les fl` eches non marqu´ ees portent comme ´ etiquette le mot vide. Observons qu?il existe de nombreux chemins dont a b a b a t i * Figure 4.5: Un automate pour l?expression (a + b)?b(1 + a)(1 + a)?. l?´ etiquette est vide, par exemple de l?´ etat marqu´ e d?une ´ etoile ` a l?´ etat terminal. 10.4.2 Recherche d?occurrences Soit e une expression rationnelle; la recherche d?occurrences de mots d´ enot´ es par l?expression e dans un texte t se fait en deux ´ etapes; dans un premier temps, on construit un automate normalis´ e A reconnaissant le langage A? L(e), ` a partir de l?expression (a1 + · · · + ah)? e, o` u A = {a1, . . . , ah}. Cette ´ etape constitue le pr´ etraitement. Dans un deuxi` eme temps, le texte t est lu lettre par lettre. Pour chaque pr´ efixe de t, on calcule l?ensemble des ´ etats de A accessibles ` a partir de l?´ etat initial par ce pr´ efixe, et on affiche les pr´ efixes pour lesquels l?´ etat final est accessible. Cette deuxi` eme ´ etape est r´ ealisable en temps O(Nn) o` u N est le nombre d?´ etats de A et n est la longueur de t; la raison en est la forme particuli` ere de A qui permet de calculer chaque nouvel ensemble d?´ etats accessibles en temps lin´ eaire en N ` a partir du pr´ ec´ edent. Comme N = O(|e|), on obtient un algorithme en O(nm), o` u m = |e|. Le calcul d?un automate normalis´ e ` a partir d?une expression rationnelle peut se faire en temps et en place lin´ eaires en fonction de la taille de l?expression. Une fa¸ con ´ economique de repr´ esenter un automate normalis´ e est d?utiliser deux tables indic´ ees par son ensemble d?´ etats : la premi` ere contient, pour l?indice q, l?unique couple (a, q ), s?il existe, tel que (q, a, q ) est une fl` eche de l?automate avec a une Version 6 f´ evrier 2005 10.4. Recherche d?expressions 373 lettre; la deuxi` eme contient l?ensemble des ´ etats qui sont extr´ emit´ es de fl` eches d?origine q et ´ etiquet´ ees par le mot vide; cet ensemble a au plus 2 ´ el´ ements. Nous en venons maintenant ` a la reconnaissance. Soit A = (Q, i, t) un automate normalis´ e. Comment v´ erifier si un mot w est reconnu par l?automate A? Evidem- ment, on ne veut pas d´ eterminiser l?automate, pour ne pas perdre le profit du nom- bre r´ eduit d?´ etats et de fl` eches. La m´ ethode consiste ` a simuler la d´ eterminisation de l?automate A en conservant, ` a chaque ´ etape, l?ensemble des ´ etats accessibles de l?´ etat initial par un chemin dont l?´ etiquette est la partie d´ ej` a lue du mot d?entr´ ee. La seule difficult´ e est le calcul des ´ etats accessibles ` a partir d?un ´ etat par un chemin d?´ etiquette 1. Soit P un ensemble d?´ etats. Notons ?(P) l?ensemble des ´ etats q ? Q pour lesquels il existe p ? P et un chemin c : p ? q d?´ etiquette 1. Pour toute lettre a, notons P · a l?ensemble des ´ etats q ? Q tels qu?il existe une fl` eche (p, a, q) dans A, avec p ? P. Pour v´ erifier si un mot w = a1 · · ·an est reconnu par A, on construit une suite P0, . . . , Pn d?ensembles d?´ etats par P0 = ?({i}); Pk = ? (Pk?1 · ak) , k = 1, . . . , n. Il est imm´ ediat que Pk est l?ensemble des ´ etats accessibles de i par un chemin d?´ etiquette a1 · · · ak. Par cons´ equent, w est accept´ e par A si et seulement si l?´ etat final t appartient ` a Pn. On en d´ eduit donc l?algorithme suivant (o` u w = a1 · · ·an, trans(P, a) = P · a, et epsilon(P) = ?(P)) : fonction reconnaissance(w : mot) : bool´ een; P :=epsilon({i}); pour k de 1 ` a n faire P :=epsilon(trans(P, ak)) finpour; si (t ? P) alors retourner(vrai) sinon retourner(faux) finsi. Pour la mise en ?uvre de cet algorithme, nous repr´ esentons les ensembles d?´ etats par deux structures de donn´ ees, l?une qui permet l?adjonction et la suppression d?un ´ el´ ement en temps constant, comme une pile ou une file, et l?autre qui per- met l?adjonction et le test d?appartenance en temps constant, comme un vecteur bool´ een. La premi` ere ou la deuxi` eme structure est utilis´ ee dans le calcul de la fonction de transition : Version 6 f´ evrier 2005 374 Chapitre 10. Motifs fonction trans(P : ensemble; a : lettre) : ensemble; (1) R := ?; (2) pour q dans P faire (3) s?il existe q tel que (q, a, q ) est une fl` eche alors (4) R := R ? q (5) finsi (6) finpour; (7) retourner(R). L?initialisation ` a la ligne (1) se fait en temps O(N), si A a N ´ etats; le test ` a la ligne (3) est en temps constant, donc la boucle est en temps O(N). Le calcul de ? se fait bien entendu par un parcours de graphe, puisqu?il s?agit de calculer les ´ etats accessibles par des chemins compos´ es uniquement de fl` eches ´ etiquet´ ees par le mot vide. On peut l?impl´ ementer par exemple comme suit, en utilisant deux repr´ esentations d?un m? eme ensemble, la premi` ere (not´ ee T) permet- tant de tester en temps constant si cet ensemble est vide, et d?ajouter et de sup- primer des ´ el´ ements (pile ou file par exemple), la deuxi` eme (not´ ee R) permettant de tester l?appartenance en temps constant (un tableau bool´ een par exemple) : fonction epsilon(P : ensemble) : ensemble; (1) T := P; R := P; (2) tant que T = ? faire (3) choisir q dans T ; (4) pour chaque fl` eche (q, 1, q ) d?origine q faire (5) si q / ? R alors R := R ? q ; T := T ? q finsi (6) finpour (7) fintantque; (8) retourner(T). La ligne (1) se fait en temps lin´ eaire en N (nombre d?´ etats de l?automate A), la boucle (2) n?est pas ex´ ecut´ ee plus de N fois, puisqu?` a chaque tour on enl` eve un ´ el´ ement ` a T, et que l?on n?ajoute que des ´ etats non encore visit´ es. Le nombre de fl` eches examin´ ees dans la boucle (4) est au plus 2 (et ceci est essentiel pour la lin´ earit´ e de l?algorithme), et les op´ erations de la ligne (5) se font en temps constant. Ceci montre que l?algorithme est en temps O(N). Pour le test d?occurrences, on proc` ede comme pour la reconnaissance, sauf que l?on affiche toutes les positions o` u se termine un mot reconnu par l?automate. Voici l?algorithme (on a pos´ e t = t1 · · · tn) : Version 6 f´ evrier 2005 Notes 375 proc´ edure occurrences(t : mot) : bool´ een; P :=epsilon({i}); pour k de 1 ` a n faire P :=epsilon(trans(P, tk)); si l?´ etat terminal est dans P alors afficher(k) finsi; finpour. Notes Parmi les diff´ erents algorithmes de recherche d?un motif qui ont ´ et´ e expos´ es, l?algorithme de Boyer et Moore est exp´ erimentalement le plus rapide, et dans la variante de Horspool, il est simple ` a programmer. La fonction egrep de Unix utilise par exemple un algorithme de recherche d?expressions et, pour des cha? ?nes de caract` eres, l?algorithme de Boyer-Moore dans la variante de Horspool. L?´ edi- teur de texte Emacs fait amplement appel ` a la recherche d?expressions, par exem- ple dans le traitement du courrier. Les performances des divers algorithmes dans le cas le plus d´ efavorable sont bien connues, pour l?efficacit´ e en moyenne (sous l?hypoth` ese de distribution uniforme) certains des r´ esultats sont tr` es r´ ecents, et d?autres manquent encore. Voici une table de valeurs connues : pire cas moyenne Na¨ ?f |x| |t| 1 + 1/(q ? 1) Morris-Pratt 2|t| 1 + 1/q ? 2/q2 Knuth-Morris-Pratt id. ? Simon id. ? Horspool |x| |t| 2/(1 + q) Boyer-Moore simple id. ? Boyer-Moore (variante) 3|t| ? Les estimations en moyenne sont de M. R´ egnier et de Baeza-Yates, R´ egnier. Elles d´ esignent le nombre moyen de comparaisons par caract` ere du texte, et va- lent lorsque la longueur du motif et la taille q de l?alphabet sont grandes . L?estimation dans le cas le plus d´ efavorable de l?algorithme de Boyer-Moore, due ` a R. Cole, s?applique ` a une variante de cet algorithme. L?expos´ e de ce chapitre a profit´ e des notes du cours de M. Crochemore ` a l?Univer- sit´ e Paris 7. L?histoire des algorithmes de recherche de motifs jusqu?en 1977 est cont´ ee dans : D.E. Knuth, J.H. Morris Jr, V.R. Pratt, Fast pattern matching in strings, SIAM J. Comput. 6 (1977), 323?350. La version simplifi´ ee de l?algorithme, due ` a Morris et Pratt, et qui date de 1970, n?a jamais ´ et´ e publi´ ee. La r´ ef´ erence la plus compl` ete est : Version 6 f´ evrier 2005 376 Chapitre 10. Motifs A. V. Aho, Algorithms for finding patterns in strings, in : J. van Leeuwen, ed., Handbook of Theoretical Computer Science, Vol. A, North-Holland, 1990, 255? 300. Ce chapitre contient d?autres algorithmes, comme l?algorithme de Commentz- Walter qui est une version ` a la Boyer et Moore de la recherche d?un ensemble de motifs dans un texte. Les recherches continuent activement sur l?´ elaboration et l?´ evaluation d?algorithmes de recherche de motifs, en particulier d?algorithmes qui minimisent ` a la fois le nombre de comparaisons, le d´ elai, et la place requise pour conserver le pr´ etraitement. D?autres algorithmes pour une recherche en parall` ele, ou pour une recherche avec symboles indiff´ erents, ont aussi ´ et´ e propos´ es. Exercices 10.1. D´ ecrire comment il convient de modifier l?algorithme de Knuth, Morris et Pratt pour qu?il d´ etecte toutes les occurrences d?un motif dans un texte. 10.2. Deux mots u et v sont conjugu´ es s?il existe x, y tels que u = xy, v = yx. Donner un algorithme qui teste en temps O(n) si deux mots de longueur n sont conjugu´ es. 10.3. Les mots de Fibonacci sont d´ efinis par f0 = a, f1 = ab, et fn+2 = fn+1fn pour n ? 0. Montrer que Bord(fn+2) = fn. 10.4. Donner des exemples de mots x pour lesquels l?automate A(x) a exacte- ment |x| fl` eches arri` ere. 10.5. Montrer que tout chemin d?´ etiquette x dans l?automate A(x) utilise au plus une fl` eche arri` ere. 10.6. Montrer que l?algorithme de Boyer et Moore fait de l?ordre de 3|t| op´ e- rations en cherchant une occurrence de x = (bak )2 dans t = ak+2 (bak+2 )p , quels que soient les entiers positifs k et p. 10.7. Montrer que l?automate construit dans l?algorithme de Aho et Corasick n?est en g´ en´ eral pas l?automate minimal reconnaissant A? X. 10.8. Soit A un alphabet, et soit ? une lettre qui n?est pas dans A. Si u = a1 · · · am et v = b1 · · · bm sont deux mots, avec ai, bi ? A ? {?}, on pose u v si ai = ? implique ai = bi pour 1 ? i ? m. Soit x = x1 · · · xm un mot de longueur m sur A. L?automate de Boyer et Moore de x, not´ e A(x), a pour ´ etats les mots y de longueur m sur A ? {?} tels que y x (accessibles ` a partir de l?´ etat initial comme expliqu´ e ci-dessous). L?´ etat initial est ?m , l?´ etat final est x. La fonction de transition est d´ efinie comme suit. Soit q = u?v, avec v = xk+1 · · · xm ? A? , soit a ? A, et soit p = uav = y1 · · · ym. Alors q · a = p si a = xk ; y1+d · · · ym?d sinon, Version 6 f´ evrier 2005 Exercices 377 o` u d est le plus petit entier tel que y1+d · · ·ym x1 · · · xm?d. Par exemple, l?automate de Boyer et Moore de aba est donn´ e dans la figure ci-dessous. ab a ?? a ?b a a? ? a? a ?? ? ?b ? a b a b b a a a b b b a Figure 4.6: L?automate de Boyer et Moore pour aba. a) Ecrire un programme qui prend en argument un mot x et qui calcule l?automate de Boyer et Moore. b) Montrer que si toutes les lettres de x sont distinctes, l?automate a exactement m(m + 1)/2 ´ etats. c) Montrer que si x = ai baj avec i + j + 1 = m, alors A(x) a ?(m3 ) ´ etats. Version 6 f´ evrier 2005 378 Chapitre 10. Motifs Version 6 f´ evrier 2005 379 Chapitre 11 G´ eom´ etrie algorithmique La premi` ere section de ce chapitre contient un rappel de quelques notations clas- siques en g´ eom´ etrie euclidienne, ainsi que la mise en place d?outils ´ el´ ementaires qui nous seront utiles dans les sections suivantes. La deuxi` eme section est con- sacr´ ee aux algorithmes de calcul de l?enveloppe convexe d?un ensemble fini de points du plan. Nous terminons par un algorithme dynamique plus sophistiqu´ e. Quelques probl` emes de localisation d?un point dans le plan divis´ e en r´ egions sont ´ etudi´ es dans la troisi` eme section; on y utilise des structures de donn´ ees assez complexes, en particulier les ensembles ordonn´ es persistants. La derni` ere section est consacr´ ee aux diagrammes de Vorono¨ ? de points et de segments. 11.1 Notions pr´ eliminaires Le d´ eveloppement r´ ecent de l?algorithmique g´ eom´ etrique est d? u aux progr` es de la technologie. En effet, la synth` ese d?images par ordinateur ´ etait encore, il y a quelques ann´ ees, fort co? uteuse. Les ordinateurs actuels ont une rapidit´ e et une puissance de calcul qui rendent l?interactivit´ e possible en infographie. Il est inutile de souligner l?importance de cet outil comme moyen de communication entre la machine et l?utilisateur. La g´ eom´ etrie joue un r? ole fondamental dans un grand nombre de domaines tels que vision par ordinateur, robotique, conception assist´ ee par ordinateur, de- sign industriel, image de synth` ese, etc. Cela explique l?importance algorith- mique des probl` emes g´ eom´ etriques. Grossi` erement, on peut, si l?on y tient, placer une fronti` ere entre les math´ ematiques et l? informatique de la fa¸ con suivante. Le math´ ematicien prouve l?existence d?un objet : l?enveloppe convexe d?un ensem- ble fini de points du plan est un polygone convexe , l?informaticien le calcule (si c?est possible), et cherche un algorithme efficace (s?il en existe). Dans ce chapitre, nous pr´ esentons des algorithmes pour quelques probl` emes fonda- mentaux de g´ eom´ etrie plane. Il est int´ eressant de noter que certains principes algo- Version 6 f´ evrier 2005 380 Chapitre 11. G´ eom´ etrie algorithmique rithmiques classiques tels que la dichotomie se r´ ev` elent souvent particuli` erement adapt´ es ` a un certain nombre de probl` emes g´ eom´ etriques. D?autre part, de nou- velles m´ ethodes sp´ ecifiques ` a la g´ eom´ etrie ´ emergent. Parmi elles, on peut citer le principe de balayage de l?espace par un hyperplan. Ce principe permet de trans- former un probl` eme statique en dimension k en un probl` eme dynamique en dimen- sion k ? 1, et exploite le fait qu?en cours de balayage, la situation ´ etudi´ ee n?est modifi´ ee de mani` ere significative qu?en un nombre fini de positions de l?hyperplan et que par ailleurs deux situations cons´ ecutives sont peu diff´ erentes ; on dispose donc d?une grande partie de l?information d´ ej` a calcul´ ee, en utilisant par exemple la structure d?ensemble ordonn´ e persistant. Une autre approche algorithmique fr´ equente consiste ` a subdiviser l?espace en r´ egions o` u les solutions au probl` eme pos´ e sont les m? emes. C?est le cas par exemple dans la recherche des voisins : on calcule le diagramme de Vorono¨ ? de l?ensemble des sites. 11.1.1 Notations Les objets consid´ er´ es appartiennent ` a un plan affine euclidien orient´ e. Parmi les bases orthonorm´ ees directes, on en privil´ egie une not´ ee (?, ?), d´ efinissant deux directions appel´ ees horizontale (?) et verticale (?). On notera : ? ? pq le vecteur d?origine p et d?extr´ emit´ e q; d(p, u) la droite passant par p, de vecteur directeur u non nul; d(p, u) la droite orient´ ee par u passant par p; d(p, q) la droite passant par p et q (p = q); d(p, q) la droite orient´ ee de p vers q passant par p et q (p = q); [p, q] le segment d?extr´ emit´ es p et q; [p, u( la demi-droite d?origine p de vecteur directeur u; d´ et (u, v) le d´ eterminant du couple de vecteurs (u, v) dans une base orthonorm´ ee directe; (u, v) l?angle de u avec v; on notera encore (u, v) lorsqu?il n?y a pas ambigu¨ ?t´ e le secteur angulaire associ´ e ` a l?angle (u, v). Un angle(u, v) est dit convexe (resp. r´ eflexe, plat) s?il est de mesure strictement inf´ erieure ` a ? (resp. strictement sup´ erieure ` a ?, ´ egale ` a ?). Etant donn´ ee une suite de points (x1, ..., xn), on appelle suite circulaire et on note ((x1, ..., xn)) l?ensemble des suites (xi, xi+1, · · · , xn, x1, · · ·, xi?1) conjugu´ ees de la suite (x1, ..., xn). Dans une suite circulaire ((x1, ..., xn)), chaque ´ el´ ement a un successeuret un pr´ ed´ ecesseur unique. Le successeur de xi est xi+1, avec la convention que xn+1 = x1. De m? eme, le pr´ ed´ ecesseur de xi est xi?1, avec la convention que x0 = xn. Version 6 f´ evrier 2005 11.1. Notions pr´ eliminaires 381 11.1.2 Lignes polygonales, polygones Une ligne polygonale est une suite L = (S1, ..., Sn) de segments Si = [xi, xi+1] de longueur non nulle. Les segments Si sont les c? ot´ es de la ligne polygonale, et les points xi sont ses sommets. On convient aussi de repr´ esenter la ligne polygonale L par la suite (x1, ..., xn+1) de ses sommets. La ligne polygonale L est ferm´ ee si xn+1 = x1. Elle est simple si deux segments non cons´ ecutifs ont une intersection vide et si deux segments cons´ ecutifs ont une intersection r´ eduite ` a une extr´ emit´ e et ont pour support des droites distinctes. Dans le cas o` u la ligne polygonale est ferm´ ee, on consid` ere que les segments Sn et S1 sont cons´ ecutifs. Un polygone (simple) est une ligne polygonale ferm´ ee (simple) ayant au moins trois c? ot´ es. 1 2 3 4 5 6 7 8 9 x x x x x x x x x x x x x x x 2 3 4 5 6 1 x x x x x1 2 3 4 5 ligne polygonale polygone polygone simple Figure 1.1: Lignes polygonales. Un polygone simple d´ etermine deux r´ egions du plan. L?une born´ ee, est appel´ ee l?int´ erieur, l?autre non born´ ee est appel´ ee l?ext´ erieur. La fronti` ere de ces deux r´ egions est l?union des c? ot´ es du polygone. Pour ne pas alourdir l?´ ecriture, il est d?usage d?appeler encore polygone la r´ egion ferm´ ee et born´ ee d´ efinie par l?int´ erieur du polygone et sa fronti` ere. A E D C B Figure 1.2: Le contour positif du polygone est ((A, B, C, D, E)). Soit P = (x1, ..., xn, xn+1 = x1) un polygone simple. Le plan ´ etant orient´ e, P a un contour positif (ou direct) et un contour n´ egatif qu?on conviendra de repr´ esenter Version 6 f´ evrier 2005 382 Chapitre 11. G´ eom´ etrie algorithmique par les suites circulaires ((x1, ..., xn)) et ((xn, . . . , x1)). Le contour positif est tel que l?int´ erieur du polygone se trouve ` a sa gauche (voir figure 1.2). Exemple. Le contour positif du polygone P de la figure 1.2 est ((A, B, C, D, E)) et son contour n´ egatif est ((A, E, D, C, B)). 11.1.3 Ordre polaire, circuit polaire Ordre polaire On note mmes(u, v) la mesure en radian de l?angle (u, v) dans l?intervalle [0, 2?[. Soit D une demi-droite du plan d?origine O. On d´ efinit dans le plan priv´ e de O un ordre total appel´ e ordre polaire relatif ` a la demi-droite D par : p ? q si et seulement si : mes(D, ? ? Op) < mes(D, ? ? Oq) ou (mes(D, ? ? Op) = mes(D, ? ? Oq) et Oq ? Op) Autrement dit, l?ordre polaire relatif ` a D est l?ordre lexicographique pour les coordonn´ ees polaires des points par rapport ` a D, ` a ceci pr` es que l?ordre relatif ` a la distance ` a O est invers´ e. Exemple. Pour les points de la figure 1.3, l?ordre polaire de S par rapport ` a D est (p6, p5, p4, p2, p1, p3, p7). O p p p p p 6 4 2 3 1 p 5 p 7 D Figure 1.3: Ordre polaire. Lemme 1.1. Soit S un ensemble de points, O / ? S, et deux demi-droites D et D d?origine O. Les suites obtenues en rangeant les points de S pour les deux ordres polaires relatifs ` a D et D sont conjugu´ ees l?une de l?autre. Ce lemme nous permet de d´ efinir une notion qui ne d´ epend que de S et O, celle de circuit polaire de S relativement ` a O. Version 6 f´ evrier 2005 11.1. Notions pr´ eliminaires 383 Circuit polaire Soit S un ensemble de points et O / ? S, on appelle circuit polaire de S relativement ` a O la suite circulaire de l?ordre polaire des points de S par rapport ` a une demi- droite quelconque D d?origine O. Dans l?exemple de la figure 1.3, la suite circulaire ((p1, p3, p7, p6, p5, p4, p2)) est le circuit polaire de S = {p1, ..., p7} par rapport ` a O. Nous introduisons ici une nouvelle notion qui permettra de calculer efficacement le circuit polaire d?un ensemble de points relativement ` a un point fix´ e. Soit O un point fix´ e du plan. On consid` ere dans l?ensemble des points du plan priv´ e de O une relation appel´ ee relation de pr´ ec´ edence circulaire convexe relativement ` a O not´ ee O et d´ efinie par : p O p ?? 0 < mes( ? ? Op, ? ? Op ) ? ? ou (mes( ? ? Op, ? ? Op ) = 0 et Op ? Op ) On notera ?O la relation stricte associ´ ee. Il est clair que O n?est pas une rela- tion d?ordre car elle n?est ni transitive ni anti-sym´ etrique (mais presque...). Dans l?exemple de la figure 1.4 ci-dessous, on a : p1 ?O p2, p2 ?O p3, p3 ?O p1 N´ eanmoins, la relation de pr´ ec´ edence circulaire convexe poss` ede certaines pro- p p O 1 2 p 3 Figure 1.4: p1 ?O p2, p2 ?O p3, p3 ?O p1 pri´ et´ es utiles, comme nous allons le voir. Notons que cette relation se calcule en temps constant, en effectuant uniquement des op´ erations ´ el´ ementaires telles que multiplications, additions ou soustractions de nombres r´ eels, sans que l?on soit oblig´ e de calculer les mesures des angles. En effet, on a : p O p ?? ? ? ? ? ? ? ? ? ? ? ? d´ et ( ? ? Op, ? ? Op ) > 0 ou d´ et ( ? ? Op, ? ? Op ) = 0, ? ? Op et ? ? Op de m? eme sens, et Op ? Op ou d´ et ( ? ? Op, ? ? Op ) = 0, ? ? Op et ? ? Op de sens contraire. On d´ efinit par ailleurs la relation ternaire p1 est entre p0 et p2 par rapport ` a O que l?on notera entreO(p0, p1, p2) par : ?i ? {0, 1, 2} pi O pi+1 et pi+1 O pi+2 Version 6 f´ evrier 2005 384 Chapitre 11. G´ eom´ etrie algorithmique (les indices sont d´ efinis modulo 3.) C?est une notion ´ etroitement li´ ee ` a la notion de circuit polaire qui sera fort utile dans la suite, en effet : Lemme 1.2. Soit p0, p1, p2 trois points distincts et distincts de O. On a entreO(p0, p1, p2) si et seulement si le circuit polaire de {p0, p1, p2} relativement ` a O est ((p0, p1, p2)). On peut remarquer que dire que c est entre a et b par rapport ` a O signifie simplement que le point c appartient au secteur angulaire ( ? ? Oa, ? ? Ob) dont une partie de la fronti` ere est exclue, ce qui est pr´ ecis´ e dans la figure 1.5. Les traits en gras font partie du secteur angulaire. O a b Figure 1.5: Un secteur angulaire. On peut alors red´ efinir les notions de circuit polaire et d?ordre polaire gr? ace ` a la relation entreO : Proposition 1.3. La suite circulaire ((p1, ..., pn)) est un circuit polaire par rap- port ` a O si et seulement si pour tout i, le point pi est entre pi?1 et pi+1. Proposition 1.4. Soit p0 un point distinct de O, et soit ? l?ordre polaire par rapport ` a la demi-droite [O, ? ? ? Op0(. On a l?´ equivalence suivante : p ? q ?? p est entre p0 et q Cet ´ enonc´ e fournit un algorithme de calcul du circuit polaire d?un ensemble S par rapport ` a un point O qui ne n´ ecessite pas le calcul de mesures d?angles. Cela est appr´ eciable car d?une part ces calculs sont co? uteux, d?autre part ils utilisent des fonctions r´ eciproques de fonctions trigonom´ etriques qui engendrent des erreurs d?approximation. Proposition 1.5. Soit S un ensemble de N points et O un point n?appartenant pas ` a S. Le circuit polaire de S par rapport O se calcule en O(NlogN) compa- raisons entre les points pour la relation de pr´ ec´ edence circulaire convexe. Version 6 f´ evrier 2005 11.1. Notions pr´ eliminaires 385 Preuve. Il suffit de choisir un point p0 distinct de O, et de trier les points pour l?ordre polaire relatif ` a la demi-droite [O, ? ? ? Op0( en utilisant la propri´ et´ e pr´ ec´ edente. On peut remarquer que la relation d?ordre polaire se calcule encore plus simple- ment dans le cas particulier suivant : Proposition 1.6. Soit S un ensemble fini de points, et O un point fix´ e n?appar- tenant pas ` a S. Si tous les points de S appartiennent ` a un demi-plan ouvert dont la fronti` ere passe par O, alors la relation de pr´ ec´ edence circulaire convexe par rapport ` a O est un ordre total sur S ; c?est l?ordre polaire associ´ e ` a toute demi- droite Ox non situ´ ee dans ce demi-plan. Nous terminons par la d´ efinition de tour gauche ou droit. Soient p, q, r trois points distincts du plan. Le triplet (p, q, r) est un tour gauche (resp. droit) si le point r est situ´ e strictement ` a gauche (resp. ` a droite) de la droite orient´ ee ? ? d (p, q). Proposition 1.7. Soient p, q, r trois points non align´ es du plan. Les cinq pro- pri´ et´ es qui suivent sont ´ equivalentes : (i) (p, q, r) est un tour gauche; (ii) ((p, q, r)) est le contour positif du triangle form´ e des trois points p, q, r; (iii) d´ et(? ? pq, ? ? pr) > 0; (iv) l?angle (? ? pq, ? ? pr) est convexe non nul; (v) q ?p r. Nous consid´ erons maintenant la question de la fusion en un seul circuit de deux circuits polaires par rapport ` a un m? eme point O. L?algorithme propos´ e est voisin de celui qu?on utilise habituellement pour la fusion de deux listes tri´ ees, mais il est adapt´ e aux circuits qui sont de nature l´ eg` erement diff´ erente. Soient P= ((p0, . . . , pn?1)), Q = ((q0, . . . , qk?1)) deux circuits polaires par rapport ` a un point O. La suite (p0, . . . , pn?1) repr´ esente la liste tri´ ee des points de P pour l?ordre polaire relativement ` a la demi-droite [O, ? ? ? Op0(, de m? eme (q0, . . . , qk?1) repr´ esente la liste tri´ ee des points de Q pour l?ordre polaire relativement ` a la demi-droite [O, ? ? ? Oq0(. Il suffit pour r´ esoudre le probl` eme de fusionner deux listes tri´ ees pour le m? eme ordre, par exemple pour l?ordre polaire par rapport ` a [O, ? ? ? Oq0(. Or on sait que la suite tri´ ee des points de P pour l?ordre polaire par rapport ` a [O, ? ? ? Oq0( est une suite conjugu´ ee de la suite (q0, . . . , qk?1), commen¸ cant disons par pi+1 (figure 1.6). Ce point s?obtient en ins´ erant q0 dans le circuit P, car q0 s?ins` ere alors entre pi et pi+1. Il reste alors ` a fusionner les deux listes tri´ ees (q0, . . . , qk?1) et (pi+1, . . . , pn?1, p0, . . . , pi) pour l?ordre polaire par rapport ` a [O, ? ? ? Oq0(. Les circuits P et Q par rapport ` a O sont donn´ es sous forme de listes. L?algorithme Fusion(P, Q, O) calcule une liste qui repr´ esente le circuit fusion de P et Q par rapport au point O. Version 6 f´ evrier 2005 386 Chapitre 11. G´ eom´ etrie algorithmique 0 1 2 3 4 6 p p p p p p q q q q q q q 0 1 2 3 4 5 5 O Figure 1.6: q0 s?ins` ere entre p3 et p4, on fusionne alors (q0, . . . , q6) avec (p4, p5, p0, . . . , p3). Algorithme Fusion(P, Q, O); (1) Ins´ erer q0 dans le circuit P ; soit pi le pr´ ed´ ecesseur de q0 ; (2) Fusionner les listes tri´ ees (q0, . . . , qk?1) et (pi+1, . . . , pn?1, p0, . . . , pi) pour l?ordre polaire relatif ` a la demi-droite [O, ? ? ? Oq0(. L?´ etape (1) prend un temps O(n). L?´ etape (2) prend un temps O(n+k). Notons ici encore que la fusion des listes ne n´ ecessite pas le calcul de l?angle polaire des points par rapport ` a [O, ? ? ? Oq0(, la relation de pr´ ec´ edence circulaire convexe suffit pour trier les points. Proposition 1.8. La fusion de deux circuits polaires de tailles respectives n et k se fait en temps O(n + k). 11.2 Enveloppe convexe 11.2.1 G´ en´ eralit´ es La convexit´ e est une propri´ et´ e tr` es int´ eressante en g´ eom´ etrie et elle intervient dans un nombre important d?algorithmes. C?est pourquoi un important travail de recherche s?est effectu´ e sur ce th` eme pour s?efforcer d?obtenir des algorithmes de calcul d?enveloppe convexe qui soient performants tant en espace qu?en temps. Nous donnons ici les algorithmes les plus classiques en montrant les avantages et inconv´ enients de chacun, en terminant par un algorithme dynamique. Un ensemble S est convexe si pour tout couple (x, y) de points de S, le segment [x, y] est contenu dans S. L?enveloppe convexe d?un ensemble S, not´ ee EC(S), est le plus petit ensemble convexe contenant S. Version 6 f´ evrier 2005 11.2. Enveloppe convexe 387 Remarquons qu?une intersection quelconque d?ensembles convexes est convexe, et que le plan lui-m? eme est convexe. Il s?ensuit que pour tout ensemble S, l?enveloppe convexe de S existe car c?est exactement l?intersection de tous les ensembles convexes contenant S. Nous nous limitons ici au calcul de l?enveloppe convexe d?un ensemble fini de points du plan. Dans ce cas, l?enveloppe convexe v´ erifie une propri´ et´ e int´ eressante que l?on peut d´ ecrire par l?image suivante : on obtient l?enveloppe convexe de n points en entourant ces points avec un ruban ´ elastique; lorsqu?on le l? ache il prend la forme de l?enveloppe convexe . Remarque. Dans toute cette section, nous ferons une l´ eg` ere entorse ` a la d´ efini- tion d?un polygone simple et admettrons qu?un polygone simple peut n?avoir que deux c? ot´ es, i.e. ? etre d?int´ erieur vide, ceci pour donner des th´ eor` emes aux ´ enonc´ es plus simples, ainsi que des preuves sans cas particulier. Th´ eor` eme 2.1. Soit S ? R2 un ensemble de n points (n > 1). L?enveloppe convexe de S est un polygone convexe dont les sommets appartiennent ` a S. Avant de donner la preuve du th´ eor` eme, pr´ ecisons des notations que nous serons amen´ es ` a utiliser ` a plusieurs reprises par la suite. Soit ((p1, ..., pn)) le contour direct d?un polygone convexe P et p un point ext´ erieur ` a P. Soient ? et ? les deux demi-droites issues de p et tangentes ` a P, telles que l?angle (?, ? ) soit convexe. Ces demi-droites coupent le contour de P soit en un sommet de P soit en un c? ot´ e de P (voir figure 2.1). Soit pi (resp. pj) le sommet de P le plus ´ eloign´ e de p sur ? (resp. sur ? ). On dira que le secteur angulaire (? ? ppi, ? ? ppj) est le c? one enveloppant P de sommet p. Notons que pi et pj peuvent encore ? etre d´ etermin´ es de la fa¸ con suivante. Soit D une demi-droite ne coupant pas le polygone P, et consid´ erons l?ordre polaire relatif ` a D. Alors pi est le plus petit point pour l?ordre polaire relatif ` a D parmi les sommets de P ; par ailleurs soit pj le plus grand point parmi les sommets de P, alors pj est le sommet de P le plus loin de O sur la demi-droite [O, ? ? ? Opj(, c?est-` a-dire le plus petit sur cette demi-droite pour la relation d?ordre que l?on consid` ere. Les points pi et pj se calculent donc en temps O(n) si n est le nombre de sommets de P. Preuve. La preuve se fait par r´ ecurrence sur n. La propri´ et´ e est vraie pour n = 2. Soit S ? R2 un ensemble de n points (n > 2), p ? S , et S = S ? {p}. Si p appartient ` a l?enveloppe convexe EC(S) alors EC(S ) = EC(S). Sinon, soit ((p1, ..., ph)) le contour direct de EC(S), et soient pi et pj les sommets de EC(S) tels que (? ? ppi, ? ? ppj) soit le c? one enveloppant EC(S) de sommet p. Les sommets pi et pj coupent le contour direct de EC(S) en deux listes telles que l?une, de pi vers pj, est rang´ ee dans le sens positif pour un circuit polaire relativement ` a p, et l?autre, de pj vers pi, dans le sens n´ egatif. En supprimant cette derni` ere liste, sauf les points pi et pj, et en la rempla¸ cant par p on obtient le contour positif de EC(S ) (figure 2.2). Version 6 f´ evrier 2005 388 Chapitre 11. G´ eom´ etrie algorithmique p 1 n i j p p p p ? ? ' Figure 2.1: C? one enveloppant. p 1 n i j p p p p Figure 2.2: Adjonction d?un point n?appartenant pas ` a l?enveloppe convexe. Probl` eme 1. Etant donn´ e un ensemble fini S de points du plan, calculer EC(S). Avant d?examiner quelques algorithmes classiques pour r´ esoudre ce probl` eme, nous pouvons donner une borne inf´ erieure du temps de calcul. Connaissant la nature de l?objet ` a calculer, pr´ ecisons sous quelle forme nous voulons obtenir le r´ esultat. Puisque EC(S) est un polygone, nous demanderons que le r´ esultat du calcul soit le contour positif du polygone, c?est ` a dire une suite circulaire de ses sommets. Th´ eor` eme 2.2. Le calcul de l?enveloppe convexe de n points demande un temps ?(n log n). Preuve. Consid´ erons un ensemble S de n points pi(xi, x2 i )i=1,...,n situ´ es sur une parabole d?´ equation y = x2 . Le contour positif de EC(S) permet donc d?obtenir, apr` es une lecture, les nombres xi tri´ es par ordre croissant d?abscisses. Or le tri de n ´ el´ ements d?un ensemble ordonn´ e n´ ecessite un temps ?(n log n). Notons que la preuve du th´ eor` eme 2.1 donne un algorithme de calcul en temps O(n2 ). Version 6 f´ evrier 2005 11.2. Enveloppe convexe 389 11.2.2 Marche de Jarvis La marche de Jarvis est un des algorithmes les plus naturels puisqu?il corres- pond ` a la technique d?emballage dite du paquet cadeau . p p p p p 1 2 3 4 p6 5 Figure 2.3: Marche de Jarvis. Dans un premier temps, on peut chercher ` a d´ eterminer non pas les sommets de l?enveloppe, mais ses ar? etes. Or [p, q] est une ar? ete de l?enveloppe convexe si et seulement si tous les autres points sont situ´ es sur le segment [p, q] ou du m? eme c? ot´ e de la droite d(p, q). On peut donc d´ eterminer en temps O(n) si un segment donn´ e appartient ` a la fronti` ere de l?enveloppe convexe. Or il y a (n 2 ) segments ` a examiner. On obtient donc un algorithme en O(n3 ). Jarvis a am´ elior´ e l?algorithme pr´ ec´ edent en utilisant l?observation suivante : soit ((p1, p2, . . . , pn)) le contour positif de l?enveloppe convexe des n points; le point pi+1 est le point minimal pour l?ordre polaire relatif ` a la demi-droite d[pi, ? ? ? ? pi?1pi(, dans l?ensemble des sommets priv´ e de pi. Il suffit donc de d´ eterminer deux points cons´ ecutifs p1 et p2 de l?enveloppe convexe, par exemple pour p1 on peut choisir un point d?ordonn´ ee minimale (et d?abscisse minimale, s?il y a plusieurs points d?ordonn´ ee minimale) p2 ´ etant alors le point minimal dans S ? {p1} pour l?ordre polaire relativement ` a la demi-droite [p1, ?( , ce qui prend un temps lin´ eaire, puis de calculer les points pi gr? ace ` a la remarque ci-dessus. D?o` u l?algorithme : Version 6 f´ evrier 2005 390 Chapitre 11. G´ eom´ etrie algorithmique Algorithme Jarvis(S); (1) Soit p1 le point d?ordonn´ ee minimale (et d?abscisse minimale s?il y a plusieurs points d?ordonn´ ee minimale) de S ; (2) Soit p2 le point minimal de S ? {p1} pour l?ordre polaire par rapport ` a la demi-droite [p1, ? ? ? (; (3) k := 2; (4) r´ ep´ eter (5) calculer le point q de S minimal pour l?ordre polaire par rapport ` a [pk, ? ? ? ? ? pk?1pk(; k := k + 1; pk := q jusqu?` a ce que pk = p1. Evaluons la complexit´ e en temps de l?algorithme pour un ensemble S ` a n points. Clairement (1) et (2) prennent un temps O(n). La boucle (4) est r´ ep´ et´ ee h ? 1 fois o` u h est le nombre de sommets de l?enveloppe convexe. La ligne (5) prend un temps O(n). Donc l?algorithme est en temps O(hn) o` u h est le nombre de sommets de l?enveloppe convexe, ce qui peut ? etre int´ eressant si h est petit devant n, mais dans le pire des cas l?algorithme est en temps O(n2 ). 11.2.3 Algorithme de Graham L?algorithme que nous exposons ici est d? u ` a Graham; il repose sur les deux propri´ et´ es suivantes d?un polygone convexe : Th´ eor` eme 2.3. Quelque soit le point O int´ erieur ` a un polygone convexe P, le contour positif de P est exactement le circuit polaire des sommets de P par rapport ` a O. Preuve. En effet si p, q, r sont trois points cons´ ecutifs du contour positif de P, alors on a entreO(p, q, r) du fait que P est convexe et que O est int´ erieur ` a P. On peut faire ici deux remarques : ? le r´ esultat reste vrai si O est sur la fronti` ere de P mais n?est pas un sommet de P ; ? l?´ enonc´ e est faux pour un polygone quelconque, mais n?est pas caract´ eristique des polygones convexes (voir figure 2.4). Th´ eor` eme 2.4. Un polygone simple est convexe si et seulement si pour tout triplet (p, q, r) de sommets cons´ ecutifs dans le sens direct, (p, q, r) est un tour gauche. Version 6 f´ evrier 2005 11.2. Enveloppe convexe 391 Figure 2.4: Circuit polaire : exemple et contre-exemple pour un polygone non convexe. L?algorithme de Graham consiste ` a choisir un point int´ erieur ` a l?enveloppe convexe de S, mais n?appartenant pas ` a S, trier les points de S en un circuit polaire par rapport ` a O, et ´ eliminer les points qui dans ce circuit ne constituent pas un tour gauche avec leurs deux voisins. L?algorithme s?applique bien s? ur dans le cas o` u les points de S ne sont pas align´ es. Pour trouver un point int´ erieur ` a EC(S) mais n?appartenant pas ` a S, il suffit de prendre l?isobarycentre O de trois points a, b, c de S non align´ es, et de v´ erifier qu?il n?appartient pas ` a S. Si O ? S alors on remplace O par le milieu de a et O, on it` ere ce processus au plus n fois. Donc trouver ce point O prend dans le pire des cas un temps O(n). On calcule ensuite le circuit polaire de S par rapport ` a O sous forme de liste dou- blement cha? ?n´ ee pour avoir acc` es en temps O(1) au pr´ ed´ ecesseur et au successeur d?un point du circuit. On r´ ealise alors un parcours de cette liste ((p0, . . . , pn?1)) dans le sens croissant, en partant d?un point p0 dont on est certain qu?il appartient ` a EC(S), par exemple le point d?abscisse maximale (et d?ordonn´ ee maximale en cas de non unicit´ e) (fig.2.5). Si (pi?1, pi, pi+1) est un tour droit, alors il est clair que pi n?appartient pas ` a la fronti` ere de EC(S) puisque O est int´ erieur ` a EC(S) , donc pi est int´ erieur au triangle Opi?1pi+1 et donc int´ erieur ` a EC(S). L?algorithme consiste donc ` a parcourir la liste doublement cha? ?n´ ee en ´ eliminant de tels points. Version 6 f´ evrier 2005 392 Chapitre 11. G´ eom´ etrie algorithmique proc´ edure Graham(S); (1) D´ eterminer un point O int´ erieur ` a S n?appartenant pas ` a S ; (2) Calculer le circuit polaire de S par rapport ` a O; (3) Soit p0 le point de S d?abscisse maximale (et d?ordonn´ ee maximale s?il y en a plusieurs); { si p est un sommet, succ(p) et pred(p) d´ esignent respectivement le successeur et le pr´ ed´ ecesseur de p dans le circuit courant} (4) p := p0 ; tantque succ(p) = p0 faire si (p, succ(p), succ(succ(p)) est un tour gauche alors p := succ(p) sinon supprimer succ(p); p := pred(p) finsi fintantque. O P P P P P 0 1 2 3 4 Figure 2.5: Algorithme de Graham. Validit´ e de l?algorithme A la fin de la proc´ edure on obtient une liste doublement cha? ?n´ ee de points de S telle que (1) les points forment un circuit polaire par rapport ` a O; (2) trois points cons´ ecutifs quelconques forment un tour gauche. On obtient donc la liste des sommets cons´ ecutifs d?un polygone convexe P en vertu des th´ eor` emes 2.3 et 2.4, et puisque les points de S qui ont ´ et´ e supprim´ es n?appartenaient pas ` a la fronti` ere de EC(S), P est bien la fronti` ere de EC(S). Th´ eor` eme 2.5. L?algorithme de Graham calcule l?enveloppe convexe de n points du plan en temps O(n log n) et en espace O(n). Preuve. Les ´ etapes 1 et 3 demandent, on l?a vu, un temps O(n). L?´ etape 2 se r´ ealise en temps O(n log n) (Proposition 1.5). Enfin il est ais´ e de voir que la boucle tant que (4) prend un temps lin´ eaire. En effet, ` a chaque passage dans la boucle soit on avance d?un pas dans le parcours, soit on supprime un point. Or on ne peut avancer de plus de n pas, et on ne peut pas supprimer plus de n points. Version 6 f´ evrier 2005 11.2. Enveloppe convexe 393 Enfin l?espace n´ ecessaire ` a l?ex´ ecution de la proc´ edure est une liste doublement cha? ?n´ ee de taille n, c?est donc un espace lin´ eaire. Traitons un exemple : p=p1 p=p2 p=p3 supprimer p4 p=p2 supprimer p3 p=p1 p=p2 p=p5 p=p6 p=p7 supprimer p8 p=p6 p=p7 terminé p p p p p p p p 6 5 4 3 2 1 8 7 Figure 2.6: Exemple. Bien que l?algorithme de Graham soit optimal dans le pire des cas, il est int´ eres- sant d?examiner d?autres algorithmes qui peuvent pr´ esenter des avantages vari´ es. 11.2.4 Algorithme dichotomique L?algorithme qui suit utilise le principe de dichotomie. Pour calculer l?enveloppe convexe EC(S) d?un ensemble S, on divise S en deux parties S1 et S2 ayant le m? eme nombre d?´ el´ ements ` a 1 pr` es, on calcule leurs enveloppes convexes EC(S1), EC(S2), puis on d´ etermine l?enveloppe convexe de EC(S1)?EC(S2). L?efficacit´ e de l?algorithme d´ epend de la complexit´ e de la derni` ere ´ etape. Or celle-ci consiste ` a calculer l?enveloppe convexe de l?union de deux polygones convexes, probl` eme plus simple que celui d?origine que l?on peut esp´ erer r´ esoudre en temps lin´ eaire. On est donc conduit ` a ´ etudier le : Probl` eme 2. Etant donn´ es deux polygones convexes P1 et P2, d´ eterminer l?enveloppe convexe de leur union. Nous allons pr´ esenter un algorithme dont la complexit´ e est donn´ ee par le : Th´ eor` eme 2.6. L?enveloppe convexe de l?union de deux polygones convexes se calcule en temps O(N), o` u N est le nombre total de sommets. Preuve. On suppose qu?au moins un des deux polygones a plus de deux sommets (par exemple P1, sinon on calcule en temps O(1) l?enveloppe convexe des quatre points). Soit p un point int´ erieur ` a P1, p est d´ etermin´ e en temps O(1). Si p appartient ` a EC(P2) (ce qui se teste en temps O(n2), o` u n2 est le nombre de sommets de P2), alors les contours positifs de P1 et P2 sont respectivement les circuits polaires de P1 et P2 par rapport ` a p (th´ eor` eme 2.3). En temps O(n1 +n2) Version 6 f´ evrier 2005 394 Chapitre 11. G´ eom´ etrie algorithmique on peut fusionner ces deux circuits en un circuit polaire relativement ` a p. Il suffit ensuite d?appliquer l?´ etape 4 de l?algorithme de Graham qui est en temps O(n1 + n2). Si p est ext´ erieur ` a P2 (figure 2.7), on d´ etermine en temps O(n2) deux sommets pi et pj de P2 tels que (pi, p, pj) constitue le c? one de sommet p qui enveloppe P2 . On fusionne en temps O(n1 + n2) le contour positif de P1 et la liste des sommets de P2 de pj ` a pi pour obtenir un circuit polaire de l?ensemble de ces points par rapport ` a p. Il n?y a plus qu?` a appliquer l?´ etape 4 de l?algorithme de Graham ` a ce circuit, ce qui se r´ ealise en temps O(n1 + n2). P P P P j+1 i-1 P i j Figure 2.7: Cas o` u p est ext´ erieur ` a P2. L?algorithme dichotomique s?´ ecrit tr` es simplement en proc´ edant r´ ecursivement. Notons Env conv fusion (P1, P2) la proc´ edure qui calcule l?enveloppe convexe de l?union de deux polygones convexes P1 et P2. Alors : fonction Env conv dicho(S); si |S| ? 3 alors calculer directement l?enveloppe convexe de S sinon diviser S en deux ensembles S1 et S2 de m? eme cardinal (` a 1 pr` es); P1 :=env conv dicho(S1); P2 :=env conv dicho(S2); env conv fusion(P1, P2) finsi. Th´ eor` eme 2.7. En proc´ edant par dichotomie, l?enveloppe convexe de N points se calcule en temps O(N log N). Preuve. Supposons que N est une puissance de 2. Soit T(N) le temps de calcul de la fonction Env conv dicho(S) pour un ensemble S ` a N ´ el´ ements et F(N) le temps de calcul de la proc´ edure Env conv fusion(P1, P2) o` u N est le nombre total de sommets de P1 et P2. On a alors T(N) ? 2T(N/2) + F(N) (2.1) Version 6 f´ evrier 2005 11.2. Enveloppe convexe 395 Comme on l?a vu plus haut, F(N) est O(N). Donc de 2.1 on d´ eduit que T(N) est O(N log N). Notons que cet algorithme poss` ede l?avantage de pouvoir ? etre utilis´ e en parall` ele en raison de son m´ ecanisme de fusion. 11.2.5 Gestion dynamique d?une enveloppe convexe Les algorithmes pr´ ec´ edemment d´ ecrits op` erent tous de mani` ere statique, c?est-` a- dire qu?ils exigent de conna? ?tre l?ensemble S tout entier avant de commencer le calcul de l?enveloppe convexe de S. Si l?ensemble S est modifi´ e par adjonction ou suppression de certains points, le calcul doit ? etre repris compl` etement. La question qui se pose est donc la suivante : trouver un algorithme efficace pour calculer l?enveloppe convexe d?un ensemble dynamique de points. La r´ eponse bien s? ur n?est pas simple, comme on peut l?imaginer, en particulier la suppression d?un point de S peut faire appara? ?tre sur la nouvelle fronti` ere plusieurs points qui ´ etaient auparavant internes ` a l?enveloppe convexe (figure 2.8). L?id´ eal serait p a b c Figure 2.8: Si p est supprim´ e, a, b et c apparaissent. d?obtenir un algorithme fournissant une repr´ esentation dynamique de l?enveloppe convexe d?un ensemble S de taille N tel que le temps de calcul de EC(S) soit aussi bon que dans le cas statique, c?est-` a-dire en temps O(N log N) et tel que la mise ` a jour de EC(S) par adjonction ou suppression d?un point de S prenne un temps raisonnable, c?est-` a-dire nettement inf´ erieur ` a N log N. Pour obtenir un temps de calcul de EC(S) en O(N log N) il faudrait que la mise ` a jour par adjonction ou suppression d?un point prenne un temps O(log N). Aucun algorithme ` a ce jour ne donne ce r´ esultat. N´ eanmoins l?algorithme que nous allons examiner offre un temps de mise ` a jour en O(log2 N), ce qui donne un temps global de calcul de EC(S) en O(N log2 N) qui est bien s? ur moins bon que dans un calcul statique, mais il r´ epond ` a des exigences plus grandes. La solution que nous proposons ici est due ` a Overmars et van Leeuwen. Une premi` ere chose ` a remarquer est la suivante : EC(S) peut ? etre consid´ er´ e comme l?intersection de deux ensembles convexes non born´ es (figure 2.9) qu?on appellera enveloppe convexe sup´ erieure ECS(S), et enveloppe convexe inf´ erieure ECI(S) Version 6 f´ evrier 2005 396 Chapitre 11. G´ eom´ etrie algorithmique que l?on peut d´ ecrire par abus comme les enveloppes convexes respectives des ensembles S ? {P??(0, ??)} et S ? {P+?(0, +?)} respectivement.                                                 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p p p p p p p p p p p p p p p p p 1 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 EC(S) ECS(S) ECI(S) Figure 2.9: Enveloppes convexes sup´ erieure et inf´ erieure. Les contours de ces deux enveloppes ECI(S) et ECS(S) donnent naissance ` a deux lignes polygonales qui convenablement concat´ en´ ees d´ efinissent le contour direct de EC(S). Dans l?exemple de la figure 2.9, on a : ECS(S) = (p5, p6, p7, p8, p1) ECI(S) = (p1, p2, p3, p4) EC(S) = ((p1, p2, p3, p4, p5, p6, p7, p8)) Il nous suffit donc de nous limiter ` a l?´ etude de l?enveloppe convexe inf´ erieure. La structure de donn´ ees choisie pour maintenir de mani` ere dynamique l?enve- loppe convexe ECI(S) est, (ce n?est pas surprenant) une structure d?arbre, pour obtenir un co? ut de mise ` a jour r´ eduit. On range les points de S aux feuilles d?un arbre binaire complet ´ equilibr´ e (c?est donc un arbre balis´ e au sens du chapitre 6). L?ordre pour la recherche est l?ordre lexicographique sur R2 (les points sont donc rang´ es par abscisses croissantes, puis en cas d?´ egalit´ e par ordonn´ ees croissantes). La balise pour piloter la recherche en un n?ud v est un couple (x, y) repr´ esentant les coordonn´ ees du point rang´ e dans la feuille la plus ` a droite du sous arbre gauche du n?ud v. Chaque n?ud v a pour vocation de repr´ esenter l?enveloppe convexe inf´ erieure des points rang´ es dans les feuilles du sous-arbre de racine v, qu?on notera Inf (v). Soient filsG(v) et filsD(v) les sommets de l?arbre qui sont respectivement fils gauche et fils droit du n?ud v. Comment calculer Inf(v) ` a partir de I1 =Inf(filsG(v)) et I2 =Inf(filsD(v))? La figure 2.10 donne le r´ esultat. Il existe un unique sommet p1 de I1 et un unique sommet p2 de I2 tels que le segment [p1, p2] soit un c? ot´ e de Inf(v). On appellera pont ce segment, et p1 et p2 seront les deux piliers du pont. Le sommet p1 scinde I1 en deux lignes polygonales I11 et I12 (dans l?ordre), p1 ´ etant rang´ e dans I11, et p2 scinde I2 dans l?ordre en deux lignes polygonales I21 et I22, p2 ´ etant affect´ e ` a I22. Alors Inf(v) est la concat´ enation de I11 et I22. Nous allons voir qu?il suffit de stocker en chaque sommet v la partie Q(v) de l?enveloppe convexe inf´ erieure Inf(v) qui n?appartient pas ` a Inf(p` ere(v)). Version 6 f´ evrier 2005 11.2. Enveloppe convexe 397 p p 1 2 I 11 12 21 22 I I I Figure 2.10: Calcul de Inf(v) ` a partir de l?enveloppe convexe inf´ erieure des feuilles des fils de v. R´ eciproquement, comment fabriquer Inf(filsG(v)) et Inf(filsD(v)) ` a partir de Inf (v)? Il suffit pour cela de conna? ?tre les extr´ emit´ es du pont [p1(v), p2(v)] entre Inf(filsG( v)) et Inf(filsD(v)). A partir de Inf(v) et p1(v), on scinde Inf(v) en deux lignes polygonales qui, concat´ en´ ees respectivement avec Q(filsG(v)) et Q(filsD(v)) deviennent les enveloppes Inf(filsG(v)) et Inf(filsD(v)) cherch´ ees. Ainsi nous pouvons d´ ecrire maintenant compl` etement la structure choisie. En chaque n?ud v (diff´ erent d?une feuille) de l?arbre binaire sont stock´ ees deux in- formations : 1) un pointeur vers la ligne polygonale Q(v) stock´ ee sous forme de liste con- cat´ enable (voir la section 6.5). Elle repr´ esente la partie de Inf(v) qui n?appartient pas ` a Inf(p` ere(v)) (si v est la racine, Q(v) =Inf(v)). 2) un couple (p1(v), p2(v)) repr´ esentant les piliers gauche et droit du pont de Inf(v). p (filsG(v)) Q(filsG(v))Q(filsD(v)) p (filsD(v)) p (v) p (filsG(v)) p (v) p (filsD(v)) 1 2 2 2 1 1 Figure 2.11: Les fonctions p1, p2 et G. Cette repr´ esentation de l?enveloppe convexe inf´ erieure d?un ensemble de points de taille N est int´ eressante car elle n´ ecessite un espace O(N). En effet, l?arbre a 2N ? 1 sommets et les points rang´ es dans les listes Q(v) en chaque n?ud v sont au nombre total de N, puisque les listes Q(v) forment en fait une partition de l?ensemble S. Version 6 f´ evrier 2005 398 Chapitre 11. G´ eom´ etrie algorithmique Nous allons donner un algorithme qui calcule de mani` ere efficace le pont [p1, p2] entre I1 et I2 que l?on notera Pont(I1, I2) et donc permet de calculer I ` a partir de I1 et I2. p I II II III I I Figure 2.12: Les 3 r´ egions I, II, III auxquelles v peut appartenir. Il nous faut auparavant donner quelques d´ efinitions n´ ecessaires ` a la mise en ?uvre de l?algorithme. Soit p un sommet d?une enveloppe convexe inf´ erieure i = ECI(S) et v un point (fig. 2.12). Le point p est ? concave (relativement au segment [p, v] et ` a i) si v est dans la r´ egion (I); ? tangent si le point v est dans la r´ egion (II); ? r´ eflexe si le point v est dans la r´ egion (III). La r´ egion (I) est ouverte et la r´ egion (III) est ferm´ ee. Soient I1 et I2 deux enveloppes convexes inf´ erieures disjointes, i.e. s´ epar´ ees par une droite verticale d. Nous allons d´ emontrer qu?avec la repr´ esentation pr´ ec´ edemment d´ efinie, il est possible de calculer la fonction Pont(I1, I2) efficacement . Lemme 2.8. Soient I1 et I2 deux enveloppes convexes inf´ erieures disjointes. La fonction Pont(I1, I2) se calcule en temps O(log N) o` u N est le nombre total de points. Preuve. Soient donc deux enveloppes convexes inf´ erieures I1 =Inf(S1) et I2 =Inf (S2) disjointes (i.e. s´ epar´ ees par une droite verticale d). Nous pouvons alors d´ eterminer le pont [p1, p2] entre I1 et I2 qui permet de fabriquer l?enveloppe convexe Inf(S1 ? S2) comme ´ etant l?unique segment [p1, p2] reliant un sommet de I1 ` a un sommet de I2 et tel que p1 soit un point tangent pour [p1, p2] et I2, et p2 soit aussi un point tangent pour [p1, p2] et I1. Soit q1 un sommet de I1 et q2 un sommet de I2. Il y a 9 cas ` a envisager selon la nature respective des points q1 et q2 relativement au segment [q1, q2] et relativement ` a I2 et I1 respectivement. Ces 9 cas sont repr´ esent´ es sur la figure 2.13. Sont hachur´ ees les parties de I1 et I2 non candidates ` a contenir les piliers du pont. La figure est suffisamment explicite; seul le cas o` u q1 et q2 sont tous les Version 6 f´ evrier 2005 11.2. Enveloppe convexe 399                 ? ? ? ?? ? ? ? ? ? ??? ? ? tangent concave réflexe concave réflexe tangent q q ? ? voir (b) terminé 2 d m n q q' q 1 1 2 I I q' (a) (b) 1 2 2 1 Figure 2.13: Les 9 cas du lemme. deux concaves est un peu plus complexe. Il faut pour cela consid´ erer la droite d(q1, q1) o` u q1 est le successeur de q1 sur I1 et la droite d(q2, q2) o` u q2 est le pr´ edecesseur de q2 sur I2. Soit d une droite verticale s´ eparant I1 et I2. La droite d(q1, q1) (resp. d(q2, q2)) coupe d en m (resp. n). Si m est au-dessus au sens large de n (resp. au dessous au sens large) alors on peut hachurer la partie de I2 ` a droite de q2 (resp. la partie de I1 ` a gauche de q1). En effet pour tout point q de I2 situ´ e ` a droite de q2 et tout point q de I1, le segment [q , q ] est situ´ e dans l?ensemble convexe limit´ e par la partie de I1 ` a gauche de q1, les segments [q1, m], [m, q2] et la partie de I2 ` a droite de q2. Donc q est concave relativement ` a [q , q ] et I2, car [q , q ] coupe d au-dessus de m alors que [q2, q2] coupe d en n qui est au-dessous de m. p n p n p m n p n m n p m n p f f f (1) (2) (3) insérer m insérer m insérer m Figure 2.14: Insertion d?un nouveau point m. Version 6 f´ evrier 2005 400 Chapitre 11. G´ eom´ etrie algorithmique Ainsi si le processus de recherche de Pont(I1, I2) part des racines des arbres repr´ esentant les listes concat´ enables associ´ ees, ces arbres ´ etant ´ equilibr´ es, ils sont de hauteur au plus log N et Pont(I1, I2) se calcule alors en temps O(log N). Notons qu?il faut prendre la pr´ ecaution d?avoir acc` es dans la liste concat´ enable au voisin d?un sommet en temps O(1). Il nous reste ` a d´ ecrire maintenant le processus de mise ` a jour de la structure de donn´ ees d´ ecrivant de mani` ere dynamique une enveloppe convexe inf´ erieure, lors d?une insertion d?un nouveau point ou d?une suppression. Prenons le cas d?une insertion. Les points sont rang´ es aux feuilles d?un arbre binaire complet ´ equilibr´ e. Il faut donc modifier les algorithmes classiques d?inser- tion : soit m le point ` a ins´ erer et f la feuille ` a laquelle la descente aboutit en partant de la racine, f contenant le point n. Si f est une feuille gauche alors m est ` a gauche de n et on ins` ere m selon le sch´ ema (1); si f est une feuille droite, si m est ` a gauche de n alors on r´ ealise (2) sinon on r´ ealise (3) (figure 2.14). proc´ edure Descendre(v, m); si v n?est pas une feuille alors (QG, QD) :=Scinder(Inf(v), p1(v), p2(v)); Inf(filsG(v)) :=Concat´ ener(QG, Q(filsG(v))); Inf(filsD(v)) :=Concat´ ener(Q(filsD(v)), QD); si m ? cle(v) alors Descendre(filsG(v), m) sinon Descendre(filsD(v), m) finsi; Ins´ erer(m). Pr´ eoccupons nous maintenant de la mise ` a jour des informations contenues dans les sommets de l?arbre en supposant pour l?instant, pour simplifier, que l?insertion r´ ealis´ ee ne demande pas de r´ e´ equilibrage. La mise ` a jour se fait en deux temps. Lors de la descente dans l?arbre pour ins´ erer une nouvelle feuille, pour chaque sommet v situ´ e sur le chemin c de descente, on calcule Inf(v) et Inf(fr` ere(v)) inductivement et gr? ace aux points p1(v), p2(v) on transmet aux fils de v les lignes polygonales respectives qui leur manquent (figu- re 2.11) pour former l?enveloppe convexe qui leur est associ´ ee. Ainsi au moment de l?insertion du nouveau point, on dispose pour chaque sommet v du chemin c ainsi que pour ses fr` eres, de l?enveloppe convexe correspondante. Apr` es insertion, la remont´ ee ` a la racine (c?est ici que se situe un ´ eventuel r´ e´ equili- brage) permet de recalculer inductivement Q(v) pour tous les sommets v de c, et p1(v), p2(v) pour tous les sommets v de c ainsi que pour leurs fr` eres (effective- ment, on peut remarquer que la mise ` a jour des informations ne concerne que les sommets de c pour ce qui est de p1 et p2, mais concerne aussi les sommets fr` eres pour ce qui est de Q). La mise ` a jour se r´ ealise alors ainsi : si en un sommet v on Version 6 f´ evrier 2005 11.2. Enveloppe convexe 401 dispose de Inf(v) ainsi que de Inf(fr` ere(v)) alors l?op´ eration Pont permet de cal- culer Q(v), Q(fr` ere(v)) ainsi que Inf(fr` ere(v)), p1(p` ere(v)) et p2(p` ere(v)), et donc inductivement permet la mise ` a jour des fonctions Q, p1 et p2. Ces deux op´ erations de descente et de mont´ ee sont d´ ecrites plus pr´ ecis´ ement dans les proc´ edures De- scendre et Monter, sans toutefois prendre en compte le r´ e´ equilibrage. Dans ces proc´ edures, la variable v repr´ esente un sommet de l?arbre, et m est le point que l?on ins` ere dans l?arbre. proc´ edure Monter(v); si v = racine alors (Q1, Q2, Q3, Q4, J1, J2) :=Pont(Inf(v), Inf(fr` ere(v)); Q(v) := Q2 ; Q(fr` ere(v)) := Q3 ; Inf(p` ere(v)) :=Concat´ ener(Q1, Q4); p1(p` ere(v)) := J1, p2(p` ere(v)) := J2 ; Monter(p` ere(v)) sinon Q(v) :=Inf(v). Examinons maintenant le m´ ecanisme de r´ e´ equilibrage (par la m´ ethode des arbres AVL). Prenons le cas d?une rotation droite par exemple (figure 2.15). Soient a b b a A B C A B C rotation droite Figure 2.15: Rotation droite. a , b , c les racines des arbres A, B, C. La mise ` a jour des informations stock´ ees dans les n?uds a, b, a , b , c se fait par la suite d?instructions suivantes : (Q1, Q2, Q3, Q4, J1, J2) =Pont(Inf(B),Inf(C)); Inf(a) =Concat´ ener(Q1, Q4); Q(b ) = Q2 ; Q(c ) = Q3 ; p1(a) = J1; p2(a) = J2 ; (Q1, Q2, Q3, Q4, J1, J2) =Pont(Inf(A),Inf(a)); Inf(b) =Concat´ ener(Q1, Q4); Q(a ) = Q2 ; Q(a) = Q3 ; p1(b) = J1; p2(b) = J2. On peut remarquer que Q(b) sera calcul´ e au niveau de son p` ere. Ainsi une rotation prend un temps O(log N). Le proc´ ed´ e d?insertion est illustr´ e par l?exemple ci-dessous (figures 2.16 et 2.17). La figure 2.16 repr´ esente l?arbre binaire ´ equilibr´ e dont les feuilles contiennent les points dont on doit calculer l?enveloppe convexe inf´ erieure. On a repr´ esent´ e les points par des entiers qui correspondent ` a l?ordre dans lequel on a ins´ er´ e les Version 6 f´ evrier 2005 402 Chapitre 11. G´ eom´ etrie algorithmique points dans l?arbre. En chaque n?ud v sont indiqu´ es Q(v) et p1(v). La figure 2.17 repr´ esente l?insertion d?un nouveau point. Les informations qui ont ´ et´ e recalcul´ ees au cours de cette insertion sont indiqu´ ees en gras et soulign´ ees. 11 1 2 3 4 5 6 7 8 9 10 12 (7), (10,6) (8), (8,6) ( ), (10,5) ( ), (6,12) (2), (7,2) (1), (11, 9) (3), (11, 3) (4), (11,4) ( ), (9,1) (11,9,10,6,12), (9,10) (5), (7,10) Figure 2.16: Structure de l?arbre avant insertion du point p13. 11 1 2 3 4 5 6 7 8 10 12 ( ), (6,12) (3), (11, 3) (4), (11, 4) ( ), (9,1) 13 (11,9,13,6,12), (9,13) (1), (11, 9) (7), (13, 6) (8), (8, 6) (10,5), (13, 10) ( ), (13, 2) ( ), (7,13) 9 ( ), (10, 5) Figure 2.17: Insertion du point p13. Nous laissons au lecteur le soin de traiter le cas de la suppression d?un point Version 6 f´ evrier 2005 11.3. Localisation de points dans le plan 403 (exercice) qui est identique en ce qui concerne le m´ ecanisme de mise ` a jour. Analysons la complexit´ e en temps de chacune de ces proc´ edures. Rappelons que les op´ erations Scinder et Concat´ ener se r´ ealisent en temps O(log k) o` u k est le nombre total d?´ el´ ements. Si N est le nombre de feuilles de l?arbre binaire, on a k ? N ; la hauteur de l?arbre ´ etant O(log N), on en d´ eduit que la proc´ edure Descendre, comme la proc´ edure Monter prennent un temps O((log N)2 ). D?o` u le th´ eor` eme : Th´ eor` eme 2.9. Les enveloppes convexes inf´ erieure et sup´ erieure d?un ensemble de N points ont une mise ` a jour dynamique qui prend dans le pire des cas un temps O((log N)2 ) par insertion ou suppression. Bien s? ur cet algorithme donne un temps de calcul de l?enveloppe convexe de N points en temps O(N(log N)2 ), ce qui est un temps moins bon que celui des algorithmes vus pr´ ec´ edemment. Cela s?explique par le fait que la possibilit´ e de mise ` a jour efficace par adjonction ou suppression d?un point n´ ecessite l?utilisation de structures de donn´ ees plus complexes, et donc un peu plus lourdes ` a manipuler. 11.3 Localisation de points dans le plan Les probl` emes de recherche en g´ eom´ etrie, bien que proches des probl` emes de recherche classiques, pr´ esentent des particularit´ es propres, li´ ees pr´ ecis´ ement ` a leur nature g´ eom´ etrique et ` a la complexit´ e des objets trait´ es. De mani` ere tr` es g´ en´ erale le probl` eme de localisation est le suivant : Donn´ ees : L?espace est divis´ e en k r´ egions R1, . . . , Rk. Question : Soit m un point de l?espace. A quelle r´ egion appartient-il? La question est destin´ ee ` a ? etre pos´ ee pour un grand nombre de points. Il est donc int´ eressant de pr´ etraiter les donn´ ees de mani` ere ` a obtenir un algorithme efficace pour la localisation de m. Les param` etres qui mesurent cette efficacit´ e sont donc : ? le temps du pr´ etraitement; ? l?espace utilis´ e pour repr´ esenter les donn´ ees; ? le temps de r´ eponse ` a la question. Il y a encore peu de r´ esultats sur ce probl` eme en dimension 3 ou sup´ erieure, par contre c?est un probl` eme assez bien r´ esolu dans le plan, du moins dans un cas simple, celui des subdivisions planaires. Il est certain que la nature de la partition d´ etermine la complexit´ e de la t? ache. Nous ne traiterons ici que le cas du plan. Consid´ erons tout d?abord le probl` eme ´ el´ ementaire suivant : Version 6 f´ evrier 2005 404 Chapitre 11. G´ eom´ etrie algorithmique Probl` eme P1 : Soit P un polygone simple (P divise le plan en deux r´ egions). Etant donn´ e un point z, z est-il int´ erieur ` a P ? On peut encore simplifier le probl` eme : Probl` eme P2 : Soit P un polygone convexe. Un point z ´ etant donn´ e, le point z est-il int´ erieur ` a P ? 11.3.1 Cas d?un polygone simple Un algorithme simple sans pr´ etraitement permet de r´ esoudre le probl` eme P1 en temps lin´ eaire (en fonction du nombre de sommets du polygone). Th´ eor` eme 3.1. Soit n le nombre de sommets d?un polygone simple P. On peut d´ eterminer si un point est ` a l?int´ erieur de P sans pr´ etraitement en temps O(n). Preuve. On teste en temps O(n) si z appartient au contour de P. Supposons donc que z n?appartient pas au contour de P. L?id´ ee est simple : soit d une demi- droite d?origine z. Alors z est int´ erieur ` a P si et seulement si le nombre de points d?intersection de d avec le contour de P est impair; en effet chaque fois que d coupe un c? ot´ e de P, d passe de l?int´ erieur ` a l?ext´ erieur de P ou viceversa et donc pour passer de z interne ` a P ` a l?autre extr´ emit´ e de d qui est externe ` a P, il faut couper un nombre impair de c? ot´ es (figure 3.1). Tout le probl` eme est de d´ enombrer z d Figure 3.1: Principe de l?algorithme. correctement les intersections en tenant compte des cas de d´ eg´ en´ erescence. On voit clairement, dans les cas d´ eg´ en´ er´ es indiqu´ es dans la figure 3.2, quel est le nombre d?intersections qu?il faut compter. L?id´ ee intuitive est qu?un d´ eplacement infinit´ esimal de tous les points du polygone vers le haut ne modifie pas le r´ esultat (i.e. le fait que z soit interne ou non ` a P). Ce d´ eplacement infinit´ esimal permet d?´ eliminer les cas de d´ eg´ en´ erescence. Les multiplicit´ es indiqu´ ees sur le sch´ ema sont r´ ealis´ ees lorsque l?on consid` ere comme intersectant d uniquement les c? ot´ es de P non horizontaux qui rencontrent d mais dont l?extr´ emit´ e inf´ erieure a une ordonn´ ee strictement inf´ erieure ` a celle de z. D?o` u l?algorithme : Version 6 f´ evrier 2005 11.3. Localisation de points dans le plan 405 2 0 0 2 1 1 z z z z z z Figure 3.2: Le d´ ecompte des intersections. proc´ edure Localiser (z, P); Soit d une demi-droite horizontale d?origine z; s := 0; pour chaque c? ot´ e non horizontal c de P faire si c rencontre d et l?extr´ emit´ e inf´ erieure de c est strictement inf´ erieure ` a celle de z alors s := s + 1 finsi; si s est pair alors z est ` a l?ext´ erieur de P sinon z est interne ` a P. Il est clair que cet algorithme s?ex´ ecute en temps proportionnel au nombre de c? ot´ es de P. 11.3.2 Cas d?un polygone simple convexe Nous allons voir maintenant comment traiter le probl` eme P2 en temps plus efficace gr? ace ` a un pr´ etraitement qui utilise la convexit´ e de P. p p p p i+1 i 1 n z O Figure 3.3: Cas d?un polygone convexe. Th´ eor` eme 3.2. Soit P un polygone convexe ayant n sommets. Gr? ace ` a un pr´ etraitement en temps O(n log n) on d´ etermine si un point appartient ` a l?int´ e- rieur de P en temps O(log n) et en espace O(n). Version 6 f´ evrier 2005 406 Chapitre 11. G´ eom´ etrie algorithmique Preuve. Soit ((p1, . . . , pn)) le contour direct de P. Si O est un point int´ erieur ` a P, le plan est divis´ e en n secteurs angulaires ( ? ? Opi, ? ? ? ? Opi+1) (voir figure 3.3). Si on a d´ etermin´ e ` a quel secteur angulaire z appartient, on d´ etermine en temps O(1) si z est int´ erieur ` a P ou non en rep´ erant si z est ` a gauche ou ` a droite de la droite orient´ ee ? ? d (pi, pi+1). Le calcul du secteur angulaire se fait par dichotomie de la mani` ere suivante : proc´ edure Secteur-angulaire(z, O, P); si z est entre pn et p1 alors termin´ e sinon i := 1; j := n; tantque j > i + 1 faire k := (i + j)div2; si z est entre pi et pk alors j := k sinon i := k fintantque finsi. D?o` u l?algorithme complet : proc´ edure Localiser-Pol-Simple-Convexe(z, P); (1) choisir un point int´ erieur ` a P ; (2) d´ eterminer le secteur angulaire ( ? ? Opi, ? ? ? ? Opi+1) contenant z; (3) si z est ` a droite de ? ? ? ? pipi+1 alors z est externe ` a P sinon z est interne ` a P. L?´ etape (1) prend un temps O(1) : il suffit de prendre le milieu de deux sommets non cons´ ecutifs de P. L?´ etape (2) prend un temps O(log n) puisqu?on proc` ede par dichotomie. La boucle tant que est ex´ ecut´ ee O(log n) fois (on rappelle que la relation z est entre a et b ´ equivaut ` a (a ? z et z ? b) ou (z ? b et b ? a) ou (b ? a et a ? z)). L?´ etape (3) prend un temps O(1). Enfin, l?impl´ ementation de (2) peut se faire ` a l?aide d?un tableau et donc l?espace n´ ecessaire est O(n). 11.3.3 Cas d?une subdivision planaire g´ en´ eralis´ ee Etudions maintenant le probl` eme dans le cas d?une subdivision planaire quel- conque. Version 6 f´ evrier 2005 11.3. Localisation de points dans le plan 407 Figure 3.4: Une subdivision planaire. Une subdivision planaire est une partition du plan en r´ egions dont les contours sont des polygones simples, une et une seule de ces r´ egions ´ etant non born´ ee. Une subdivision planaire g´ en´ eralis´ ee autorise les demi-droites et les droites comme c? ot´ es des polygones. La subdivision de la figure 3.5 poss` ede 9 r´ egions dont 3 sont born´ ees (deux c? ot´ es ne peuvent se couper qu?en une extr´ emit´ e). Le probl` eme de z Figure 3.5: Une subdivision planaire g´ en´ eralis´ ee. localisation s?´ enonce donc de mani` ere pr´ ecise comme suit : Donn´ ees : Une subdivision planaire g´ en´ eralis´ ee ` a n c? ot´ es. Question : Si z est un point du plan, d´ eterminer la r´ egion du plan ` a laquelle il appartient. Le principe de l?algorithme que nous allons exposer est le suivant : par chaque sommet de la subdivision on fait passer une droite verticale; le plan est alors divis´ e en bandes verticales. Les c? ot´ es de la subdivision coupant une bande donn´ ee peuvent ? etre ordonn´ es de bas en haut (car deux c? ot´ es ne peuvent se couper ` a l?int´ erieur d?une bande). La localisation d?un point se ram` ene alors ` a deux recherches dichotomiques successives. Version 6 f´ evrier 2005 408 Chapitre 11. G´ eom´ etrie algorithmique En temps O(log n) on d´ etermine dans quelle bande est le point z, puis ` a l?int´ erieur de la bande on d´ etermine en temps O(log n) entre quels segments le point z est situ´ e, ce qui permet d?identifier la r´ egion. Examinons alors soigneusement quel doit ? etre le pr´ etraitement. On suppose que la partition est donn´ ee de telle sorte que pour chaque c? ot´ e on connaisse en temps O(1) les noms des deux r´ egions situ´ ees de part et d?autre, et on suppose aussi que l?on connait le contour de chaque r´ egion. Un pr´ etraitement brutal consisterait ` a construire un arbre binaire de recherche pour chaque bande ce qui prendrait un espace O(n2 ) car chaque bande peut ? etre coup´ ee par O(n) c? ot´ es. Mais on peut observer que les arbres binaires de recherche associ´ es ` a deux bandes voisines comportent une certaine quantit´ e d?information commune. Le pr´ etraitement consiste donc ` a balayer le plan de gauche ` a droite par une droite verticale; la position initiale ´ etant ` a ??, un arbre persistant contient les c? ot´ es de la subdivision coup´ es par la droite. La mise ` a jour se fait ` a chaque passage par le sommet suivant s de la subdivision (les sommets sont tri´ es par ordre croissant d?abscisse). Au cours de cette mise ` a jour, on supprime les c? ot´ es d?extr´ emit´ e droite s et on ins` ere les c? ot´ es d?extr´ emit´ e gauche s. Le pr´ etraitement demande donc un temps O(n log n) et un espace O(n). Th´ eor` eme 3.3. Le probl` eme de la localisation d?un point dans une subdivision ` a n c? ot´ es se r´ esout en temps O(log n) par un pr´ etraitement prenant un temps O(n log n) et un espace O(n). On peut se demander si ce r´ esultat est optimal. Si la partition se r´ eduit ` a une bande horizontale form´ ee de n rectangles, la localisation se ram` ene ` a la localisa- tion d?un r´ eel x dans une suite ordonn´ ee x1 < . . . < xn, ce qui prend un temps ?(log n) par une recherche binaire. Pour ce qui est du pr´ etraitement, il n´ ecessite clairement le rangement des donn´ ees qui occupe un espace O(n). Reste le temps du pr´ etraitement qui peut ? etre am´ elior´ e (pas dans cette version certainement puisqu?elle n´ ecessite un tri pr´ eliminaire des sommets de la subdivision). Il existe un autre algorithme fond´ e sur la triangulation des polygones simples qui a un temps de pr´ etraitement lin´ eaire et qui conserve un espace lin´ eaire et un temps de r´ eponse logarithmique, mais il est beaucoup plus complexe et plus difficile ` a mettre en oeuvre. 11.4 Diagrammes de Vorono¨ ? 11.4.1 Diagrammes de Vorono¨ ? de points Soit S un ensemble fini de points du plan P. Traditionnellement, les ´ el´ ements de S sont appel´ es des sites.La r´ egion de Vorono¨ ? d?un site a ? S est l?ensemble R(a) = {x ? P | d(a, x) ? d(b, x) pour tout b ? S} (4.1) Version 6 f´ evrier 2005 11.4. Diagrammes de Vorono¨ ? 409 C?est donc l?ensemble des points du plan qui sont plus proches de a que de tout autre site. On peut donner une formulation plus compacte en introduisant les demi-plans Ha,b = {x ? P | d(a, x) ? d(b, x)} pour a, b ? S, et a = b. Alors R(a) = b=a Ha,b Cette formule montre que la r´ egion de Vorono¨ ? R(a) est convexe : c?est un polytope convexe (i. e. par d´ efinition une intersection finie de demi-plans). Une r´ egion de Vorono¨ ? est soit born´ ee (auquel cas c?est un polygone convexe), soit non born´ ee. Dans tous les cas, sa fronti` ere est une ligne polygonale. On appelle diagramme de Vorono¨ ? de S, et on note Vor(S), la r´ eunion des fronti` eres des r´ egions de Vorono¨ ? de S. Le diagramme est form´ e de sommets qui sont les sommets des lignes polygonales des r´ egions, et d?ar? etes, qui sont les ar? etes de ces lignes polygonales (voir figure 4.1). Comme cette terminologie le sugg` ere, Figure 4.1: Diagramme de Vorono¨ ? : les sites sont pleins. on peut aussi consid´ erer le diagramme de Vorono¨ ? comme graphe abstrait, avec les sommets et les ar? etes ainsi d´ efinis. Comme certaines fronti` eres de r´ egions de Vorono¨ ? ne sont pas born´ ees, les ar? etes non born´ ees n?ont qu?une seule extr´ emit´ e (mais on peut facilement rem´ edier ` a cela en introduisant un sommet ` a l?infini dans la direction de l?ar? ete). Tout point x du diagramme de Vorono¨ ? est ´ equidistant de deux sites au moins, et la distance de x ` a ces sites est minimale; donc x ? Vor(S) si et seulement s?il existe a, b ? S, a = b, tels que d(a, x) = d(b, x) ? d(c, x) pour tout site c ? S Un sommet du diagramme est un point qui est ´ equidistant d?au moins trois sites ` a distance minimale. Revenons aux r´ egions : Version 6 f´ evrier 2005 410 Chapitre 11. G´ eom´ etrie algorithmique Proposition 4.1. Une r´ egion de Vorono¨ ? R(a) est non born´ ee si et seulement si a est un sommet de l?enveloppe convexe de S. Preuve. Supposons d?abord que R(a) n?est pas born´ ee. Comme R(a) est convexe, elle contient une demi-droite infinie D d?origine a. Si a n?est pas un sommet de l?enveloppe convexe de S, alors D intersecte l?enveloppe convexe en une ar? ete [b, c] de l?enveloppe convexe (voir figure 4.2). Mais alors tout point sur D qui est suffisamment loin, est plus proche de b (ou de c) que de a, contrairement ` a la d´ efinition de R(a). a b c D Figure 4.2: Tout point suffisamment loin sur D est plus proche de b que de a. R´ eciproquement, si a est un sommet de l?enveloppe convexe de S, soient b et c ses voisins sur l?enveloppe. Tout point x qui est dans le secteur angulaire d´ elimit´ e par les demi-droites perpendiculaires aux segments [b, a] et [a, c] issues de a et orient´ ees vers l?ext´ erieur de l?enveloppe convexe (voir figure 4.3) appartient ` a la r´ egion de Vorono¨ ? R(a), donc cette r´ egion n?est pas born´ ee. a b c Figure 4.3: La partie gris´ ee est dans R(a). Proposition 4.2. Le diagramme de Vorono¨ ? Vor(S) d?un ensemble fini S est planaire en tant que graphe; de plus, si S ne contient pas quatre points cocy- cliques, tout sommet de Vor(S) est de degr´ e 3. Preuve. Puisque Vor(S) est constitu´ e des fronti` eres des r´ egions de Vorono¨ ? l?intersection de deux ar? etes est par d´ efinition un sommet du graphe. Ceci prouve que le graphe est planaire. Soit maintenant u un sommet de Vor(S), et soient a1, . . . , ak les sites tels que d(u, a1) = · · · = d(u, ak) ? d(u, b) pour tout b ? S ? {u, a1, . . . , ak}. Les points a1, . . . , ak sont sur le cercle de centre u et de rayon d(u, a1), donc k = 3. Version 6 f´ evrier 2005 11.4. Diagrammes de Vorono¨ ? 411 Soit S un ensemble de sites, et soit x un point du plan. L?amplitudede x ( clea- rance en anglais) est le nombre ?(x) = min{d(x, a) | a ? S} C?est le rayon du plus grand disque de centre x et dont l?int´ erieur est disjoint de S. Ce disque est appel´ e le disque de Delaunay de x, et le cercle correspondant son cercle de Delaunay. On peut alors d´ efinir de mani` ere ´ equivalente le diagramme de Vorono¨ ? comme l?ensemble des points du plan dont le cercle de Delaunay contient au moins deux ´ el´ ements de S, et les sommets du diagramme comme les points dont le cercle contient au moins trois sites. Lorsque S ne contient pas quatre points cocycliques, on peut associer ` a S une triangulation appel´ ee la triangulation de Delaunay, et que nous d´ efinissons main- tenant. De mani` ere g´ en´ erale, on appelle triangulation de S un ensemble de trian- gles v´ erifiant : (1) la r´ eunion des triangles est ´ egale ` a l?enveloppe convexe de S ; (2) les int´ erieurs des triangles sont deux ` a deux disjoints; (3) les sommets des triangles sont les ´ el´ ements de S. Soit p un sommet de Vor(S). Comme p est de degr´ e 3, il existe exactement trois sites appartenant au cercle de Delaunay de p. Ces trois sites constituent les sommets d?un triangle T(p) inscrit dans le cercle de Delaunay de p. Il est facile de v´ erifier que l?ensemble des triangles T(p) constitue une triangulation de S appel´ ee la triangulation de Delaunay de S. 11.4.2 L?algorithme de Fortune Dans cette section, nous d´ ecrivons un algorithme pour calculer le diagramme de Vorono¨ ? d?un ensemble S fini de points (les sites ) dans le plan. L?algorithme est un algorithme de balayage. La construction est plus facile ` a comprendre lorsqu?on l?interpr` ete dans l?espace R3 . Le plan contenant S est le plan P d?´ equation z = 0. L?espace R3 est balay´ e par un plan d?´ equation x + z = t. A chaque site a ? S est associ´ e un demi-c? one Ca d?axe vertical (on parlera plus simplement de c? one), d´ efini par Ca = {(x, y, z) | d(a, (x, y)) = z} Ainsi, la hauteur z d?un point sur ce c? one est ´ egale ` a la distance de ce point ` a sa projection (x, y) sur le plan P. Soient a et b deux sites, et Ca et Cb les c? ones correspondants. Ces c? ones s?inter- sectent en une branche d?hyperbole H. La hauteur z d?un point (x, y, z) sur cette hyperbole est ´ egale ` a la fois ` a d(a, (x, y)) et ` a d(b, (x, y)); en d?autres termes, la projection (orthogonale) de H est la m´ ediatrice du segment [a, b]. Autrement dit, cette hyperbole est l?intersection commune de Ca et de Cb avec le plan vertical d´ efini par la m´ ediatrice du segment [a, b]. Version 6 f´ evrier 2005 412 Chapitre 11. G´ eom´ etrie algorithmique  ?   ?   ?   ?   ? ?   ? ?   ?   ?    ?   ?   ?  ? ?  ?  ?  ?   ?   ?    P a p p C a 0 x y z ????? ????? ????? Figure 4.4: Demi-c? one associ´ e au site a. Supposons maintenant que les c? ones Ca pour a ? S, sont opaques , et regar- dons-les d?en bas . L?intersection de deux c? ones associ´ es ` a des sites a et b se projette en une droite, mais tous les points de cette droite ne sont pas visibles : un point p sera cach´ e par un autre c? one si le site de ce c? one est plus proche de p que a et b ne le sont. Le segment de droite visible est donc d´ elimit´ e par des points projection de l?intersection de trois c? ones. Traduisons ceci en posant C = {(x, y, z) | z = min a?S d(a, (x, y))} L?ensemble C est exactement la surface de tous les points visibles, puisque, pour chaque (x, y), on choisit le point de hauteur z minimale. Soit B l?ensemble des points de C qui appartiennent ` a au moins deux c? ones. Alors on a : Proposition 4.3. La projection orthogonale de l?ensemble B des points qui appartiennent ` a au moins deux c? ones de la famille Ca (a ? S) est ´ egale au diagramme de Vorono¨ ? de S. Preuve. Soit p = (x, y, z) un point de B. S?il appartient ` a la fois ` a Ca et ` a Cb pour deux sites distincts a, b ? S, alors le point p = (x, y) dans P est ´ equidistant de a et de b, et cette distance est z. Donc (x, y) appartient au diagramme de Vorono¨ ? de S. R´ eciproquement, si p = (x, y) appartient au diagramme de Vorono¨ ? de S, on a d(a, p ) = d(b, p ) = minc?S d(c, p ) pour deux points a, b de S. Le point p = (x, y, d(a, p )) appartient ` a B. Front parabolique L?algorithme de calcul du diagramme de Vorono¨ ? est un algorithme de balayage, par un plan oblique, qui est inclin´ e de sorte ` a ? etre tangent aux c? ones quand il Version 6 f´ evrier 2005 11.4. Diagrammes de Vorono¨ ? 413 passe par leur sommet. Plus pr´ ecis´ ement, ` a tout instant t ? R, on consid` ere le plan de balayage Pt d?´ equation x + z = t. Il intersecte donc le plan P contenant S en la droite ?t d?´ equation x = t. Appelons ligne de balayage cette droite. Le plan balaye l?espace pour t croissant. L?intersection d?un c? one Ca et du plan de balayage Pt est vide tant que le plan se trouve ` a gauche du c? one, c?est-` a-dire tant que t est plus petit que l?abscisse xa de a. Au moment o` u le plan touche le c? one, et est tangent au c? one, l?intersection est une demi-droite passant par a; on peut voir cette demi-droite comme une parabole d´ eg´ en´ er´ ee. Ensuite, l?intersection est une parabole, et cette parabole s? ouvre au fur et ` a mesure que t cro? ?t. La projection de la parabole sur le plan P est une parabole ?t(a) de foyer a, et de directrice ?t. a a  ? ? ? ? ? ?   ? ? ? ? ? ?   ? ? ? ? ? ?   ? ? ? ? ? ?   ? ? ? ? ? ?   ? ? ? ? ? ?   ? ? ? ? ? ?   ? ? ? ? ? ?  ????? ????? ????? ????? ????????????????? ????????????????? ????????????????? ????????????????? ????????????????? ????????????????? ????????????????? ????????????????? a C a t a t ( ) z y x ??? ??? ?????? ??? ??? Figure 4.5: Le plan de balayage. Supposons ` a nouveau les c? ones Ca opaques, supposons de plus Pt opaque, et regardons ` a nouveau les surfaces d?en bas. Le plan Pt occulte tous les sites qui se trouvent ` a droite de ?t, donc les c? ones associ´ es ` a ces sites. Les c? ones des sites d´ ej` a balay´ es donnent un ensemble de paraboles, toutes de m? eme directrice, et de largeur variable. Seules certaines de ces paraboles sont en partie visibles, ` a savoir tant qu?elles ne sont pas entr´ ees ` a l?int´ erieur d?autres c? ones. Plus pr´ ecis´ ement, l?intersection de la surface C et du plan Pt se projette en une courbe Ft qui est une union d?arcs de parabole de m? eme directrice ?t. Ces paraboles ont pour foyers des sites d?abscisse inf´ erieure ` a t. La courbe Ft est appel´ ee le front parabolique ` a Version 6 f´ evrier 2005 414 Chapitre 11. G´ eom´ etrie algorithmique l?instant t. t Figure 4.6: Le front parabolique au temps t. Toute droite horizontale du plan P intersecte le front parabolique Ft en un point unique. Par ailleurs, Ft poss` ede des points anguleux. Ce sont des points d?inter- section de deux arcs de parabole cons´ ecutifs sur le front. Ils correspondent ` a la projection d?un point de B, et appartiennent donc au diagramme de Vorono¨ ? de S. La proposition suivante montre la r´ eciproque. Proposition 4.4. Tout point du diagramme de Vorono¨ ? de S est point anguleux d?un front parabolique Ft pour un r´ eel t. Preuve. Soit u une ar? ete du diagramme de Vorono¨ ? de S, et soit p un point sur u. L?ar? ete u est un intervalle sur la m´ ediatrice de deux sites a et b. Posons r = d(a, p) = d(b, p), et consid´ erons la droite de balayage ?t situ´ ee ` a droite de p et telle que d(p, ?t) = r. En d?autres termes, ?t est tangente, en un point p , au cercle ? de centre p et de rayon r, cercle qui passe par a et b. Ce cercle ne contient, par d´ efinition du diagramme de Vorono¨ ? aucun autre site en son int´ erieur. Le point p appartient aux paraboles ?t(a) et ?t(b). Supposons que p n?appartient pas au front parabolique Ft. Alors une autre parabole ?t(c) passe strictement entre p et ?t, et coupe donc l?intervalle ]p, p [ en un point q. Or le site c est ´ equidistant de p et de q, donc se trouve sur le cercle ? de centre q et de rayon qp . Mais alors ? est ` a l?int´ erieur de ?, et c est ` a l?int´ erieur de ?, ce qui est impossible. Il r´ esulte de cette proposition qu?il suffit de balayer contin? ument l?espace par le plan Pt pour obtenir l?ensemble des points constituant le diagramme de Vorono¨ ? comme points anguleux des fronts paraboliques. Version 6 f´ evrier 2005 11.4. Diagrammes de Vorono¨ ? 415 t a b p p 0 u Figure 4.7: Tout point du diagramme de Vorono¨ ? est point anguleux. Ev´ enements En fait, comme le diagramme de Vorono¨ ? est form´ e d?un nombre fini de points et de segments, on peut se contenter de calculer un nombre fini de donn´ ees. De mani` ere analogue, la suite des sites relatifs aux arcs du front parabolique ne change qu?en un nombre fini d?instants t, lorsque t varie de ?? ` a +?; ce sont ces instants qui constituent les ´ ev´ enements dont nous parlons maintenant. Un ´ ev´ enement est un instant t o` u un arc de parabole appara? ?t ou dispara? ?t sur le front parabolique Ft. Apparition d?un nouvel arc de parabole a b c ´ t ? Figure 4.8: Apparition d?un nouvel arc ?. Lorsque la droite de balayage ?t passe par un site a, une nouvelle parabole ?t(a) appara? ?t. Au d´ epart, cette parabole est d´ eg´ en´ er´ ee, et est r´ eduite ` a une demi- droite horizontale issue de a. Cette parabole (demi-droite) intersecte le front parabolique en un seul arc, ou alors en deux arcs cons´ ecutifs; dans ce cas, le Version 6 f´ evrier 2005 416 Chapitre 11. G´ eom´ etrie algorithmique point d?intersection est un point anguleux. Ces situations sont les seules o` u peut appara? ?tre un nouvel arc parabolique : Proposition 4.5. Un nouvel arc parabolique appara? ?t ` a l?instant t dans le front parabolique si et seulement si ?t balaye un nouveau site. Preuve. Supposons le contraire. Alors un nouvel arc parabolique ? appara? ?t dans le front parabolique ` a un instant t sans ? etre cr´ e´ e par l?arriv´ ee d?un nouveau site. La parabole ? dont ? est un arc existait donc d´ ej` a, mais ´ etait auparavant situ´ ee enti` erement ` a gauche du front parabolique. Au moment de l?apparition de l?arc ? dans le front, la parabole ? est - soit tangente ` a un arc de parabole du front; - soit passe par un point anguleux du front. Les deux situations m` enent ` a une contradiction. En effet, si ? est tangente ` a un arc ? d?une parabole ? , cela signifie que ? a un rayon de courbure inf´ erieur ` a celui de ? , donc que son foyer est plus proche de ?t que celui de ? . Or ? est contenue (au sens large) dans ? , donc son sommet est plus ´ eloign´ e de ?t que le sommet de ? . Ces deux conditions sont contradictoires. a b c H p ´ t ? Figure 4.9: Apparition de l?arc ? : deuxi` eme cas impossible. Pour montrer que le deuxi` eme cas est ´ egalement impossible, il nous faut un peu de calcul, et des notations (voir figure 4.9). Notons (xs, ys) les coordonn´ ees d?un point s. Soient ? et ? les deux arcs de parabole dont l?intersection d´ efinit le point anguleux p = (xp, yp), ` a l?instant t o` u l?arc de parabole ? appara? ?t. Soient b et c les foyers des paraboles supportant ? et ?, et soit a le foyer de ?. On suppose yb > yp > yc. On a alors xa ? xb ou xa ? xc, selon que ya ? yp ou ya ? yp. Consid´ erons la droite horizontale H d?´ equation y = yp. Au temps t, les paraboles ?t(a), ?t(b), et ?t(c) intersectent H au point p. Au temps t + ?, pour ? > 0 assez petit, l?intersection de H avec ?t+?(a) se situe ` a droite de l?intersection de H avec ?t+?(b), et ` a droite de ?t+?(c). Ceci signifie qu?au temps t, la vitesse avec laquelle le point d?intersection ?t(a) ? H se d´ eplace sur H est sup´ erieure ` a la vitesse correspondante de ?t(b) ? H. Calculons donc cette vitesse. L?´ equation d?une parabole ?t(s) de foyer s et de directrice ?t est (x ? xs)2 + (y ? ys)2 = (x ? t)2 Version 6 f´ evrier 2005 11.4. Diagrammes de Vorono¨ ? 417 ou encore 2x(t?xs) = t2 ?x2 s ?(y?ys)2 . Soit x(a) (t) l?abscisse du point ?t(a)?H. En d´ erivant, on obtient 2x(a) + 2(dx(a) /dt)(t ? xa) = 2t, soit encore dx(a) dt = t ? x(a) t ? xa et des formules analogues pour b et c. Au temps t, on a x(a) (t) = x(b) (t) = x(c) (t) = xp. Comme dx(a) dt > dx(b) dt on a donc xa < xb, et de m? eme xa < xc, une contradiction. Disparition d?un arc de parabole Au moment o` u un arc de parabole ? dispara? ?t, il est r´ eduit ` a un point p qui est en fait l?intersection de trois arcs de parabole cons´ ecutifs ?, ? et ?. Par un argument d´ ej` a employ´ e plus haut, on v´ erifie que ? et ? n?appartiennent pas ` a la m? eme parabole. Le point p est ´ equidistant des foyers a, b et c des paraboles correspondantes, et de la droite de balayage ?t. En d?autres termes, le point p est un sommet du diagramme de Vorono¨ ?. Plus pr´ ecis´ ement, ?t est tangent au cercle circonscrit aux sites a, b, c de centre p, qui est un cercle de Delaunay. Nous venons de prouver : Proposition 4.6. Un arc dispara? ?t du front parabolique ` a l?instant t si et seule- ment si ?t est tangent ` a un cercle de Delaunay centr´ e sur un sommet du dia- gramme de Vorono¨ ?. Deux structures de donn´ ees sont n´ ecessaires pour mettre en ?uvre l?algorithme de Fortune. Ces structures de donn´ ees sont d?ailleurs toujours de m? eme nature lorsque l?on veut r´ ealiser un algorithme de balayage : une premi` ere structure g` ere les ´ ev´ enements. Chaque ´ ev´ enement correspond ` a un nombre r´ eel, qui est l?abscisse de la droite de balayage. On extrait les ´ el´ ements en ordre croissant, et on ins` ere si n´ ecessaire de nouveaux ´ el´ ements; il convient donc d?employer une file de priorit´ e. La deuxi` eme structure g` ere les objets actifs, ici les arcs du front parabolique. Ces objets sont naturellement ordonn´ es par ordonn´ ees croissantes, et les op´ erations ` a effectuer sont celles d?un dictionnaire. On r´ ealise donc l?impl´ ementation en faisant appel ` a un arbre de recherche ´ equilibr´ e. Si le nombre d?´ ev´ enements est lin´ eaire en fonction du nombre n de sites, il y a de fortes pr´ esomptions pour que l?algorithme co? ute au total O(n log n) op´ erations, et une place O(n). On verra qu?il en est ainsi aussi pour l?algorithme de Fortune. File des ´ ev´ enements La file des ´ ev´ enements, not´ ee E, contient deux types d?´ ev´ enements : les ´ ev´ ene- ments de type site, et les ´ ev´ enements de type cercle. Chaque ´ ev´ enement est d´ ecrit Version 6 f´ evrier 2005 418 Chapitre 11. G´ eom´ etrie algorithmique par son type, et par un nombre r´ eel, qui est l?instant t o` u il doit ? etre extrait de la file et trait´ e. Un ´ ev´ enement de type site est l?arriv´ ee de la ligne de balayage sur un nouveau site. La figure 4.10 montre un tel ´ ev´ enement. Ces ´ ev´ enements sont rep´ er´ es et rang´ es par les abscisses croissantes des sites. Un ´ ev´ enement de type cercle correspond ` a la disparition d?un arc de parabole. Comme nous l?avons vu plus haut, la disparition se produit au moment o` u trois arcs de parabole s?intersectent en un point anguleux. Ce point anguleux est alors le centre d?un cercle de Delaunay tangent ` a la droite de balayage ` a cet instant, et c?est un sommet du diagramme de Vorono¨ ?. C?est ainsi que sont cr´ e´ es les sommets du diagramme de Vorono¨ ?. Un ´ ev´ enement de type cercle est rep´ er´ e par la plus grande valeur t de la droite de balayage ?t tangente au cercle, puisque c?est ` a cet instant qu?un arc de parabole dispara? ?t du front parabolique. Au d´ ebut de l?exploration, la file E est initialis´ ee avec les n ´ ev´ enements sites. Au fur et ` a mesure du balayage, des ´ ev´ enements du type cercle sont cr´ e´ es et ins´ er´ es dans la file. Plus pr´ ecis´ ement, des ´ ev´ enements de type cercle sont cr´ e´ es (voir aussi plus bas) chaque fois que trois arcs de parabole deviennent cons´ ecutifs. Lors de la cr´ eation de tels ´ ev´ enements, on n?est pas certain qu?ils donneront naissance ` a un sommet du diagramme de Vorono¨ ?, car les sites ` a droite de la ligne de balayage ne sont pas encore connus ` a cet instant. On les ins` ere quand m? eme dans la file, quitte ` a les supprimer ult´ erieurement. Voici donc une description de l?algorithme de Fortune, qui sera d´ etaill´ ee dans la suite : proc´ edure Fortune; (description sommaire) Ins´ erer les ´ ev´ enements sites dans la file E ; tantque la file E n?est pas vide, faire extraire un ´ ev´ enement p; si l?´ ev´ enement est un site, alors cr´ eer un nouvel arc parabolique, et une ar? ete de Vorono¨ ?; d´ esactiver les ´ ev´ enements cercle obsol` etes; ins´ erer les ´ ev´ enements cercle; si l?´ ev´ enement est un cercle, alors supprimer l?arc parabolique, cr´ eer un sommet de Vorono¨ ?; d´ esactiver les ´ ev´ enements cercle obsol` etes; ins´ erer les ´ ev´ enements cercle; fintantque. Arbre du front parabolique Les arcs de parabole constituant le front parabolique sont naturellement ordonn´ es par valeur croissante de leurs ordonn´ ees. On les range aux feuilles d?un arbre Version 6 f´ evrier 2005 11.4. Diagrammes de Vorono¨ ? 419 binaire de recherche ´ equilibr´ e F, qui contient quelques informations compl´ e- mentaires. Un n?ud x de l?arbre contient un couple (a, b) de sites, ` a savoir les sites des arcs de parabole extr? emes de l?intervalle de paraboles aux feuilles du sous-arbre de racine x. Ces informations permettent de piloter la recherche de l?arc de parabole intersectant une droite horizontale d?ordonn´ ee donn´ ee. En fait, l?arbre F est enrichi comme suit : - chaque feuille (repr´ esentant un arc du front) contient un pointeur vers le site associ´ e; - les feuilles sont cha? ?n´ ees entre elles, mais indirectement : entre deux feuilles cons´ ecutives est plac´ e un pointeur (que nous appelons cha? ?non) vers une ar? ete du diagramme de Vorono¨ ? en cours de construction. En effet, comme nous l?avons montr´ e plus haut, le point anguleux entre deux arcs de parabole cons´ ecutifs du front est sur une ar? ete du diagramme de Vorono¨ ? et c?est un pointeur vers cette ar? ete, dont on ne conna? ?t d?ailleurs en g´ en´ eral pas les extr´ emit´ es, qui est le cha? ?non entre deux feuilles successives. Cela signifie aussi que de chaque feuille, on peut acc´ eder en temps constant aux voisins. Nous avons vu que ceci est une extension facile des arbres de recherche balis´ es. Une ar? ete elle- m? eme contient un couple de pointeurs vers (le ou) les sommets du diagramme de Vorono¨ ? qui sont ses extr´ emit´ es. Comme on le verra, la cr´ eation d?une ar? ete et l?attribution des extr´ emit´ es ` a l?ar? ete ne se font pas n´ ecessairement au m? eme instant. Gestion du front Les ´ ev´ enements sont extraits dans l?ordre de la file des ´ ev´ enements E. Voici les op´ erations ` a r´ ealiser sur l?arbre. Si l?´ ev´ enement est un site a, un arc parabolique d´ eg´ en´ er´ e ? est cr´ e´ e. On descend dans l?arbre F ` a la recherche de l?arc parabolique, disons ?, qui est intersect´ e par ? (le cas o` u ? intersecte le front en un point anguleux sera consid´ er´ e plus loin). L?arc ? est coup´ e en deux arcs ? et ? entre lesquels vient se placer ?. Dans l?arbre F, on substitue donc, ` a la feuille ?, trois feuilles ? , ?, ? , et on ins` ere les deux n?uds n´ ecessaires. Une nouvelle ar? ete v du diagramme de Vorono¨ ? est cr´ e´ ee, et les deux cha? ?nons entre ? et ? d?une part, entre ? et ? d?autre part, pointent vers cette ar? ete (on ne conna? ?t pas encore les sommets du diagramme de Vorono¨ ? qui seront les extr´ emit´ es de l?ar? ete). Si l?´ ev´ enement est du type cercle, cela signifie d?abord la suppression d?un arc de parabole ? r´ eduit ` a un point s qui est un sommet du diagramme de Vorono¨ ?. La suppression de la feuille ? dans l?arbre F (avec le r´ e´ equilibrage ´ eventuellement n´ ecessaire) est donc accompagn´ ee de la cr´ eation d?un sommet du diagramme de Vorono¨ ?. De plus, les ar? etes sur lesquelles pointent les deux cha? ?nons voisins de ? re¸ coivent leur extr´ emit´ e correspondante : c?est le point s. La suppression de ? et de ses deux cha? ?nons est suivie de l?insertion d?un cha? ?non entre ses feuilles voisines. Ce cha? ?non pointe vers une nouvelle ar? ete, disons w, dont une extr´ emit´ e est le sommet s. Version 6 f´ evrier 2005 420 Chapitre 11. G´ eom´ etrie algorithmique b c ´ t ? u ? u ´ avant b c ´ t ? a u 0 0 0 ´ v ? u ´ ´ 0 v après 0 0 Figure 4.10: Un ´ ev´ enement de type site : cas g´ en´ eral . b c ´ t ? u 0 a v w s ? w ´ 0 u v s ´ Figure 4.11: Disparition de ? et cr´ eation du sommet s. Toutes ces op´ erations (sauf la recherche et le r´ e´ equilibrage) se font bien s? ur en temps constant. Reste le cas d?un ´ ev´ enement de type site sp´ ecial : c?est le cas o` u l?arc parabolique d´ eg´ en´ er´ e ? cr´ e´ e par l?arriv´ ee du site a intersecte le front parabolique en un point anguleux (voir figure 4.12). Dans ce cas, les deux op´ erations ci-dessus se succ` edent : l?arc ? est ins´ er´ e dans l?arbre F entre les deux arcs qu?il intersecte, et le sommet s du diagramme de Vorono¨ ? est cr´ e´ e imm´ ediatement. Gestion des ´ ev´ enements Comme nous l?avons dit, les ´ ev´ enements de type site sont cr´ e´ es au d´ ebut des Version 6 f´ evrier 2005 11.4. Diagrammes de Vorono¨ ? 421 b c ´ t ? u a v w s ? w ´ u v s Figure 4.12: Ev´ enement site avec cr´ eation d?un sommet. calculs. Les ´ ev´ enements de type cercle signalent un sommet du diagramme de Vorono¨ ?, ou de mani` ere ´ equivalente, un cercle de Delaunay contenant 3 sites au moins. Un tel ´ ev´ enement est cr´ e´ e chaque fois que l?on rencontre, pour la premi` ere fois, trois arcs cons´ ecutifs du front parabolique. Dans ce cas, le cercle circonscrit ` a leurs sites est calcul´ e. Cet ´ ev´ enement est rep´ er´ e par l?abscisse maximale d?un point sur ce cercle. La gestion de ces ´ ev´ enements est plus d´ elicate : chaque fois qu?un nouveau site est introduit, il peut appara? ?tre ` a l?int´ erieur de cercles calcul´ es pr´ ec´ edemment, et dont on avait supput´ e, au moment de leur cr´ eation, qu?ils ´ etaient des cercles de Delaunay. Pour tenir compte de cette situation, il faudra d´ etruire, ou d´ esactiver, des ´ ev´ enement de type cercle introduits dans la file (on suppose qu?un ´ ev´ enement de type cercle poss` ede un champ qui signale s?il est actif ou non). Un ´ ev´ enement de type cercle est d´ etermin´ e par trois arcs cons´ ecutifs ?, ?, ? du front parabolique. On dira qu?il est associ´ e ` a ? ; l?´ ev´ enement est actif tant qu?il continue ` a ? etre associ´ e ` a un arc parabolique. La cr´ eation d?´ ev´ enements de type cercle se fait lors du traitement des ´ ev´ enements de E. Consid´ erons les deux cas. Un ´ ev´ enement de type site provient de la rencontre d?un site a; consid´ erons d?abord le cas g´ en´ eral : on cr´ ee un arc parabolique (d´ eg´ en´ er´ e) ? qui coupe en deux arcs ? , ? un arc ? (voir ci-dessus). L?´ ev´ enement de type cercle associ´ e ` a ?, s?il existe, est d´ etruit (d´ esactiv´ e), et deux nouveaux ´ ev´ enements de type cercle sont cr´ ees, s?il y a assez d?arcs, l?un associ´ e ` a ? , et l?autre associ´ e ` a ? . Notons que comme a est sur les cercles correspondants, ces ´ ev´ enements se situent ` a droite de la ligne de balayage. Dans le cas d?un ´ ev´ enement de type site sp´ ecial , on supprime les ´ ev´ enements de type cercle associ´ es aux voisins ? et ? de ?, et on cr´ ee de nouveaux ´ ev´ enements de type cercle pour ? et ? (avec ? comme voisin!). Si l?´ ev´ enement est de type cercle, il y a disparition d?un arc ? du front parabolique (pr´ ecis´ ement celui auquel est associ´ e l?´ ev´ enement en cours de traitement!). Soient Version 6 f´ evrier 2005 422 Chapitre 11. G´ eom´ etrie algorithmique ? et ? les arcs qui pr´ ec` edent et suivent ? (` a supposer qu?ils existent). Les ´ eventuels ´ ev´ enements de type cercle associ´ es ` a ces arcs sont d´ esactiv´ es, et d?autres sont calcul´ es : soit ? l?arc qui suit ? dans le front (s?il existe). Les trois arcs ?, ?, ? sont maintenant cons´ ecutifs; soit C le cercle circonscrit ` a leurs sites. Si l?abscisse maximale d?un point de C est sup´ erieure ` a la valeur t de balayage, l?´ ev´ enement ainsi cr´ e´ e est associ´ e ` a ? et ins´ er´ e dans la file; sinon, il est ignor´ e. Expliquons pourquoi on peut ignorer l?´ ev´ enement si l?abscisse maximale d?un point de C est inf´ erieure ` a t : dans ce cas, si C est un cercle de Delaunay, son centre est un sommet du diagramme de Vorono¨ ?, et il a donc d´ ej` a ´ et´ e trait´ e ant´ erieurement (en d?autres termes, un ´ ev´ enement de type cercle d´ etermin´ e par ?, ?, et ? a d´ ej` a ´ et´ e cr´ e´ e et trait´ e ant´ erieurement). Analyse Il nous reste ` a analyser le temps pris par l?algorithme : Th´ eor` eme 4.7. L?algorithme de Fortune calcule le diagramme de Vorono¨ ? de n sites en temps O(n log n) et en place O(n). Preuve. Chaque ´ ev´ enement de type site cr´ ee un arc parabolique d´ eg´ en´ er´ e, et sauf dans un cas sp´ ecial, coupe en deux un arc parabolique. Un tel ´ ev´ enement cr´ ee donc trois arcs, et en supprime un (celui qui est coup´ e en deux). Un ´ ev´ enement de type cercle ne cr´ ee pas d?arc. Le nombre total d?arcs de parabole pr´ esents durant le balayage est O(n). Le traitement d?un ´ ev´ enement cercle cr´ ee un som- met du diagramme de Vorono¨ ?, et comme le diagramme est planaire, le nombre d?´ ev´ enements cercles trait´ es est en O(n). Mais tous les ´ ev´ enements cr´ e´ es ne sont pas trait´ es, puisque certains sont supprim´ es auparavant. Toutefois, le traitement d?un ´ ev´ enement site ou cercle ne cr´ ee qu?un nombre constant d?´ ev´ enements, donc le nombre d?´ ev´ enements de type cercle est aussi en O(n). Ainsi, le nombre total d?´ ev´ enements cr´ e´ es est en O(n). La place n´ ecessaire pour g´ erer ces ´ ev´ enements, et pour g´ erer l?arbre des arcs de parabole, est donc O(n). Chaque ´ ev´ enement requiert O(log n) op´ erations, pour l?insertion dans la file, et chaque gestion d?arc de parabole demande ´ egalement un temps O(log n). D?o` u le temps total annonc´ e. 11.4.3 Diagramme de Vorono¨ ? de segments Dans cette section, on consid` ere des diagrammes de Vorono¨ ? de segments. Il existe plusieurs d´ efinitions; nous choisissons de pr´ esenter celle qui est la mieux adapt´ ee au probl` eme de planification de trajectoires dont il sera question dans le chapitre suivant. Etant donn´ e un segment s = [a, b] du plan, on appellera, par abus de langage, segment ouvert le segment s priv´ e de ses extr´ emit´ es a et b. Soit S un ensemble form´ e d?un nombre fini de segments ouverts deux ` a deux disjoints, et d?un ensemble fini de points. Les points qui sont les extr´ emit´ es des Version 6 f´ evrier 2005 11.4. Diagrammes de Vorono¨ ? 423 segments sont toujours suppos´ es appartenir ` a S. Pour tout segment ouvert s, on notera ¯ s le segment form´ e de s et de ses extr´ emit´ es. On appellera indistinctement primitive un point ou un segment ouvert de S. L?ensemble de la figure 4.13 ci- dessous est form´ e de 10 primitives, les 6 points a, b c, d, e, f et les 4 segment ouverts u, v, w, t. a f c d e u v w t b Figure 4.13: Un ensemble de 4 segments ouverts et 6 points. Nous d´ efinissons le diagramme de Vorono¨ ? de S en faisant l?usage de l?amplitude d?un point et des disques de Delaunay. Soit p un point du plan. L?amplitude de p (relativement ` a S) est le nombre ?(p) = min{d(p, s) | s ? S}. Lorsque s est un segment, la distance de p ` a s est d´ efinie par d(p, s) = inf{d(p, q) | q ? s}. Le disque de Delaunay du point p du plan est le disque D(p) de centre p et de rayon ?(p). C?est le plus grand disque centr´ e sur p et dont l?int´ erieur est disjoint de S. La fronti` ere du disque, qui est le cercle de Delaunay de p, rencontre la r´ eunion des objets de S en au moins un point. L?ensemble Proche(p) des primitives proches de p est d´ efini comme suit : - un point a ? S appartient ` a Proche(p) si d(a, p) = ?(p), donc si a est sur le cercle de Delaunay de p; - un segment ouvert s appartient ` a Proche(p) si d(a, s) = ?(p), et si de plus la projection orthogonale de p sur la droite contenant s appartient ` a ¯ s. Le diagramme de Vorono¨ ? de S est l?ensemble Vor(S) form´ e des points p tels que Proche(p) contient au moins deux primitives. Un sommet est un point p tel que Proche(p) contient au moins trois primitives. Une ar? ete est un ensemble connexe maximal de points tels que Proche contient exactement deux primitives. Une ar? ete peut ? etre infinie des deux c? ot´ es, ou d?un seul c? ot´ e, ou finie; ses extr´ emit´ es, lorsqu?elles existent, sont des sommets du diagramme. La forme et la structure du diagramme de Vorono¨ ? de segments sont plus com- plexes que pour un ensemble de points. Dans le cas du diagramme de Vorono¨ ? d?un ensemble de points, les ar? etes sont des segments de droites, des demi-droites ou des droites. Il n?en est plus ainsi pour le diagramme de Vorono¨ ? de segments : les ar? etes peuvent ? etre ´ egalement des arcs de parabole. Plus pr´ ecis´ ement, soit s un segment ouvert, d?extr´ emit´ es a et b. La bande d´ elimit´ ee par s, not´ ee B(s), est Version 6 f´ evrier 2005 424 Chapitre 11. G´ eom´ etrie algorithmique a b s B ( ) s P a ( ) P b ( ) p Figure 4.14: Diagramme de Vorono¨ ? form´ e de 4 demi-droites et d?un arc de parabole. la r´ egion ferm´ ee du plan d´ elimit´ ee par les droites perpendiculaires ` a s et passant par a et par b respectivement. La bande de s divise le plan en trois r´ egions : deux demi-plans ouverts P(a) et P(b), l?un ayant sur sa fronti` ere a et l?autre b, et la bande B(s) (voir figure 4.14). On a alors : Lemme 4.8. Soit p un point qui n?appartient pas au segment ¯ s = [a, b], et soit E l?ensemble des points ´ equidistants de p et de [a, b]. L?intersection de E et de P(a) est la partie de la m´ ediatrice de [p, a] contenue dans P(a); l?intersection de E et de B(s) est la partie de la parabole de foyer p et de directrice d(a, b) contenue dans B(s). Ce lemme d´ ecrit donc enti` erement le diagramme de Vorono¨ ? d?un ensemble form´ e d?un segment et d?un point. Ce diagramme est form´ e de quatre demi-droites (en pointill´ e sur la figure), et d?un arc de parabole. La figure 4.15 donne le diagramme de Vorono¨ ? de deux segments. Il a six sommets, et onze ar? etes. Nous avons ´ etiquet´ e certaines ar? etes par le couple de primitives qui forme l?ensemble Proche. Evidemment, deux ar? etes concourantes ont une primitive commune. On peut voir que la partie centrale est form´ ee de 7 ar? etes. La r´ egion de Vorono¨ ? d?une primitive r est l?ensemble R(r) des points p tels que r appartient ` a Proche(p). L?int´ erieur d?une r´ egion de Vorono¨ ? est constitu´ e des points p du plan tels que Proche(p) est r´ eduit ` a une seule primitive. Par connexit´ e, cette primitive est la m? eme pour tous les points de la r´ egion. Ainsi, la r´ egion R(s) du segment s sur la figure 4.15 est form´ ee de la bande B(s), ` a laquelle on a enlev´ e la portion situ´ ee au-dessus des ar? etes (s, d), (s, t), (s, c), (s, t). Proposition 4.9. Toute r´ egion de Vorono¨ ? R(r) est ´ etoil´ ee par rapport ` a r, c?est-` a-dire pour tout p ? R(r), il existe q ? r tel que [p, q] ? R(r). Nous allons prouver un r´ esultat l´ eg` erement plus fort : Proposition 4.10. Soit p un point ` a l?int´ erieur d?une r´ egion de Vorono¨ ? R(r), et soit ¯ p la projection de p sur r. Si p = ¯ p, l?intersection de la droite D passant par p et ¯ p et de R(r) est convexe. Version 6 f´ evrier 2005 11.4. Diagrammes de Vorono¨ ? 425 a s b t d c bd bt td td st st sc sd ad s R ( ) s R ( ) Figure 4.15: Le diagramme d´ efini par deux segments. Preuve. Comme p appartient ` a R(r), l?intersection du cercle de Delaunay de centre p avec la r´ eunion des primitives ne rencontre que r, et l?intersection est r´ eduite au point ¯ p. Soit q un point de D ? R(r), et t un point de [¯ p, q]. Le disque de Delaunay de t est contenu dans le disque de Delaunay de q, et est tangent ` a ce disque en ¯ p, donc t ? R(r), car l?int´ erieur du disque de Delaunay de q, et donc de t ne rencontre aucune primitive. Cela implique que l?intersection de D et de R(r) est convexe. Bien entendu, une r´ egion de Vorono¨ ? n?est en g´ en´ eral pas convexe, dans le cas de segments. La figure 4.16 donne un diagramme de Vorono¨ ? plus complexe. Lorsque les segments forment des polygones disjoints, on peut distinguer la par- tie int´ erieure et la partie ext´ erieure du diagramme. Dans la figure 4.16, seule est trac´ ee la partie du diagramme qui est int´ erieure au rectangle, et ext´ erieure aux autres polygones. Cette configuration est celle qui est rencontr´ ee dans le cadre de la planification de trajectoires. Nous mentionnons sans preuve le r´ esultat suivant : Th´ eor` eme 4.11. Il existe un algorithme pour calculer le diagramme de Vorono¨ ? de n primitives en temps O(n log n). Version 6 f´ evrier 2005 426 Chapitre 11. G´ eom´ etrie algorithmique Figure 4.16: Un diagramme de Vorono¨ ?. Notes La litt´ erature sur la g´ eom´ etrie algorithmique est relativement r´ ecente, pour les raisons ´ evoqu´ ees dans la premi` ere section. Les algorithmes pr´ esent´ es dans ce chapitre sont pour la plupart expos´ es dans les ouvrages de F.P. Preparata et M.I. Shamos et de K. Melhorn : F.P. Preparata, M.I. Shamos, Computational Geometry, Springer, Berlin, 1985. K. Mehlhorn, Data Structures and Algorithms : Vol.3 Multi-dimensional Search- ing and Computational Geometry, Springer, Berlin, 1984. Nous avons eu pour principe de donner une description d´ etaill´ ee de l?impl´ ementa- tion des algorithmes propos´ es, qui garantit la complexit´ e annonc´ ee et qui permet une programmation facile, avec la pr´ eoccupation implicite de minimiser les erreurs dues ` a la manipulation de nombres r´ eels (nous n?avons pas du tout abord´ e les difficult´ es pos´ ees par la nature non discr` ete des probl` emes g´ eom´ etriques). Les algorithmes de calcul d?enveloppe convexe dans le plan sont nombreux; le premier algorithme en temps O(n log n) est d? u ` a Graham et date de 1972. Version 6 f´ evrier 2005 Exercices 427 L?algorithme de la localisation d?un point dans une subdivision planaire expos´ e est le plus performant ` a ce jour, en temps et en espace. Il est d? u ` a N. Sarnak et R.E. Tarjan : N. Sarnak, R.E. Tarjan, Planar point location using persistent search trees, Comm. Assoc.Comput.Mach. 29 (1986), 669?679. L?´ etude des diagrammes de Vorono¨ ? est riche et vari´ ee. L?algorithme de calcul du diagramme de Vorono¨ ? d?un ensemble fini de points coplanaires expos´ e ici est celui de S.J. Fortune S.J. Fortune, A sweepline algorithm for Vorono¨ ? diagrams, Proc. 2nd Ann. ACM Symp. Comput. Geom. (1986), 313?322. D?autres algorithmes de m? eme complexit´ e existent, en particulier celui de D.G. Kirkpatrick qui proc` ede par dichotomie. L?avantage de l?algorithme de Fortune est de pouvoir s?adapter au cas des segments; nous ne l?avons pas pr´ esent´ e ici, car il est relativement sophistiqu´ e. Le chapitre 7 Computational Geometry de F.F. Yao du Handbook Vol.A contient des r´ ef´ erences compl` etes sur les sujets abord´ es dans ce chapitre. Exercices 11.1. Soit D une droite, O ? D, et H un demi-plan ouvert de fronti` ere D. Montrer que la restriction ` a H de la relation O est une relation d?ordre. 11.2. Soit O un point du plan. On ins` ere dans un arbre binaire initialement vide, successivement n points, le crit` ere de descente au sommet contenant p, lors de l?insertion du point q, ´ etant : si q O p alors descendre ` a gauche sinon descendre ` a droite. a) Montrer que le parcours pr´ efixe de l?arbre obtenu fournit un circuit polaire des n points relativement ` a O. b) En est-il de m? eme si l?on maintient une structure d?arbre AVL, i.e. si l?on proc` ede ` a des r´ e´ equilibrages par rotations lors des insertions? c) Montrer qu?on peut d´ efinir une structure d?arbre AVL balis´ e, i.e. avec stockage des ´ el´ ements aux feuilles, de fa¸ con ` a ce que l?insertion successive de n points dans un arbre initialement vide fournisse un circuit polaire des n points relativement ` a O; on pr´ ecisera quelles sont les balises aux n?uds et quel est le test de descente. 11.3. Dans l?algorithme de Graham, au lieu de choisir O(0, y0) ` a l?int´ erieur de l?enveloppe convexe, on choisit le point O (x0, ??). a) Que devient le circuit polaire des n points relativement ` a O ? b) Montrer qu?en appliquant l?algorithme de Graham avec O au lieu de O, on obtient l?enveloppe convexe sup´ erieure des n points. Version 6 f´ evrier 2005 428 Chapitre 11. G´ eom´ etrie algorithmique c) En d´ eduire un nouvel algorithme de calcul d?enveloppe convexe et donner sa complexit´ e. 11.4. Montrer que dans une gestion dynamique d?enveloppe convexe, on peut r´ ealiser la suppression d?un point en temps O(log2 n), o` u n est le nombre de points consid´ er´ es. 11.5. On dit que P = (p1, p2, ..., pn) est une ligne polygonale cadr´ ee dans la direction ? si c?est une ligne polygonale simple et si de plus, il existe deux droites parall` eles distinctes ? et ? de direction ? passant respectivement par p1 et pn telles que tous les points pi (1 < i < n) soient situ´ es ` a l?int´ erieur de la bande limit´ ee par ? et ? (figure 4.17(a)). p p p 1 n 1 n ? ?' p (a) (b) enveloppe convexe droite Figure 4.17: Exemples. Il est clair qu?une ligne polygonale simple n?est pas n´ ecessairement cadr´ ee (figure 4.17(b)). Si P = (p1, ..., pn) est une ligne polygonale cadr´ ee, alors p1 et pn sont des sommets de l?enveloppe convexe de P, et ils partitionnent le contour orient´ e de EC(P) en deux lignes polygonales simples, l?une de p1 vers pn que nous appellerons enveloppe convexe droite de P et l?autre de pn vers p1 que nous appellerons enveloppe convexe gauche. Cette terminologie se justifie par le fait que l?enveloppe convexe gauche (resp. droite) de P ainsi d´ efinie est ´ egalement le contour de l?enveloppe convexe de l?ensemble des sommets de P situ´ es ` a gauche (resp. ` a droite), au sens large, du vecteur ? ? ? p1pn. Il suffit donc de calculer l?enveloppe convexe droite D de P, le calcul de l?enveloppe convexe gauche ´ etant de m? eme nature. Ainsi, D est constitu´ e d?une sous-suite (q1, ..., qR) de la suite P avec q1 = p1 et qR = pn. On peut d´ ecrire chaque segment [qi, qi+1] comme ´ etant la fermeture d?une poche Ki = (pki , ..., pki+1 ) de la ligne polygonale P (figure 4.18) a) D´ eterminer un algorithme qui consiste ` a suivre la ligne polygonale (p1, .., pn) et ` a construire successivement les fermetures des poches en temps O(n). b) En d´ eduire un algorithme lin´ eaire de calcul de l?enveloppe convexe d?un poly- gone simple. Version 6 f´ evrier 2005 Exercices 429 p = q q q q q p = q 1 1 2 3 4 5 6 n R q ? ? ' Figure 4.18: Principe de l?algorithme. 11.6. Soient P et Q deux polgones convexes ayant respectivement m et n som- mets. Montrer qu?on peut calculer la distance de P ` a Q en temps O(sup(m, n)) dans le pire des cas. 11.7. Le probl` eme des bureaux de poste : Etant donn´ es n points distincts du plan (les bureaux de poste), d´ eterminer pour un point arbitraire p le (ou un) bureau de poste le plus pr` es de p. D´ ecrire un pr´ etraitement des n points qui permet de r´ esoudre le probl` eme en temps O(log n). 11.8. Le probl` eme du plus grand cercle vide : Etant donn´ es un ensemble S de n points distincts du plan, d´ eterminer un cercle de plus grand rayon ne contenant aucun des n points ` a l?int´ erieur. Montrer que le centre d?un tel cercle est soit un sommet de V or(S) soit l?intersection d?une ar? ete de V or(S) et d?un c? ot´ e de EC(S). En d´ eduire un algorithme en temps O(n log n) pour r´ esoudre ce probl` eme (algorithme d? u ` a G.T. Toussaint). Version 6 f´ evrier 2005 430 Chapitre 11. G´ eom´ etrie algorithmique Version 6 f´ evrier 2005 431 Chapitre 12 Planification de trajectoires Dans ce chapitre, nous ´ etudions un probl` eme de planification de trajectoires ap- pel´ e le probl` eme du d´ em´ enageur de piano . La premi` ere section explique la nature du probl` eme et donne les notations et d´ efinitions n´ ecessaires. Dans la deuxi` eme section, un algorithme pour le calcul du mouvement de translation d?un segment dans un environnement polygonal est pr´ esent´ e; cet algorithme est d? u ` a Schwartz et Sharir. Dans la derni` ere section, nous ´ etudions le d´ eplacement d?un disque dans un environnement polygonal et pr´ esentons un algorithme, d? u ` a ´ O?D´ unlaing et Yap, utilisant les diagrammes de Vorono¨ ? de segments. Introduction Le probl` eme du d´ em´ enageur de piano est un probl` eme fondamental de la robo- tique. On peut le formuler de la fa¸ con suivante : soit un piano (ou un robot) et des obstacles; ´ etant donn´ ees deux positions permises du piano, existe-t-il un mouve- ment de ce piano entre ces deux positions sans collision avec les obstacles, et si oui, donner un tel mouvement. Les ´ etudes faites sur ce sujet sont nombreuses et font appel ` a des outils math´ ematiques appartenant ` a des domaines vari´ es tels que la g´ eom´ etrie classique, la topologie, la g´ eom´ etrie alg´ ebrique, l?alg` ebre et la com- binatoire. Dans son aspect le plus g´ en´ eral, le robot n?est pas un corps rigide, mais est constitu´ e d?´ el´ ements poss` edant un certain nombre de degr´ es de libert´ e. Des solutions th´ eoriques existent mais qui ne sont pas efficaces. Une approche heuris- tique du probl` eme en intelligence artificielle a ´ et´ e faite, et a donn´ e lieu ` a des solutions qui sont impl´ ement´ ees et utilis´ ees. Nous nous int´ eresserons ici ` a l?aspect algorithmique du probl` eme, c?est-` a-dire ` a la recherche de solutions exactes. Nous avons limit´ e notre choix ` a la pr´ esentation de deux probl` emes de base clas- siques, qui font appel dans leur r´ esolution ` a l?algorithmique g´ eom´ etrique et plus Version 6 f´ evrier 2005 432 Chapitre 12. Planification de trajectoires g´ en´ eralement ` a divers outils algorithmiques d´ evelopp´ es dans cet ouvrage. Nous avons choisi deux approches diff´ erentes pour les deux probl` emes, ce qui permet d?avoir un aper¸ cu des diff´ erentes techniques utilis´ ees pour r´ esoudre ce genre de questions. Notations et d´ efinitions Le plan contient un certain nombre d?obstacles, et l?espace libre du plan, E, est constitu´ e des points ext´ erieurs aux obstacles. L?objet X ` a d´ eplacer est une partie de R2 de forme variable : polygone, disque, segment. . . Etant donn´ e un objet X , une position de X est l?image de X dans un d´ eplacement (appel´ e encore isom´ etrie directe ) du plan. Or tout d´ eplacement p du plan peut se caract´ eriser comme la compos´ ee d?une rotation d?origine O et d?angle de mesure ? ? [0, 2?[ et d?une translation. Un rep` ere orthonorm´ e ´ etant choisi, une po- sition de l?objet X , soit p(X ), o` u p est un d´ eplacement, sera d´ etermin´ ee par un triplet p = (x, y, ?) de R2 × [0, 2?[, o` u ? caract´ erise la rotation et (x, y) la translation. Il n?y a pas, en g´ en´ eral, bijection entre l?ensemble des positions d?un objet et l?ensemble des d´ eplacements du plan; plus pr´ ecis´ ement lorsque l?objet poss` ede certaines propri´ et´ es de sym´ etrie, plusieurs d´ eplacements correspondent ` a la m? eme position. Par exemple (figure 0.1), le segment X a la m? eme image par les d´ eplacements (x, y, 0) et (x , y , ?). ? t(x,y) t(x' ,y' ) Figure 0.1: La translation t(x, y) d´ efinit la m? eme position que la rotation d?angle plat suivie de t(x , y ). Il reste n´ eanmoins que la donn´ ee du d´ eplacement d´ etermine de mani` ere unique la position de l?objet, ce qui justifie cette repr´ esentation. Une position p(X ) est libre si p(X ) ? E, semi-libre si p(X ) touche un ou plusieurs obstacles i.e. n?a de points communs avec les obstacles que sur leur fronti` ere (fig.0.2). La figure 0.2 montre des positions diff´ erentes d?un objet qui est un segment, dont certaines sont libres, d?autres semi-libres, d?autres ni libres ni semi-libres. On Version 6 f´ evrier 2005 12.1. Translation d?un segment 433 1 2 3 4 5 p p p p p Figure 0.2: p1 est libre, p2 et p3 sont semi-libres, p4 et p5 ne le sont pas. notera L et SL l?ensemble des positions libres et semi-libres de X dans E. Gr? ace ` a la repr´ esentation de la position d?un objet par un d´ eplacement, on a : L, SL ? R2 × [0, 2?[ Notons que L et SL sont des ensembles d´ ependant ` a la fois de l?environnement E et de l?objet X . Etant donn´ ees deux positions p0 et p1 de X , on appelle mouvement de X de la position p0 vers la position p1 une application continue m : [0, 1] ?? R2 × [0, 2?[ telle que m(0) = p0 et m(1) = p1. Soient p0 et p1 deux positions libres. Le mouvement est libre (resp. semi-libre) si pour tout ? ? [0, 1], la position m(?) est une position libre (resp. semi-libre). Le mouvement m est un mouvement de translation s?il existe ? ? [0, 2?[ tel que pour tout ? ? [0, 1], m(?) ? R2 × {?}. Dans les cas particuliers auxquels nous allons nous int´ eresser, ces d´ efinitions g´ en´ erales vont se simplifier. 12.1 Translation d?un segment 12.1.1 Pr´ esentation du probl` eme Nous supposons ici que l?objet X est un segment de longueur l, les obstacles des polygones simples, et que les mouvements autoris´ es sont des mouvements de translation. L?ensemble des obstacles est constitu´ e d?un nombre fini de polygones simples d?int´ erieur non vide, d?intersection finie deux ` a deux (c?est-` a-dire pouvant se toucher mais non se chevaucher). Si les obstacles partagent des morceaux de fronti` ere de longueur non nulle, on peut toujours red´ efinir les obstacles (en les fusionnant) de mani` ere ` a ce que les hypoth` eses que nous faisons soient v´ erifi´ ees. Pour rendre le traitement des donn´ ees homog` ene, nous supposerons que le plan est limit´ e ` a un rectangle R suffisamment grand pour qu?il ne modifie pas la nature du probl` eme; pour cela il suffit que ses c? ot´ es soient par exemple ` a une distance strictement sup´ erieure ` a l de tous les sommets des polygones constituant Version 6 f´ evrier 2005 434 Chapitre 12. Planification de trajectoires les obstacles (l est la longueur du segment ` a d´ eplacer). Ainsi, R est ajout´ e ` a l?ensemble des obstacles mais la partie interdite est la r´ egion ext´ erieure ` a R. Dor´ enavant, l?espace libre E est l?ensemble des points int´ erieurs ` a R et ext´ erieurs aux autres obstacles (figure 0.2). Puisque l?objet est un segment et que nous limitons les d´ eplacements ` a des trans- lations, une position p de X est caract´ eris´ ee plus simplement encore par un triplet (x, y, ?) ? R2 × [0, ?[, o` u (x, y) repr´ esente le couple de coordonn´ ees de l?extr´ emit´ e P de p la plus basse, (et la plus ` a gauche si p est horizontal) Q ´ etant l?autre extr´ emit´ e, et ? est la mesure de l?angle ( ? ? PQ, i) (figure 1.1); par d´ efinition de P, il est clair que ? est strictement inf´ erieur ` a ? . P Q i ? p Figure 1.1: P et ? caract´ erisent p. On note alors L, SL, L?, SL? respectivement l?ensemble des positions libres, semi-libres, libres d?orientation ?, semi-libres d?orientation ? de X dans E. On a bien s? ur : L, SL ? R2 × [0, ?[ L?, SL? ? R2 × {?} On identifiera donc L? et SL? ` a des parties de R2 et m? eme plus pr´ ecis´ ement ` a des parties de E. Dans ce cadre restreint, un mouvement de la position p0 ` a la position p1 d?un segment X devient une application continue m : [0, 1] ?? R2 × {?} telle que m(0) = p0 et m(1) = p1. Le probl` eme que nous allons r´ esoudre se formule comme suit : Donn´ ees : L?ensemble S des segments constituant les c? ot´ es des obstacles, avec pour chaque segment la donn´ ee de son successeur et de son pr´ ed´ ecesseur dans le contour direct de l?obstacle auquel il appartient, et la longueur l du segment X . Questions : Pour une valeur donn´ ee ? ? [0, ?[ : (1) D´ eterminer si une position p d?orientation ? est libre, c?est-` a-dire appartient ` a l?ensemble L? (2) Etant donn´ ees deux positions libres p0 et p1, d´ eterminer s?il existe un mou- vement m de X de la position p0 ` a la position p1, et si oui en calculer un. 12.1.2 Pr´ esentation de l?algorithme Nous supposons pour l?instant et pour simplifier l?expos´ e de l?algorithme, que l?ensemble des sommets ne contient pas trois points distincts align´ es verticalement Version 6 f´ evrier 2005 12.1. Translation d?un segment 435 et que les obstacles sont disjoints, et verrons ensuite comment l?algorithme que nous fournissons s?´ etend au cas g´ en´ eral. Nous prenons pour l?instant ? = ?/2, nous verrons ensuite comment en d´ eduire le r´ esultat pour une valeur de ? quelconque. L?algorithme repose sur un principe de balayage du plan par une droite verticale. Donnons-en tout d?abord les grandes lignes : Soit S l?ensemble des sommets des obstacles. On fait passer par chaque sommet une droite verticale en ne conservant que les morceaux de droite contenus dans l?espace libre E. On d´ ecompose ainsi l?espace libre E en cellules trap´ ezo¨ ?dales (´ eventuellement d´ eg´ en´ er´ ees en triangles) dont les c? ot´ es parall` eles sont verticaux. Dans l?exemple de la figure 1.2, il y a trois obstacles (gris´ es) et le rectangle cl? oturant la sc` ene. L?espace libre E est form´ e des points int´ erieurs au rectan- gle et ext´ erieurs aux obstacles. Les polygones sont d´ elimit´ es par seize segments ´ etiquet´ es de a ` a o. La d´ ecomposition indiqu´ ee fournit quinze cellules trap´ ezo¨ ?dales num´ erot´ ees de 1 ` a 15. 1 2 3 4 5 6 7 8 9 10 11 12 13 b a c d e f g h i j k l n o 14 p m 15 Figure 1.2: Partitionnement de l?espace libre en cellules. Deux cellules sont voisines si elles partagent un segment de fronti` ere de longueur non nulle. Nous d´ efinissons ainsi un graphe G?/2 appel´ e graphe des cellules dont les sommets sont les cellules que l?on vient de d´ efinir, deux cellules ´ etant reli´ ees par une ar? ete si elles sont voisines. La figure 1.3 donne le graphe G?/2 associ´ e aux donn´ ees de la figure 1.2. 1 10 11 13 12 6 4 3 5 7 8 9 14 2 15 Figure 1.3: Le graphe G?/2 associ´ e ` a l?exemple de la figure pr´ ec´ edente. Version 6 f´ evrier 2005 436 Chapitre 12. Planification de trajectoires Le graphe G?/2 ainsi calcul´ e est ind´ ependant de la longueur l du segment X . Dans une deuxi` eme ´ etape, on ´ emonde chaque cellule C en retranchant une bande de hauteur l ` a sa partie sup´ erieure, on obtient ainsi une nouvelle collection de cellules C . La figure 1.4 montre que la cellule 8 de la figure 1.2 a disparu, les cellules 11 et 12 ne sont plus voisines, les cellules 7, 11, 12 sont devenues des triangles. 1 2 3 4 5 6 7 9 1011 12 13 a f g h i j k l n o 14 s p m 15 c b d e Figure 1.4: Emondage des cellules. Le graphe obtenu en mettant ` a jour les relations de voisinage du graphe G?/2 est not´ e G?/2(l) (figure 1.5). 1 10 11 13 12 4 3 5 7 9 14 2 15 6 Figure 1.5: Le graphe G?/2(l) obtenu apr` es ´ emondage. Nous d´ emontrerons qu?il existe un mouvement libre d?une position p0 ` a une posi- tion p1 si et seulement si les cellules contenant respectivement p0 et p1 sont dans la m? eme composante connexe du graphe G?/2(l). Ainsi, un probl` eme topologique se trouve ramen´ e ` a un probl` eme combinatoire simple. Nous donnons maintenant un certain nombre de r´ esultats qui justifieront la va- lidit´ e de l?algorithme utilis´ e. Ensuite, nous exposerons l?algorithme d´ etaill´ e ainsi que l?´ evaluation de sa complexit´ e. Nous commen¸ cons par donner la d´ efinition pr´ ecise de la d´ ecomposition en cellules, et du graphe G?/2(l), et prouvons que l?existence d?un mouvement de translation se ram` ene ` a l?existence d?une cha? ?ne dans ce graphe. Soit p ? L?/2 une position libre de X , (rappelons que la position p est repr´ esent´ ee par un point qui est son extr´ emit´ e inf´ erieure) et soit ? la droite verticale passant par p. En faisant glisser le segment X le long de ? ` a partir de p tout en restant dans L?/2 , X atteint deux positions extr´ emales pinf et psup qui sont des positions Version 6 f´ evrier 2005 12.1. Translation d?un segment 437 semi-libres. Plus pr´ ecis´ ement, la composante connexe du point p dans ? ? L est un intervalle ouvert ]pinf , psup[ tel que chaque position pinf et psup touche un ou deux segments de S. Si le point psup (resp. pinf ) appartient ` a un seul segment de S, on note ce segment Sup(p) (resp. Inf(p)). Sinon, psup (resp. pinf ) est un sommet commun ` a deux segments de S. Si ces deux segments sont d?un m? eme c? ot´ e (au sens large) par rapport ` a ?, on note Sup(p) (resp. Inf(p)) celui qui est le plus bas (resp. le plus haut); dans le cas contraire, on note Sup(p) (resp. Inf(p)) celui qui est ` a gauche de ?. La figure 1.6 indique comment est d´ etermin´ e Sup(p) en cas d?ambigu¨ ?t´ e, selon les cas de figure (l?int´ erieur des obstacles est en gris). Sup(p) Sup(p) p Sup(p) p p Sup(p) p Sup(p) p Figure 1.6: Choix du segment Sup(p) selon la position de p. Ainsi ` a chaque position libre p est associ´ e un couple (Inf(p), Sup(p)) de deux segments de S. Deux positions libres p et p sont ´ equivalentes si Inf(p) =Inf(p ) et Sup(p) =Sup (p ). Ainsi L?/2 (consid´ er´ e comme une partie de R2 ) est partitionn´ e en cellules qui sont les composantes connexes des classes de la relation d?´ equivalence que nous venons de d´ efinir. La figure 1.7 donne cette partition sur l?exemple utilis´ e avec, pour chaque cellule, le couple de segments (Sup,Inf) associ´ e. Les hachures pr´ ecisent ` a quelle cellule la fronti` ere appartient, la convention ´ etant que la fron- ti` ere appartient ` a la cellule du c? ot´ e hachur´ e. Lemme 1.1. Soit u le vecteur (0, l). Une cellule C est un trap` eze (d?(C), d+(C), g+(C), g?(C)) (´ eventuellement d´ eg´ en´ er´ e en triangle), dont les c? ot´ es parall` eles [d?(C), d+(C)] ` a droite et [g?(C), g+(C)] ` a gauche sont verticaux, et v´ erifient : ? (d?(C) ou tu(d+(C)) ? S) et (g?(C) ou tu(g+(C)) ? S) ? [g?(C), d?(C)] est une partie d?un segment de S, de m? eme pour tu([g+(C), d+(C)]) (g, d, ?, + sont mis respectivement pour gauche, droit, inf´ erieur, sup´ eri- eur). Preuve. Cela d´ ecoule imm´ ediatement de la d´ efinition d?une cellule . Notons que les cellules de L?/2 ne sont en g´ en´ eral ni ouvertes ni ferm´ ees. En effet ce sont exactement les cellules C d´ ecrites plus haut et qui constituent les sommets Version 6 f´ evrier 2005 438 Chapitre 12. Planification de trajectoires 1 2 3 4 5 6 7 9 1011 12 13 b a c d e f g h i j k l n o 14 p m 15 p (o, f) (o, b) (c, f) (o, e) (d, f) (o, m) (p, e) 9: 10: 11: 12: 13: 14: 15: (h, f) (p, k) (p, j) (l, j) (i, f) (o, j) (o, f) 1: 2: 3: 4: 5: 6: 7: Figure 1.7: Les cellules de L?/2. du graphe G?/2(l). Par d´ efinition, les c? ot´ es non verticaux n?appartiennent pas aux cellules car ils correspondent ` a des positions semi-libres, et en ce qui concerne les c? ot´ es verticaux cela varie selon que les points d?(C), d+(C), g+(C), g?(C) appar- tiennent ou non ` a S, et la r´ eponse se d´ eduit simplement selon les cas (la figure 1.8 donne un exemple). C p g (C) _ g (C) + d (C) + d (C) _ Figure 1.8: Une cellule. Deux cellules sont dites voisines si leurs fronti` eres partagent un segment de longueur non nulle. Notons que ce segment est n´ ecessairement vertical. Lemme 1.2. Si deux cellules sont voisines, il existe un intervalle ouvert (verti- cal) appartenant ` a leur fronti` ere commune et ` a L?/2 . Preuve. Cela d´ ecoule du fait que les c? ot´ es verticaux (extr´ emit´ es exclues) d?une cellule sont inclus dans L?/2 . Version 6 f´ evrier 2005 12.1. Translation d?un segment 439 Le graphe G?/2(l) est donc d´ efini ainsi : ses sommets sont les cellules pr´ ec´ edem- ment d´ efinies, et deux sommets sont adjacents si et seulement si les cellules corre- spondantes sont voisines. Le calcul direct de ce graphe est difficile, nous verrons qu?il est plus simple de calculer d?abord le graphe G?/2, puis d?en d´ eduire G?/2(l). La proposition suivante traduit la condition topologique d?existence d?un mouve- ment de translation en une propri´ et´ e combinatoire du graphe G?/2(l). Proposition 1.3. Soient p et p deux positions libres et C(p), C(p ) les cellules auxquelles elles appartiennent respectivement. Il existe un mouvement de trans- lation de p vers p si et seulement si C(p) et C(p ) appartiennent ` a la m? eme composante connexe du graphe G?/2(l). Preuve. La condition est suffisante. Soient p et p deux positions libres, et C(p) et C(p ) leurs cellules appartenant ` a la m? eme composante connexe de G?/2(l). On examine successivement trois cas. ? Supposons d?abord que C(p) = C(p ). Posons p = (x, y) et p = (x , y ). Le segment [p, p ] est contenu dans C(p). Alors l?application [0, 1] ? R2 qui ` a tout r´ eel ? de [0, 1] fait correspondre (x + ?(x ? x), y +?(y ?y)) est un mouvement libre de translation de X de la position p vers la position p . En effet cela provient du fait qu?un trap` eze est convexe et donc que le segment [p, p ] est tout entier contenu dans la cellule C(p) (ici, p et p sont consid´ er´ es en tant que points). On montre de m? eme que si p appartient ` a la fronti` ere de C(p) ou si p appartient ` a la fronti` ere de C(p ) alors la m? eme formule d´ efinit un mouvement libre de translation de p vers p . ? Supposons que C(p) et C(p ) sont des cellules voisines. Utilisant le lemme 1.2, soit t une position libre appartenant ` a la fronti` ere commune de C(p) et C(p ). Alors, gr? ace ` a l?´ etude des cas pr´ ec´ edents, il existe un mouvement libre de p vers t et un mouvement libre de t vers p . Il suffit de composer les deux mouvements pour obtenir le r´ esultat. ? Il reste ` a examiner le cas g´ en´ eral. Puisque les sommets de G?/2(l) correspon- dant ` a C(p) et C(p ) appartiennent ` a la m? eme composante connexe de G?/2(l), il existe dans G?/2(l) une cha? ?ne (C0 = C(p), C1, . . . , Ck = C(p )). Soit ti une posi- tion libre appartenant ` a la fronti` ere commune de Ci et Ci+1 pour i = 0, . . . , k ?1. Il existe des mouvements libres de p ` a t0, de ti ` a ti+1 pour i = 0, . . . , k ? 1 et de tk?1 ` a p , et il suffit de composer ces mouvements dans l?ordre pour obtenir un mouvement libre de translation de p vers p . Cela termine la preuve dans un sens. Version 6 f´ evrier 2005 440 Chapitre 12. Planification de trajectoires R´ eciproquement, supposons qu?il existe un mouvement libre m de X de la position p vers p . Soit ? la trajectoire du point le plus bas dans le mouvement m, cette trajectoire a pour extr´ emit´ es p et p . La trace des cellules sur ? d´ ecompose ? en courbes adjacentes dont la suite des extr´ emit´ es est not´ ee (p0 = p, p1, . . . , pk = p ), de telle sorte que dans le mouvement m, lorsque l?objet passe par la position pi, sa position change de cellule et passe ` a une cellule voisine. Ainsi la suite des cellules par lesquelles passe la position de l?objet dans le mouvement m forme une cha? ?ne de G?/2(l), et p et p sont dans la m? eme composante connexe. Nous sommes maintenant en mesure de d´ ecrire l?algorithme de pr´ etraitement, i.e. la construction des graphes G?/2 et G?/2(l) et de r´ esoudre le probl` eme pos´ e. 12.1.3 Pr´ etraitement des donn´ ees Construction du graphe des cellules G?/2 L?algorithme utilis´ e est un algorithme de balayage. On appelle ´ ev´ enement d?abs- cisse ?, que l?on note e(?), l?ensemble des segments de S ayant une extr´ emit´ e au moins d?abscisse ?. Gr? ace aux hypoth` eses faites (voir 12.1.1), chaque ´ ev´ enement contient au moins 2 et au plus 4 segments. Les ´ ev´ enements sont simples (2 ou 3 segments) (fig.1.9 (a)) ou doubles (4 segments) (figure 1.9 (b)). 2 3 4 (a) (b) Figure 1.9: Ev´ enements (a) simples ou (b) double. Un ´ ev´ enement simple e(?) est un d´ ebut, un milieu ou une fin selon que les seg- ments de e(?) sont ` a droite, de part et d?autre, ou ` a gauche de la droite d?´ equation x = ? (figure 1.10). Les ´ ev´ enements sont tri´ es par ordre croissant d?abscisse. Le plan est balay´ e de gauche ` a droite par une droite verticale ?. Dans une position donn´ ee de ?, on peut classer les segments de S en trois classes : un segment est trait´ e s?il est situ´ e ` a gauche au sens large de ?, et s?il a au moins un point strictement ` a gauche de ?, non trait´ e s?il est ` a droite strictement de ?, actif sinon (figure 1.11). Les notions analogues sont d´ efinies pour les cellules. Un ´ ev´ enement est trait´ e si son abscisse est inf´ erieure ou ´ egale ` a celle de ?. Au cours du balayage, trois structures de donn´ ees sont maintenues : Version 6 f´ evrier 2005 12.1. Translation d?un segment 441 débuts milieu fins Figure 1.10: D´ ebuts, milieu et fins. traités actifs non traités Figure 1.11: Segments trait´ es, actifs, non trait´ es. ? la liste L des ´ ev´ enements non trait´ es; ? la liste V des segments actifs tri´ ee par ordre croissant de l?ordonn´ ee du point d?intersection avec ?; ? le graphe partiel de G?/2 des cellules trait´ ees ou actives. Etant donn´ es deux segments cons´ ecutifs dans V (sans prendre en compte les segments verticaux), la r´ egion situ´ ee entre ces deux segments au voisinage droit de ? est soit int´ erieure ` a un obstacle, soit int´ erieure ` a une cellule C situ´ ee entre ces deux segments. Dans ce dernier cas, les deux sommets gauches de C, g?(C) et g+(C) ont d´ ej` a ´ et´ e calcul´ es lors d?une position ant´ erieure de ?, ainsi que les cellules voisines de C situ´ ees ` a gauche de C. Ces informations sont ajout´ ees respectivement dans la structure V et dans G?/2. Nous pr´ eciserons plus tard comment r´ ealiser l?impl´ ementation de ces structures. Lorsque la droite ? passe par la position verticale correspondant au c? ot´ e droit de la cellule c, ses deux extr´ emit´ es droites d?(c), d+(c) sont calcul´ ees, ainsi que les cellules voisines situ´ ees ` a droite de c, ainsi la cellule c est trait´ ee. L?algorithme ci-dessous calcule le graphe G?/2. Version 6 f´ evrier 2005 442 Chapitre 12. Planification de trajectoires proc´ edure Graphe-Des-Cellules(G?/2); (1) trier les ´ ev´ enements par abscisses croissantes : L = (e1, . . . , ep); (2) initialiser V et G?/2 ; (3) pour i de 1 ` a p faire (4) supprimer ei dans L et mettre ` a jour V et G?/2 finpour. Pr´ ecisons ce que sont l?initialisation et la mise ` a jour en fonction du type de l?´ ev´ enement consid´ er´ e : Initialisation de V : Soient p0 et p1 les segments horizontaux respectivement inf´ erieur et sup´ erieur du rectangle R et p0 et p1 leur extr´ emit´ e gauche. Alors G est initialis´ e avec un seul sommet C0 tel que g?(C0) = p0 et g+(C0) = p1, et V = (p0, p1). Mise ` a jour de V et G?/2 : Nous ´ etudions seulement les ´ ev´ enements simples, le cas des ´ ev´ enements doubles s?en d´ eduisant simplement. ? L?´ ev´ enement ei est une fin , il y a quatre types de fins not´ es f1, f2, f3, f4 (figure 1.12). ? de type f1 : On a ei = {s, s }. Soit s? le pr´ ed´ ecesseur de s et s+ le successeur de s dans L. Soient Ci la cellule situ´ ee entre s? et s, et Cj celle situ´ ee entre s et s+. On ach` eve le traitement de Ci en posant d?(Ci) = ??s?, d+(Ci) = P, et celui de Cj en posant d?(Cj) = P, d+(Cj) = ? ? s+. On ajoute au graphe G?/2 une nouvelle cellule Ck adjacente ` a Ci et Cj et on calcule g?(Ck) = d?(Ci), d+(Ck) = d+(Cj). Enfin, on supprime s et s dans L. ? de type f2 : On a ei = {s, s }. Le traitement de la cellule Ci est achev´ e en posant d?(Ci) = d+(Ci) = P. On supprime s et s dans L. ? de type f3 : On a ei = {s, t, s }. Soit s? le pr´ ed´ ecesseur de s et s+ le successeur de s dans L. Soient Ci la cellule situ´ ee entre s? et s, et Cj celle situ´ ee entre s et s+. On ach` eve le traitement de Ci en posant d?(Ci) = ? ? s?, d+(Ci) = P, et celui de Cj en posant d?(Cj) = Q, d+(Cj) = ? ? s+. On ajoute au graphe G?/2 une nouvelle cellule Ck adjacente ` a Ci et Cj et on calcule g?(Ck) = d?(Ci), d+(Ck) = d+(Cj). On supprime s, t et s dans L. On laisse le soin au lecteur de traiter le cas f4 qui est voisin du cas f2. ? L?´ ev´ enement ei est un milieu, il y a quatre types de milieux, not´ es m1, m2, m3, m4 (figure 1.13). ? de type m1 : Soit s+ le successeur de s dans L, et Ci la cellule situ´ ee entre s et s+. On remplace s par s dans L, et on termine le traitement de Ci par Version 6 f´ evrier 2005 12.1. Translation d?un segment 443 ? P Q s s' k C (f ) 4 ? P s s' i C 2 (f ) ? P Q s s' s' s_ k C i C j C 3 (f ) + ? P s s' s_ s' k C i C j C 1 (f ) + Figure 1.12: L?´ ev´ enement en cours est une fin. d?(Ci) = P, d+(Ci) = ? ? S+, enfin on cr´ ee une nouvelle cellule Cj adjacente ` a Ci en posant g?(Cj) = P, g+(Cj) = d+(Ci). On laisse au lecteur le soin d?examiner les autres cas m2, m3, m4 qui se traitent de mani` ere similaire. ? P s s' s_ 2 (m ) j C i C ? Q P s s' s_ (m ) 4 i C j C s' ? P s 1 (m ) i C j C s+ ? P Q s s' 3 (m ) j C i C s+ Figure 1.13: L?´ ev´ enement en cours est un milieu. ? L?´ ev´ enement ei est un d´ ebut, il y a quatre types de d´ ebuts, not´ es d1, d2, d3, d4 (figure 1.14). On laisse le soin au lecteur de traiter ce cas en s?inspirant de ce qui a ´ et´ e fait pr´ ec´ edemment et de la figure 1.14. En vue d?´ evaluer l?algorithme propos´ e, pr´ ecisons tout d?abord quelles structures de donn´ ees sont utilis´ ees pour impl´ ementer l?algorithme. Les op´ erations effectu´ ees sur la liste L justifient l?emploi d?une structure de tas. Les r´ egions sont num´ erot´ ees par ordre croissant d?apparition dans le balayage. Le graphe G?/2 est repr´ esent´ e par une liste d?adjacence, chaque cellule ´ etant repr´ esent´ ee par un enregistrement contenant ses quatre sommets. La liste V est g´ er´ ee par une structure d?arbre binaire ´ equilibr´ e (AVL par exemple), chaque n?ud repr´ esentant un segment s contient un pointeur sur son successeur s+ et son pr´ ed´ ecesseur s? ainsi que (dans Version 6 f´ evrier 2005 444 Chapitre 12. Planification de trajectoires ? P Q s s' (d ) 4 k C ? P s s' 2 (d ) i C ? P s s' s_ 1 (d ) j C i C k C s' + ? P Q s s' s_ 3 (d ) j C i C k C s' + Figure 1.14: L?´ ev´ enement en cours est un d´ ebut. le cas o` u il n?est pas vertical) un pointeur dans la liste d?adjacence de G?/2 vers la cellule incidente ` a s. Gr? ace ` a ce choix de structures de donn´ ees, on d´ eduit : Proposition 1.4. Si Card(S) = n, le calcul du graphe G?/2 par la proc´ edure Graphe-Des-Cellules(G?/2) s?effectue en temps O(n log n) et en espace O(n). Preuve. La ligne (1) prend un temps O(n log n), la ligne (2) un temps O(1). Dans la ligne (4), la mise ` a jour de V prend un temps O(log n) et celle de G?/2 un temps O(1). Le r´ esultat est donc d´ emontr´ e en ce qui concerne le temps. Quant ` a l?espace, le graphe G?/2 ´ etant planaire, l?espace utilis´ e est bien O(n) car chaque cellule contient au moins un sommet sur sa fronti` ere et chaque sommet appartient ` a la fronti` ere d?au plus trois cellules. Emondage des cellules - Calcul du graphe G?/2(l) Il reste ` a modifier le graphe G?/2 obtenu en fonction de la longueur du segment ` a d´ eplacer pour obtenir le graphe G?/2(l). Voici l?algorithme : proc´ edure Emondage; (1) pour chaque cellule C = (d?(C), d+(C), g+(C), g?(C)) faire (2) remplacer C par la cellule C obtenue en translatant [g+(C), d+(C)] d?une longueur l vers le bas; (3) si C est vide alors supprimer C dans G?/2 (4) sinon pour chaque cellule C adjacente ` a C faire (5) si C n?est pas voisin de C alors supprimer dans G?/2 l?arc (C, C ) finsi finsi finpour. Version 6 f´ evrier 2005 12.1. Translation d?un segment 445 Proposition 1.5. Si Card(S) = n, le calcul de G?/2(l) ` a partir de G?/2 s?effec- tue en temps O(n) par la proc´ edure Emondage . Preuve. Les lignes (2) et (3) s?ex´ ecutent en temps O(1) ainsi que la ligne (5) car chaque cellule, compte tenu des hypoth` eses faites (pas plus de 2 sommets align´ es verticalement) admet au plus six cellules voisines . Les lignes (2), (3) et (5) sont ex´ ecut´ ees O(n) fois, d?o` u le r´ esultat. Les algorithmes Graphe-Des-Cellules(G?/2) et Emondage constituent donc le pr´ etraitement des donn´ ees pour ? = ?/2. Pour calculer le graphe G? pour une valeur de ? quelconque on transforme au pr´ ealable l?enesemble S par une rotation d?angle de mesure ?/2 ? ? ce qui prend un temps O(n) et ne change donc pas la complexit´ e de l?algorithme. 12.1.4 R´ esolution du probl` eme de translation Revenons aux questions pos´ ees au d´ ebut de cette section, ` a savoir : (1) : D´ eterminer si une position p appartient ` a L?/2. Pour r´ esoudre ce probl` eme, remarquons que dans la liste d?adjacence du graphe G?/2(l), les cellules sont rang´ ees par ordre croissant d?abscisse du c? ot´ e gauche, et en cas d?´ egalit´ e par ordre croissant d?ordonn´ ee. Donc, en proc´ edant par di- chotomie, on d´ etermine en temps O(log n) si p appartient ` a une cellule du graphe G?/2(l) et donc ` a L?/2. (2) : Etant donn´ ees deux positions libres p0 et p1, d´ eterminer s?il existe un mou- vement m de X de la position p0 ` a la position p1, et si oui en calculer un. Ce deuxi` eme probl` eme se r´ esout comme suit. On calcule comme indiqu´ e ci-dessus les cellules C(p0) et C(p1) auxquelles p0 et p1 appartiennent respectivement. Il ne reste plus qu?` a calculer si C(p0) et C(p1) appartiennent ` a la m? eme composante connexe de G?/2(l) et ` a donner en cas de r´ eponse positive un mouvement possible ce qui se fait en temps O(n) (proposition 1.3). Il nous reste ` a d´ emontrer que le r´ esultat reste valable dans le cas g´ en´ eral c?est- ` a-dire sans restriction sur le nombre de sommets align´ es, ni sur les obstacles qui peuvent avoir un morceau de fronti` ere commune (leur intersection restant d?int´ erieur vide). Si les obstacles ne sont pas disjoints, les d´ efinitions de Inf(p), Sup(p) pour une position libre p s?adaptent sans probl` eme, il y a seulement plus de cas ` a traiter en gardant le m? eme principe. Par contre, le fait que le nombre possible de sommets align´ es soit quelconque n´ ecessite une adaptation des algorithmes, car un ´ ev´ enement peut contenir plus de quatre segments. Cela ne pose pas de probl` eme majeur pour l?algorithme : on traite les segments dans l?ordre croissant d?ordonn´ ee, simplement lors de la Version 6 f´ evrier 2005 446 Chapitre 12. Planification de trajectoires cr´ eation d?une cellule, le calcul de son sommet gauche sup´ erieur reste en attente un certain temps (figure 1.15). s s' g (C) g (C) C + - Figure 1.15: g+(C) est calcul´ e au cours de l?insertion de s . Quant ` a l?algorithme Emondage, il faut modifier l?impl´ ementation du graphe G?/2, si l?on veut conserver la m? eme complexit´ e en temps. En effet le nombre de cellules adjacentes ` a une cellule donn´ ee est maintenant O(n). Donc pour la mise ` a jour des relations d?adjacence la ligne (5) ne prend plus un temps O(1). On modifie l?impl´ ementation de la fa¸ con suivante : les listes de voisins sont des listes doublement cha? ?n´ ees, et pour chaque ar? ete (C, C ), on ´ etablit un pointage aller retour entre l?enregistrement de la cellule C dans la liste des voisins de C et l?enregistrement de la cellule C dans la liste des voisins de C . Ainsi, la boucle 4 prend un temps O(k) o` u k est le nombre de voisins de C. L?algorithme prend alors un temps O(m) o` u m est le nombre d?ar? etes du graphe, donc un temps O(n) puisque le graphe est planaire. Th´ eor` eme 1.6. Si Card(S) = n, le probl` eme de translation d?un segment se r´ esout par un pr´ etraitement en temps O(n log n) et en espace O(n); on d´ etermine en temps O(log n) si une position donn´ ee est libre, et en temps O(n) s?il existe un mouvement libre d?une position p0 ` a une position p1. 12.2 D´ eplacement d?un disque 12.2.1 Introduction Le cadre que nous nous fixons ici est le suivant : les obstacles sont des polygones simples non chevauchants, mais pouvant partager des sommets communs. L?objet ` a d´ eplacer est un disque de rayon r. Dans toute cette section n d´ esigne le nombre de c? ot´ es des obstacles. Etant donn´ ees les propri´ et´ es de sym´ etrie d?un disque, les d´ efinitions vues dans l?introduction se simplifient. Une position du Version 6 f´ evrier 2005 12.2. D´ eplacement d?un disque 447 Figure 2.1: Exemple d?obstacles. disque est simplement d´ efinie par la position de son centre, donc par un point. Et un mouvement du disque de la position p0 ? R2 ` a la position p1 ? R2 est une application continue m de [0, 1] dans R2 telle que m(0) = p0 et m(1) = p1. L?ensemble m[0, 1] est la trajectoire du disque. Le probl` eme de la planification de trajectoire d?un disque se formule ainsi : Etant donn´ e un ensemble S des segments constituant les c? ot´ es des obstacles, avec pour chaque segment la donn´ ee de son successeur et de son pr´ ed´ ecesseur dans le contour direct de l?obstacle auquel il appartient, et le rayon r du disque ` a d´ eplacer : (1) D´ eterminer si une position p ? R2 est libre. (2) Etant donn´ ees deux positions libres p0 et p1, d´ eterminer s?il existe un mou- vement m de X de la position p0 ` a la position p1, et si oui en calculer un. 12.2.2 R´ etraction ? Diagramme de Vorono¨ ? On suppose comme dans 12.1 que l?espace libre E est ` a l?int´ erieur d?un rectangle. L?espace E est un ouvert du plan, et sa fronti` ere F(E) est constitu´ ee de lignes polygonales. On divise chaque segment constituant un c? ot´ e de F(E) en trois ´ el´ ements disjoints : ses extr´ emit´ es et l?intervalle ouvert restant. Soit S l?ensemble de ces ´ el´ ements constitu´ e de points et d?intervalles ouverts deux ` a deux disjoints. On notera V or (S) le diagramme de Vorono¨ ? ext´ erieur de S i.e. la restriction de V or(S) ` a l?espace libre E et ` a sa fronti` ere F(E). Conform´ ement aux r´ esultats vus dans la section 11.4, V or(S) est un graphe planaire qui partitionne le plan en r´ egions R(s) pour s ? S (les r´ egions sont ferm´ ees, il s?agit donc d?un partitionnement au sens o` u deux r´ egions ne se chevau- chent pas). Par ailleurs, pour s ? S, R(s) jouit des propri´ et´ es suivantes : ? R(s) est hom´ eomorphe ` a un disque ferm´ e (´ eventuellement de rayon nul ou infini). Version 6 f´ evrier 2005 448 Chapitre 12. Planification de trajectoires ? La fronti` ere de R(s) est constitu´ ee de segments de droite et d?arcs de parabole. ? R(s) est ´ etoil´ ee relativement ` a s. ? Si s est un point alors s appartient ` a la fronti` ere de R(s) (cela est d? u au fait qu?il existe dans S un intervalle d?extr´ emit´ e s). ? Si s est un intervalle, alors s est contenu dans l?int´ erieur de R(s), et la fronti` ere de R(s) passe par les extr´ emit´ es de s (figure 2.2). s R(s) s R' (s) Figure 2.2: Une r´ egion R(s), et la r´ egion R (s) associ´ ee (en gras). Il s?ensuit que V or (S) partitionne l?espace ¯ E = E ? F(E) en r´ egions R (s) = R(s) ? E pour s ? S qui v´ erifient des propri´ et´ es d´ eduites de celles de R(s) : ? R (s) est hom´ eomorphe ` a un disque ferm´ e (´ eventuellement de rayon nul). ? La fronti` ere de R (s) est constitu´ ee de segments de droite et d?arcs de para- bole. ? R (s) est ´ etoil´ ee relativement ` a s. ? Si s est un point alors s appartient ` a la fronti` ere de R (s). ? Si s est un intervalle, alors s est contenu dans la fronti` ere de R (s) ainsi que ses extr´ emit´ es. Amplitude et voisins d?un point de E Pour tout point p ? E on d´ efinit l?amplitude de p, que l?on note ?(p), comme ´ etant la distance de p au compl´ ement de E dans le plan. Comme E est ouvert, cette distance est atteinte , ou encore il existe au moins un point q ? E tel que ?(p) = d(p, q). Naturellement, q est sur la fronti` ere de E c?est-` a-dire appartient ` a l?un des c? ot´ es des obstacles. En fait, ?(p) repr´ esente tout simplement la valeur maximale du rayon d?un disque ouvert de centre p contenu dans E. On a donc : L = {p ? E | ?(p) > r} Notons que l?ensemble des points q ? E tels que ?(p) = d(p, q) est fini puisque c?est l?ensemble des points d?intersection d?un cercle avec un nombre fini de segments. Ce sont les points du compl´ ementaire de E les plus pr` es de p, on les appellera voisins de p. On notera voisins(p) cet ensemble : voisins(p) = {q ? E | ?(p) = d(p, q)} Version 6 f´ evrier 2005 12.2. D´ eplacement d?un disque 449 Avec ces notations, il est clair qu?un point p appartient ` a V or(S) si et seulement si voisins(p) poss` ede plus d?un point. V or(S) = {p | Card(voisins(p)) ? 2} R´ etraction de E sur V or (S) On d´ efinit une application ? : E ?? V or (S) appel´ ee r´ etraction, de la fa¸ con suivante : Soit p un point de E, et q un point de voisins(p). Si q est le seul voisin de p, alors q est soit un point ´ el´ ement de S, soit un point d?un intervalle s de S, et dans les deux cas, p est int´ erieur ` a une r´ egion R (s), avec s ? S et d(p, s) = d(p, q) = ?(p). Comme R (s) est ´ etoil´ ee, d?int´ erieur non vide puisqu?il contient p, hom´ eomorphe ` a un disque, on en d´ eduit que la demi-droite [q, ? ? qp( coupe la fronti` ere de R (s) en un point unique t ? V or (S); on pose alors ?(p) = t. Si voisins(p) admet plusieurs points, alors p appartient ` a V or (S) et les demi- droites [q, ? ? qp( d´ efinies pr´ ec´ edemment d´ efinissent toutes le m? eme point t ` a savoir pr´ ecis´ ement le point p lui-m? eme. Donc, la d´ efinition de ? donn´ ee dans le cas o` u voisins(p) n?a qu?un point reste consistante dans les autres cas et implique que ? est l?identit´ e pour les points de E qui sont sur V or (S). Proposition 2.1. a) La r´ etraction ? est une application continue de E sur V or (S) ? E. b) Si ?(p) = p alors la fonction ? est strictement croissante sur le segment allant de p ` a ?(p). Preuve. a) L?application ? est clairement continue en tout point de E ? V or (S). Si p ? V or (S) alors p appartient ` a la fronti` ere de plusieurs r´ egions R(s1), . . ., R(sk), et pour toute suite de points pi tendant vers p et restant dans Rsj , la suite ?(pi) tend vers ?(p) = p. Donc pour toute suite de points pi tendant vers p, ?(pi) tend vers ?(p). b) Si ?(p) = p alors p appartient ` a l?int´ erieur d?une r´ egion R (s) et pour tout point p ?]p, ?(p)] on a : ?(p) = d(p, s) = d(q, p) < d(q, p ) = d(s, p ) = ?(p ) Corollaire 2.2. Si p ? L alors il existe un mouvement libre (rectiligne) du disque de la position p vers la position ?(p). Preuve. C?est une cons´ equence imm´ ediate de la partie b) de la proposition. Version 6 f´ evrier 2005 450 Chapitre 12. Planification de trajectoires Proposition 2.3. Il existe un mouvement libre du disque de la position p0 ? L vers la position p1 ? PL si et seulement s?il existe un mouvement libre du disque de la position ?(p0) vers la position ?(p1) dans V or (S) ? L. Preuve. La condition est suffisante : Par le corollaire 2.2, il existe un mouvement libre de p0 vers ?(p0) et un mouvement libre de ?(p1) vers p1, donc en composant les trois mouvements on obtient le r´ esultat. R´ eciproquement, soit µ un mouvement libre de p0 vers p1, et C = µ[0, 1]. Alors, par la Proposition 2.1, ?(C) ? V or (S) ? L et le compos´ e ? ? µ est un mouvement libre du disque de la position ?(p0) vers la position ?(p1) dans V or (S) ? L. On peut dire que ? ? µ est le r´ etract´ e sur V or (S) du mouvement µ, comme on le voit sur la figure 2.5. 12.2.3 Expos´ e de l?algorithme Question Q1 Pour savoir si une position p est libre pour le disque donn´ e, c?est-` a-dire si le disque, centr´ e au point p, est enti` erement contenu dans l?espace libre E, il existe une m´ ethode na¨ ?ve qui r´ esout le probl` eme en temps O(n). Il suffit pour cela de calculer ?(p) en calculant la distance de p ` a chaque ´ el´ ement de S. Cela permet, en consid´ erant un point q appartenant ` a la fronti` ere de E et qui r´ ealise d(p, q) = ?(p), et en comparant la position du segment [p, q] aux c? ot´ es des obstacles passant par q, de tester si p ? E. Puis la comparaison de ?(p) avec le rayon r du disque d´ etermine si p est une position libre. Nous allons voir qu?un pr´ etraitement en temps O(n log n) permet de r´ esoudre la question en temps O(log n). Pr´ etraitement Le graphe V or(S) partitionne le plan en r´ egions dont les c? ot´ es sont des segments ou des arcs de parabole. On peut appliquer l?algorithme vu en 11.3.3, moyennant les modifications suivantes : On d´ etermine pour chaque arc de parabole ses points extr´ emaux (horizontalement parlant, c?est-` a-dire ceux d?ordonn´ ee extr´ emale), et on scinde l?arc en deux si ses points extr´ emaux ne co¨ ?ncident pas avec ses extr´ emit´ es (figure 2.3). Cette modification se fait en temps O(n). Elle est n´ ecessaire pour que la deuxi` eme recherche dichotomique dans une bande verticale soit possible, et il faut pour cela qu?` a l?int´ erieur de chaque bande, les traces des r´ egions puissent ? etre ordonn´ ees verticalement. Version 6 f´ evrier 2005 12.2. D´ eplacement d?un disque 451 Figure 2.3: Scission d?un arc de parabole. Ainsi utilisant les r´ esultats des chapitres pr´ ec´ edents, on en d´ eduit le pr´ etraitement suivant en temps O(n log n) et en espace O(n) : proc´ edure Pr´ etraitement (Q1); (1) pour chaque point q ? S faire ´ etablir une liste circulaire des c? ot´ es des obstacles incidents ` a q relativement ` a l?ordre polaire relatif ` a q finpour; (2) calculer V or(S); (3) scinder les arcs de parabole de V or(S) si n´ ecessaire; (4) calculer l?arbre persistant A de la subdivision planaire associ´ ee. Traitement de (Q1) Pour tester si p est une position libre, on peut alors appliquer l?algorithme de la section 11.3.3 qui d´ etermine en temps O(log n) ` a quelle r´ egion de Vorono¨ ? R(s) le point p appartient. Il reste ` a d´ eterminer si cette position est libre. Or la position de p relativement ` a s d´ etermine si p ? E en temps O(1) si s est un intervalle, et en temps O(log n) gr? ace ` a la ligne (1) du pr´ etraitement si s est un point. En effet, chaque intervalle s a une orientation li´ ee au contour direct du polygone auquel il appartient; on d´ etermine donc en temps constant si p est ` a gauche ou ` a droite de l?intervalle orient´ e, ce qui permet d?en d´ eduire s?il est dans E ou non. Par contre, si s est un point, le nombre d?obstacles incidents ` a s est O(n) et d´ eterminer si p est dans E se calcule en temps O(log n). proc´ edure Position-libre(p); (1) d´ eterminer s tel que p ? R(s); (2) d´ eterminer selon la nature de s (point ou intervalle) et la place de p relativement ` a s si p ? E ; (3) l := ?(p); (4) si l > r alors p ? L sinon p ? L. D?o` u le r´ esultat : Version 6 f´ evrier 2005 452 Chapitre 12. Planification de trajectoires Th´ eor` eme 2.4. Etant donn´ e un espace libre polygonal born´ e ` a n sommets et un disque de rayon donn´ e, un pr´ etraitement (ind´ ependant du disque) en temps O(n log n) et en espace O(log n) permet de d´ eterminer en temps O(log n) si une position donn´ ee du disque est une position libre. Question Q2 Etant donn´ ees deux positions libres p0 et p1, il s?agit de d´ eterminer s?il existe un mouvement m de X de la position p0 ` a la position p1, et si oui d?en calculer un. On utilise pour ce faire les r´ esultats obtenus en 12.2.2. Conform´ ement ` a la propo- sition 2.3, il suffit de d´ eterminer s?il existe un mouvement libre du disque de la position ?(p0) vers la position ?(p1) dans V or (S) ? L. Pour r´ esoudre ce probl` eme efficacement, il suffit d?ajouter dans le graphe V or (S) une informa- tion suppl´ ementaire relative ` a chaque ar? ete. Soit e une ar? ete de V or (S). Rappelons que cette ar? ete est un segment ou un arc de parabole. On d´ efinit sa largeur ?(e) comme ´ etant max{?(p) | p ? e}. Or pour chaque ar? ete e, il existe deux ´ el´ ements s et s de S tels que pour tout point p de e on ait : ?(p) = d(p, s) = d(p, s ) On peut donc calculer en temps O(1) le nombre ?(e). La figure 2.4 donne un exemple. s s' e s s' e ?(e) ?(e) Figure 2.4: ?(e) lorsque e est un arc de parabole. Ce pr´ etraitement ´ etant r´ ealis´ e, la r´ esolution du probl` eme devient : soient e0 et e1 les ar? etes respectives auxquelles ?(e0) et ?(e1) appartiennent. Si e0 = e1, on d´ etermine en temps constant si le mouvement de ?(p0) vers ?(p1) le long de e0 est libre. Sinon ?(p0) scinde l?ar? ete e0 en deux nouvelles ar? etes e0 et e0 (l?une pouvant ? etre de longueur nulle) dont on calcule la largeur, de m? eme pour ?(p1). On doit scinder les ar? etes e0 et e1, car il se peut que l?on ait ?(e0) < r et que n´ eanmoins l?une des deux ar? etes e0 ou e0, par exemple e0, ait une largeur > r, auquel cas le disque peut se d´ eplacer ` a partir de la position ?(p0) le long de l?ar? ete e0 dans un sens (` a savoir sur e0), mais pas dans l?autre (c?est-` a-dire sur e0). Il reste ` a chercher dans le graphe V or (S) ainsi transform´ e s?il existe un chemin de ?(p0) vers ?(p1) empruntant uniquement des ar? etes f tels que ?(f) > r. Cette recherche se fait en temps O(n). Version 6 f´ evrier 2005 12.2. D´ eplacement d?un disque 453 Pr´ etraitement proc´ edure Pr´ etraitement (Q2); (1) calculer le diagramme de Vorono¨ ? V or(S); (2) construire le sous-graphe V or (S) de V or(S) obtenu en supprimant les ar? etes de V or(S) int´ erieures aux obstacles (3) pour chaque ar? ete e ? V or (S) calculer ?(e). Complexit´ e du pr´ etraitement ? L?´ etape (1) prend un temps O(n log n) (th´ eor` eme 4.11 du chapitre 11); ? Chaque ar? ete e de V or(S) est (aux extr´ emit´ es pr` es) contenue dans un obstacle ou dans l?espace libre E, et on en d´ ecide en temps constant en examinant sa situation par rapport aux deux ´ el´ ements s et s tels que e est une ar? ete de la fronti` ere entre les deux r´ egions R(s) et R(s ). Ainsi l?´ etape (2) prend un temps O(n); ? L?´ etape (3), comme on l?a vu, se r´ ealise en temps O(n). Traitement de (Q2) proc´ edure Mouvement libre Disque(p0, p1); (1) p0 := ?(p0); p1 := ?(p1); {Calcul des r´ etract´ es} (2) soient e0 et e1 les ar? etes respectives de V or (S) auxquels p0 et p1 appartiennent; (3) pour i = 0, 1 faire remplacer dans V or (S), l?ar? ete ei par les deux ar? etes ei et ei obtenues par scission de ei par pi et calculer leur largeur; finpour (4) chercher un chemin de p0 ` a p1 dans le nouveau graphe utilisant uniquement des ar? etes de largeur > r joignant p0 ` a p1. Exemple. La figure 2.5 donne un exemple de r´ esolution du probl` eme. Le mouvement du disque calcul´ e par l?algorithme se d´ ecompose donc en trois mouvements : le premier, qui est rectiligne, am` ene le disque de la position p0 ` a la position r´ etract´ ee ?(p0) qui est sur une ar? ete de Vorono¨ ?; le deuxi` eme mouvement fait glisser le centre du disque le long d?un chemin form´ e d?ar? etes de Vorono¨ ? (qui guident le mouvement) vers la position r´ etract´ ee ?(p1) de la position p1 ; puis le disque quitte le diagramme de Vorono¨ ? et, par un mouvement rectiligne arrive en position p1. Version 6 f´ evrier 2005 454 Chapitre 12. Planification de trajectoires (p ) 0 1 ? 0 p p ? (p ) 1 Figure 2.5: Un exemple de mouvement utilisant cet algorithme. Th´ eor` eme 2.5. Etant donn´ e un espace libre polygonal born´ e ` a n sommets, un disque de rayon donn´ e, et deux positions libres p0 et p1 de ce disque, un pr´ etraitement (ind´ ependant du disque) en temps O(n log n) et en espace O(n) permet de d´ eterminer en temps O(n) un mouvement libre de ce disque, s?il existe, de la position p0 vers la position p1. Preuve. ? On d´ etermine en temps O(log n) ` a quelle r´ egion R(si) chaque position pi appartient. Comme R(si) est ´ etoil´ ee relativement ` a si, il s?ensuit que les extr´ emit´ es des ar? etes de la fronti` ere de R(si) dans un parcours positif constituent le circuit polaire de ces points relativement ` a un point quelconque de si, et donc on peut d´ eterminer en temps O(log m) l?image ?(pi) o` u m est le nombre d?ar? etes de la fronti` ere de R(si). Ainsi (1) prend un temps O(log n). ? (3) prend un temps O(n), de m? eme que (4). Version 6 f´ evrier 2005 Notes 455 12.2.4 Remarques Il existe une autre approche, tr` es naturelle, de ce probl` eme et analogue ` a celle que nous avons d´ evelopp´ ee pour le d´ eplacement d?un segment en translation, qui consiste, d?une certaine mani` ere ` a chercher des d´ eplacements qui longent les obstacles. Ces d´ eplacements sont semi-libres et constituent les positions limites des d´ eplacements libres. On peut comme dans 12.1.2 diviser l?espace libre en cellules qu?on ´ emonde ensuite en fonction du rayon du disque, ce qui donne lieu ` a une division de l?ensemble des positions libres en composantes connexes. Un mouvement libre est possible d?un position ` a une autre si ces deux positions appartiennent ` a la m? eme composante connexe (figure 2.6). C C 1 2 Figure 2.6: Composantes connexes des d´ eplacements libres. L?approche qui est expos´ ee ici est en quelque sorte la strat´ egie oppos´ ee, ` a savoir que l?on cherche des d´ eplacements le plus loin possible des obstacles puisqu?on d´ eplace essentiellement le disque sur le diagramme de Vorono¨ ? des obstacles. Cette approche pr´ esente un avantage par rapport ` a l?autre : le pr´ etraitement est ind´ ependant de la taille du disque ` a d´ eplacer, ce qui n?est pas le cas dans l?autre m´ ethode o` u l?´ emondage est fonction du disque choisi. Par ailleurs l?algorithme peut s?´ etendre ` a des objets convexes de forme polygonale si l?on se restreint ` a des mouvements de translation, ainsi qu?` a des objets r´ eduits ` a un segment pour des mouvements quelconques. Il faut signaler par contre aussi les inconv´ enients de cette m´ ethode. Pour les raisons que nous avons ´ evoqu´ ees plus haut, elle est loin de fournir le plus court d´ eplacement, comme le montre l?exemple de la figure 2.7 : si l?on consid` ere deux positions tr` es proches et tr` es pr` es d?un des c? ot´ es de l?espace libre constitu´ e d?un rectangle simple, l?algorithme fournit un d´ eplacement passant par le centre du rectangle et donc tr` es loin du plus court chemin. Notes L?´ etude du probl` eme de planification de trajectoires sous son aspect algorithmique est tr` es r´ ecente puisque tous les travaux r´ ealis´ es sur ce sujet datent de moins de Version 6 f´ evrier 2005 456 Chapitre 12. Planification de trajectoires p p 0 1 Figure 2.7: Un mauvais d´ eplacement . dix ans. Il existe plusieurs approches qui font appel ` a des domaines vari´ es des math´ ematiques allant de la g´ eom´ etrie traditionnelle ` a la g´ eom´ etrie alg´ ebrique en passant par la topologie, l?alg` ebre et la combinatoire. La th´ eorie des ensembles semi-alg´ ebriques est une premi` ere approche qui per- met de r´ esoudre le probl` eme sous des hypoth` eses tr` es g´ en´ erales, mais dont la complexit´ e exponentielle est un inconv´ enient majeur d?un point de vue algorith- mique; c?est pourquoi nous n?en avons pas parl´ e ici. N´ eanmoins ces travaux dus en particulier ` a J. Canny sont tr` es int´ eressants d?un point de vue th´ eorique et permettent de mieux cerner la nature et les difficult´ es du probl` eme. Les exemples que nous avons trait´ es illustrent deux autres m´ ethodes. L?algorithme de d´ eplacement d?un segment par translation dans un environ- nement polygonal d? u ` a D. Leven et M. Shamir : D. Leven et M. Shamir, An Efficient and Simple Motion Planning Algorithm for a Ladder Amiddst Polygonal Barriers, J. Algorithms 8 (1987), 192?215 correspond ` a une m´ ethode de projection qui est utilis´ ee dans un cadre plus g´ en´ eral que celui que l?on s?est fix´ e, en particulier pour des objets de forme polygonale quelconque dans le plan. L?algorithme de d´ eplacement d?un disque dans un environnement polygonal d? u ` a C. ´ O?Dunlaing et C. Yap : C. ´ O?Dunlaing, C. Yap, A ?retraction? method for planning the motion of a disk, J. Algorithms 6 (1985), 104?111 est obtenu par un principe de r´ etraction. Cette approche a ´ et´ e ´ etendue au cas d?un segment, et ` a la translation d?un polygone convexe. Les r´ ef´ erences ` a ces travaux se trouvent dans : J.T. Schwartz et M. Shamir, Algorithmic Motion Planning in Robotics, Handbook of Theoretical Computer Science Vol. A, Elsevier, (1990), 391?430. Version 6 f´ evrier 2005 Index 457 Index A?, algorithme, 229 a?b, arbre, 160 acc` es s´ equentiel, 131 accessibilit´ e, 80 accessible sommet, 80 accessible, ´ etat, 297 Ackermann, fonction d?, 64, 216 adaptatif, tri, 206 adjacent sommet, 74 affectation, probl` eme d, 246 Aho et Corasick, algorithme de, 367 amorti, co? ut, 6, 169 amplitude d?un point, 448 anc? etre, 94 angle, 380 convexe, r´ eflexe, plat, 380 angulaire, secteur, 384 appel terminal, 122 approximant, 212 arborescence, 93 des chemins minimaux, 221 ordonn´ ee, 55, 94, 147 arbre, 90 a?b, 160 ` a liaisons par niveau, 183 AVL, 152 balis´ e, 148, 159 base, 250 bicolore, 173 binaire, 51, 95 complet, 95 de recherche, 53, 147 binomial, 206 couvrant, 212 de d´ ecision, 9 ´ evas´ e, 204 de Fibonacci, 153 filet´ e, 70 fraternel, 204 parfait, 56 persistant, 187 ` a pointeur, 204 positionn´ e, 95 complet, 95 relativement ´ equilibr´ e, 209 tournoi, 57 arc, 74 arri` ere, 108, 241 avant, 108, 241 bloqu´ e, 250 candidat, 223 entrant, 240 de liaison, 107 libre, 250 de parabole, 413 de retour, 245, 252 sortant, 240 transverse, 108 Arden, lemme d?, 306 ar? ete, 74 de Vorono¨ ?, 409 ascendant, 76, 93 propre, 77 asynchrone, automate, 302 automate, 295 asynchrone, 302 d´ eterministe, 297 minimal, 313 quotient, 316 balayage ligne de, 413 plan de, 413 balise, 148 Bellman, algorithme de, 226 Version 6 f´ evrier 2005 458 Index Bernoulli, nombres de, 18 bicolore, arbre, 173 binomial, arbre, 206 biparti, graphe, 74 bon pr´ efixe, fonction du, 364 bon suffixe, fonction du, 363 bord, 341, 344 disjoint, 347, 362 bordure, 74, 106, 229 boucle, 74 Boyer, Moore algorithme de, 363 automate de, 376 bulle, tri par, 140 calcul, 295 ´ etiquette, 295 r´ eussi, 295 capacit´ e d?un arc, 241 cellule, 435 cercle de Delaunay, 411 cha? ?ne ´ el´ ementaire, 77 cha? ?ne, 77 cha? ?ne ´ el´ ementaire, 241 cha? ?ne am´ eliorante, 253 champs, tri par, 142 chemin, 76 admissible, 257 am´ eliorant, 254 de co? ut minimum, 220 ´ el´ ementaire, 77 extrait, 78 int´ erieur d?un, 80 simple, 77 chemins minimaux, arborescence des, 221 circuit, 77 absorbant, 83 ´ el´ ementaire, 77 graphe sans, 78 polaire, 383 cl´ e, 51 coaccessible, ´ etat, 297 cocycle, 74 candidat, 212 cocycles, r` egle des, 214 complet arbre binaire, 95 arbre positionn´ e, 95 automate, 298 compl´ etion, 97 composante connexe, 77 fortement connexe, 89 compression des chemins, 63 concat´ enation d?arbres, 167 produit de, 294 c? one enveloppant, 387 connexe composante, 77 graphe, 77 consistance, condition de, 242 contour, 381 convexe angle, 380 enveloppe, 386 coupe, 255 couplage, 290 couple invers´ e, 123 co? ut amorti, 6, 169, 201 d?un chemin, 220 dans le pire des cas, 4 moyen, 4, 275 r´ eduit, 274 unitaire, 249 cycle, 77 am´ eliorant, 249 augmentant, 249 candidat, 212 ´ el´ ementaire, 77, 241 cycles, r` egle des, 214 d´ eviation, 276 d´ ecomposition d?un flot, 246 d´ eficit, 285 Delaunay cercle, 411 disque, 411 triangulation, 411 descendant, 76, 93 d´ eterministe, automate, 297 Version 6 f´ evrier 2005 Index 459 diagramme de Vorono¨ ?, 408 dictionnaire, 52 Dijkstra algorithme de, 226 disque de Delaunay, 411 distance estim´ ee, 257 algorithme, 257 dominance, 77 double rotation, 151 ´ ecarts compl´ ementaires, th´ eor` eme des, 274 ´ eclatement, n?ud, 162 effeuillage, 97 ´ emond´ e automate, 297 enveloppe convexe, 386 inf´ erieure, sup´ erieure, 395 ´ equilibre condition d?, 241 ´ equivalence de Nerode, 315 espace libre, 432 etalors, 3 ´ etat accessible, coaccessible, 297 initial, final, 295 ´ etats s´ eparables, 315 ´ etiquette d?un calcul, d?une fl` eche, 295 ´ etoile, 294 Euclide, algorithme d?, 23 ´ evaluation par d´ efaut, 229 ´ ev´ enement, 415, 440, 442 exc` es, 240 ´ echelonn´ es, algorithme des, 270 expression rationnelle, 304, 308 extension lin´ eaire, 79 feuille, 93 FIFO, 42 file, 39, 42 bilat` ere, 39 de priorit´ e, 56 fils, 93 flot, 241 canonique, 246 compatible, 241 d´ ecomposition d?un, 246 dual-r´ ealisable, 282 maximum, 245, 251 primal-r´ ealisable, 282 flux, 242 entrant, 242 sortant, 242 fonction du bon pr´ efixe, 364 du bon suffixe, 363 caract´ eristique, 240 d?offre et de demande, 244 de transition, 298 de suppl´ eance, 342 Ford et Fulkerson, algorithme de, 255 Ford et Fulkerson, th´ eor` eme de, 255 Fortune, algorithme de, 411 fraternel,arbre, 204 front parabolique, 413 fusion tri, 128 fusion ´ el´ ementaire, 134 fusion, n?ud, 164 graphe biparti, 74 des cellules, 435 connexe, 77 d?admissibilit´ e, 257 d?inadmissibilit´ e, 277 ´ ecart, 253 non orient´ e, 74 orient´ e, 74 parcours, 97 quotient, 89 r´ eduit, 89 sans circuit, 78 support, 246 harmoniques, nombres, 18 hauteur d?un sommet, 94 Hopcroft, algorithme de, 319 Horspool, algorithme de, 358 incompatibilit´ e, 243 ins´ eparables, ´ etats , 315 insertion dans un arbre a?b, 161 bicolore, 177 Version 6 f´ evrier 2005 460 Index binaire de recherche, 149 tri par insertion, 40, 142 insertion, tri par, 142 interclassement, 128 K¨ onig, lemme de, 78 Knuth, Morris, Pratt, algorithme de, 346 Kruskal, algorithme de, 215 langage rationnel, 304 langage reconnaissable, 295 lettre, 294 ligne polygonale, 381 ferm´ ee, simple, 381 liste cha? ?n´ ee, 42, 46 circulaire, 46 concat´ enable, 146 des successeurs, 76 des voisins, 76 doublement cha? ?n´ ee, 46 lin´ eaire, 39, 44 topologique, 78 tri´ ee, 122 liste gauche (droite), 122 longueur d?un mot, 294 longueur d?un chemin, 76 m´ edian, 186 matrice d?adjacence, 75 d?incidence, 76 totalementunimodulaire, 76 minimal, automate, 313 monotonie, 132 fant? ome, 134 r´ epartition, 134, 136 Moore, construction de, 318 mot, 294 mouvement libre, semi-libre, 433 Nerode ´ equivalence de, 315 n?ud, 94 O, notation, 14 obstacle, 432 ?, notation, 16 -optimalit´ e, 275 ordre polaire, 382 oualors, 3 pagode, 70 Paps, algorithme, 232 parabolique, front, 413 parcours, 97 en largeur, 104 en profondeur, 102, 107 partage, n?ud, 164 partiel, graphe, 74 partition admissible, 322 scinder une, 319 p` ere, 93, 254 persistant, arbre, 187 pile, 39, 40 pilier, 396 pivot, 122 plan de transport, 245, 285 point d?attache, 109 d?entr´ ee, 109 polaire circuit, 383 ordre, 382 poly` edre, 244 polygonale, ligne, 381 polygone, 381 simple, 381 polyn? ome caract´ eristique, 20 exponentiel, 21 polynomial fortement, 279 pont, 396 position libre, semi-libre, 432 potentiel, 8, 200 pr´ e-arborescence des chemins minimaux, 222 pr´ ed´ ecesseur, 74, 380 pr´ ec´ edence circulaire convexe, 383 pr´ efixe, 294 pr´ eflot, 252, 264 algorithme du, 263 Version 6 f´ evrier 2005 Index 461 Prim, algorithme de, 217 profondeur parcours en, 102, 107 profondeur d?un sommet, 94 programme lin´ eaire dual, 273 primal, 273 promotion, 218 pseudo-plan, 285 puits, 245 quotient automate, 316 droit, 312 gauche, 312 graphe, 89 r´ eduction saturante, 265 r´ epartition des monotonies, 134, 136 rang, 174 d?attache, 109 d?un sommet, 79 rapide, tri, 122 rationnelle, expression, 304 rationnelle,expression, 308 r´ egion de Vorono¨ ?, 408 repr´ esentant conforme, non conforme, 254 ´ eseau, 241 r´ eseau de transport, 244 valu´ e, 241 r´ etraction, 449 rotation, 150 Roy-Warshall, algorithme de, 81 s´ election, tri par, 141 scinder une partition, 319 scission, 167 secteur angulaire, 384 semi-anneau, 83 Simon, algorithme de, 354 simple, polygone, 381 site, 408 sommet, 74 actif, 264 d´ egrad´ e, 180, 192 de pile, 40 externe, 93 ferm´ e, 106, 225 interne, 94 libre, 225 ouvert, 106, 225 de transit, 244 source, 245 sous-graphe, 74 induit, 75 Stirling, formule de, 18 subdivision planaire, 407 subset construction , 299 successeur, 74, 380 successeurs liste des, 76 suffixe, 294 suite circulaire, 380 suppl´ eance, 342 suppression dans un arbre a?b, 163 bicolore, 179 binaire de recherche, 150 tas, 56 tour gauche, droit, 385 trajectoire, planification de, 431 transition, fonction de, 298 translation d?un segment, 433 transport plan, 245, 285 r´ eseau, 244 tri adaptatif, 206 bulle, 140 par champs, 142 ´ equilibr´ e, 134 externe, 131 fusion, 128 par insertion, 142 par insertion, 40 polyphas´ e, 135 rapide, 122 par s´ election, 141 par tas, 130 topologique, 79 triangulation de Delaunay, 411 Version 6 f´ evrier 2005 462 Index union pond´ er´ ee, 62 valeur d?un chemin, 83 voisine, cellule, 435 voisins d?un point, 448 liste des, 76 Vorono¨ ? ar? ete, 409 diagramme, 408 r´ egion, 408 Version 6 f´ evrier 2005 Notes et Compl´ ements 463 Notes et Compl´ ements Ces notes et compl´ ements sont ´ ecrits depuis la mise sur le r´ eseau du manuscrit. Ils contiennent les corrections d?erreurs, et aussi quelques indications sur des d´ eveloppements plus r´ ecents. Chapitre 3. Structures de donn´ ees Gestion des partitions Note 1 (page 65) Une preuve plus simple est donn´ ee dans la le¸ con 11, pages 52?57, du livre : D. Kozen, The Design and Analysis of Algorithms, Springer-Verlag, 1991. Chapitre 9. Automates Algorithme de Hopcoft Note 2 (page 321) Il faut lire Lp = {w ? A? | p · w ? T}. Note 3 (page 323) Dans la proc´ edure, derni` ere ligne, lire P := P ? L Note 4 (page 324) Il manque une ligne : la scission par (238, b) : P : 46 ? 123578 Scission relative ` a (46, a) P : 46 ? 12378 ? 5 Scission relative ` a (5, b) P : 46 ? 17 ? 238 ? 5 Scission relative ` a (238, b) P : 46 ? 17 ? 28 ? 3 ? 5 Scission relative ` a (28, a) P : 46 ? 1 ? 7 ? 2 ? 8 ? 3 ? 5 Termin´ e Une pr´ esentation d´ etaill´ ee de l?algorithme de Hopcoft est parue dans : T. Knuutila, Re-describing an algorithm by Hopcroft, Theoretical Computer Sci- ence 250 (2001), 333?363. Version 6 f´ evrier 2005

PARTAGER SUR

Envoyer le lien par email
2963
READS
10
DOWN
7
FOLLOW
7
EMBED
DOCUMENT # TAGS
#algorithme  #maths 

licence non indiquée


DOCUMENT # INDEX
Mathematiques, Sciences 
img

Partagé par  macuche

 Suivre

Auteur:D. Beauquier, J. Berstel, Ph. Chretienne
Source:Non communiquée