algo2

Embed Size (px)

Citation preview

  • 5/23/2018 algo2

    1/159

    Algorithmique - Cours et Travaux Dirigs

    Ecole Normale Suprieure de Lyon

    RdactionEtudiants-scribes, MIM 2003 et 2004

    Cours

    Yves Robert

    Travaux Dirigs

    Yves Caniou et Eric Thierry

    2003-2004-2005

  • 5/23/2018 algo2

    2/159

    2

  • 5/23/2018 algo2

    3/159

    Table des matires

    1 Introduction : calcul dexn 111.1 nonc du problme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2 Algorithme naf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.3 Mthode binaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.4 Mthode des facteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.5 Arbre de Knuth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.6 Rsultats sur la complexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.7 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.8 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    2 Diviser pour rgner 192.1 Algorithme de Strassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.2 Produit de deux polynmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.3 Master theorem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.4 Rsolution des rcurrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    2.4.1 Rsolution des rcurrences homognes . . . . . . . . . . . . . . . . . . . . 232.4.2 Rsolution des rcurrences avec second membre . . . . . . . . . . . . . . . 23

    2.5 Multiplication et inversion de matrices . . . . . . . . . . . . . . . . . . . . . . . . 242.6 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.7 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    3 Programmation dynamique 353.1 Pices de Monnaies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.2 Le problme du sac dos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    3.2.1 En glouton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.2.2 Par programmation dynamique . . . . . . . . . . . . . . . . . . . . . . . . 36

    3.3 Quelques exemples de programmation dynamique . . . . . . . . . . . . . . . . . . 373.3.1 Chanes de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.3.2 Plus longue sous-suite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383.3.3 Location de skis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    3.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.5 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    4 Algorithmes gloutons 514.1 Exemple du gymnase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514.2 Coloriage dun graphe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    4.2.1 Algorithme glouton 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534.2.2 Algorithme glouton 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534.2.3 Graphe dintervalles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    3

  • 5/23/2018 algo2

    4/159

    4.2.4 Algorithme de Brelaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544.3 Thorie des matrodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    4.3.1 Matrodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554.3.2 Algorithme glouton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    4.4 Ordonnancement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574.6 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    5 Tri 63

    5.1 Tri rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635.1.1 Cot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635.1.2 Mdiane en temps linaire . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

    5.2 Tri fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645.3 Tri par tas : Heapsort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

    5.3.1 Dfinitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655.3.2 Tri par tas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655.3.3 Insertion dun nouvel lment . . . . . . . . . . . . . . . . . . . . . . . . . 665.3.4 Suppression dun lment du tas . . . . . . . . . . . . . . . . . . . . . . . 66

    5.4 Complexit du tri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675.4.1 Les grands thormes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675.4.2 Dmonstration des thormes . . . . . . . . . . . . . . . . . . . . . . . . . 675.4.3 Peut-on atteindre la borne ? . . . . . . . . . . . . . . . . . . . . . . . . . . 69

    5.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705.6 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

    6 Graphes 876.1 Dfinitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876.2 Arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

    6.2.1 Caractrisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876.2.2 Parcours darbres binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . 886.2.3 Arbres binaires de recherche . . . . . . . . . . . . . . . . . . . . . . . . . . 91

    6.3 Structures de donnes pour les graphes . . . . . . . . . . . . . . . . . . . . . . . . 93

    6.4 Accessibilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976.4.1 Rappels sur les relations binaires . . . . . . . . . . . . . . . . . . . . . . . 976.4.2 Chemins dans les graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . 986.4.3 Fermeture transitive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

    6.5 Plus courts chemins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016.5.1 Dfinitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016.5.2 Prsentation des plus courts chemins . . . . . . . . . . . . . . . . . . . . . 1016.5.3 Avec des poids positifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026.5.4 Chemins algbriques dans les semi-anneaux . . . . . . . . . . . . . . . . . 1026.5.5 Algorithme de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    6.6 Parcours en largeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

    6.7 Parcours en profondeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076.7.1 Premire version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076.7.2 Analyse fine du parcours en profondeur . . . . . . . . . . . . . . . . . . . 108

    6.8 Tri topologique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106.9 Forte connexit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106.10 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106.11 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

    4

  • 5/23/2018 algo2

    5/159

    7 Tables de hachage 1197.1 Recherche en table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1197.2 Tables de hachage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1197.3 Collisions spares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1207.4 Adressage ouvert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217.5 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

    8 Analyse amortie 1238.1 Compteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

    8.1.1 Mthode des acomptes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1238.1.2 Mthode du potentiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1248.2 Malloc primaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    8.2.1 Mthode globale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1248.2.2 Mthode des acomptes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1248.2.3 Mthode du potentiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    8.3 Insertion ET suppression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1258.4 Gestion des partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

    8.4.1 Reprsentation en listes chanes . . . . . . . . . . . . . . . . . . . . . . . 1258.4.2 Reprsentation en arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

    8.5 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

    9 N P-Compltude 1279.1 P versus NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279.2 3-SAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279.3 Clique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1299.4 Couverture par les sommets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1309.5 Circuit hamiltonien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1309.6 Coloration de graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

    9.6.1 COLOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1319.6.2 3-COLOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1339.6.3 3-COLOR-PLAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

    9.7 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

    9.8 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

    10 Algorithmes dapproximation 14510.1 Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14510.2 Vertex cover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

    10.2.1 Version classique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14510.2.2 Version pondre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

    10.3 Voyageur de commerce : TSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14710.3.1 Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14710.3.2 Inapproximabilit de TSP : . . . . . . . . . . . . . . . . . . . . . . . . . . 14710.3.3 2-approximation dans le cas o c vrifie lingalit triangulaire . . . . . . . 147

    10.4 Bin Packing : BP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14810.4.1 Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14810.4.2 Next Fit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14910.4.3 Dec First Fit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

    10.5 2-Partit ion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15010.5.1 NP-compltude au sens faible et au sens fort . . . . . . . . . . . . . . . . 15010.5.2 Approximation gloutonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

    5

  • 5/23/2018 algo2

    6/159

    10.5.3 Une(1 + )-approximation . . . . . . . . . . . . . . . . . . . . . . . . . . . 15210.5.4 FPTAS pour 2-Partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

    10.6 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15610.7 Rfrences bibliographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

    6

  • 5/23/2018 algo2

    7/159

    Prface

    Ce polycopi rassemble les cours et travaux dirigs (avec corrigs) du module Algorithmiquede lENS Lyon. A lorigine prvu pour la premire anne du Magistre dInformatique, le modulesintgre dsormais dans la troisime anne de la Licence dInformatique. Et dire que personnene sest rendu compte du changement!

    Cela fait peine dix ans que jenseigne ce cours. A dfaut de changer le contenu (pourfaire quoi dautre ?) ou dutiliser autre chose que le tableau et la craie (idem ?), je change lesirrsistibles traits dhumour qui font tout le charme de ces sances du Mercredi (lhoraire nechange pas non plus). Et juse toute une batterie de TD-men and women, lesquels ont apportleur contribution au fil des ans, construisant ou amliorant des sances de travaux dirigs. Jeles remercie tous sincrement, par ordre dapparition : Odile Millet-Botta, Tanguy Risset, Alain

    Darte, Bruno Durand, Frdric Vivien, Jean-Christophe Dubacq, Olivier Bodini, Daniel Hir-schkoff, Matthieu Exbrayat, Natacha Portier, Emmanuel Hyon, Eric Thierry, Michel Morvan etYves Caniou.

    Sans aucune pression ou presque, Yves Caniou et Eric Thierry ont russi se motiver pourrassembler les TD. Lanne prcdente, javais rassembl les cours. Enfin, quand on dit rassem-bler, cest surtout les gentils tudiants-scribes qui rassemblent, en tapotant de leurs doigts agilesla quintessence de notre enseignement ingalable.

    Ce polycopi est le concurrent le plus srieux du Cormen dans le monde, ou du moins dansle septime arrondissement de Lyon! Mais renonant de fabuleux droits dauteur, lquipepdagogique (cest nous) a dcid de mettre cet ouvrage la libre disposition des nombreuxtudiants assoiffs de savoir (cest vous). Enjoy !Et merci de signaler erreurs et omissions parcourrier lectronique [email protected].

    Lyon, Mai 2005Yves Robert

    Biblio

    Voici quelques pointeurs bibliographiques (voir aussi les rfrences donnes la fin de chaquechapitre) :

    Introduction to Algorithms de T. H. Cormen, C. E. Leiserson et R. L. Rivest [2]. Lou-vrage de rfrence par excellence, acheter et conserver toute sa vie dinformaticien. Il semurmure quune deuxime dition est parue, avec un auteur de plus. Et une traductionfranaise.

    Computers and Intractability, a Guide to the Theory of NP-Completeness de M. R.Garey et D. S. Johnson [5]. Essentiellement pour son introduction la NP-compltude ausens fort, et quelques jolies rductions. On revient toujours son catalogue de problmesNP-complets.

    7

  • 5/23/2018 algo2

    8/159

    The art of Computer Programming , les trois tomes de Knuth [6], et bientt quatre, pourleurs exercices incroyables

    8

  • 5/23/2018 algo2

    9/159

    Sinon, jaime bien : Types de Donnes et Algorithmes, le livre de Froidevaux, Gaudel et Soria [3], pour lanalyse

    fine des problmes de tri le NP-compendium, maintenu sur le Web (http://www.nada.kth.se/~viggo/problemlist/

    compendium.html), pour les rsultats dapproximation. Le livre qui correspond,Complexityand Approximation, de Ausiello et al. [1] est vraiment trs complet, avec une bonne intro-duction aux schmas dapproximation.

    Algorithms and Complexity, le livre de Wilf [12], dont la premire dition, puise, estdisponible librement lurl http://www.cis.upenn.edu/~wilf/. Une jolie introduction

    la NP-compltude, avec une preuve concise du thorme de Cook, plein dalgorithmes, delhumour, dans un fichier .pdf tlcharger absolument

    Compared to what ? : an introduction to the analysis of algorithms, le livre de Rawlins [8],qui contient une mine dexercices originaux

    Introduction to Graph Theory, de West [11], mon livre prfr de graphes

    Enfin, deux livres plus difficiles, rserver aux plus aventureux : celui de Kozen [7], The designand analysis of algorithms, contient les notes de cours et exercices (certains corrigs) dun coursde niveau avanc donn Cornell, et celui de Vazirani [10], Approximation algorithms, dont letitre rsume bien le contenu.

    9

  • 5/23/2018 algo2

    10/159

    10

  • 5/23/2018 algo2

    11/159

    Chapitre 1

    Introduction : calcul de xn

    1.1 nonc du problme

    On tudie le problme du calcul de xn, tant donns x et n (n tant un entier positif).Soulignons que x nest pas ncessairement un nombre, il peut sagir dune matrice ou dunpolynme plusieurs indtermines : si la multiplication a un sens, la division nen a pas !

    On pose y0 =x, et on utilise la rgle du jeu suivante : si jai dj calcul y1, y2, . . . , yi1,je peux calculeryi comme produit de deux rsultats prcdents arbitraires :

    yi= yj yk, avec 0 j, k i 1Le but est datteindrexn le plus vite possible, i.e. de trouver

    Opt(n) = min{i/yi= xn}.

    1.2 Algorithme naf

    Considrons lalgorithme naf suivant :

    yi = y0 yi1

    On a yn1= xn, le cot est donc de n 1.

    1.3 Mthode binaire

    On trouve facilement un algorithme plus efficace :

    xn =

    xn/2 xn/2 sin est pair,

    xn/2 xn/2 x sin est impair.

    On peut aussi formuler lalgorithme de la faon suivante. On crit n en criture binaire. Puison remplace chaque 1 par SX et chaque 0 par S, et on enlve le premier SX (celui qui est

    gauche). Le mot obtenu donne un faon de calculer xn, en traduisant S par lopration mettreau carr(squaring), et X par lopration multiplier parx. Par exemple, pour n= 23, la chaneobtenue est SX S SX SX SX, en enlevant le premier SX, on obtient SSXSXSX. On calcule doncdans lordre x2, x4,x5, x10, x11, x22, et x23.

    La correction de lalgorithme se justifie facilement partir des proprits du systme binaire.Le cot est de :

    log n + (n) 1,

    11

  • 5/23/2018 algo2

    12/159

    o (n) reprsente le nombre de 1 dans lcriture binaire de n. Bien sr, comme dans toutouvrage dinformatique qui se respecte, les logarithmes sont en base 2.

    Cette mthode binaire nest pas optimale : par exemple avec n = 15, on obtient la chaneSXSXSX, do 6 multiplication alors que en remarquant que 1 5 = 3 5, on a besoin de 2multiplications pour trouver y= x3 (y= (x x) x) puis de 3autres pour calculer x15 =y5 (onapplique la mthode binaire : y2, y4, y5).

    1.4 Mthode des facteurs

    La mthode des facteurs est base sur la factorisation de n:

    xn =

    (xp)q sipest le plus petit facteur premier de n,xn1 x sinest premier.

    Remarque : Avec les puissances de 2, cette mthode est identique la mthode binaire.

    Remarque : Cette mthode nest pas optimale, par exemple pour n= 33on a7multiplicationsavec la mthode des facteurs et seulement 6avec la mthode binaire.

    Remarque : Il existe une infinit de nombres pour lesquels la mthode des facteurs estmeilleure que la mthode binaire (prendre n = 15 2k), et rciproquement (prendre n = 33 2k).

    Il faut souligner que le cot de la recherche de la dcomposition de n en facteurs premiersnest pas pris en compte dans notre formulation. Cest pourtant ncessaire pour quantifier cor-rectement le cot de la mthode des facteurs. Le problme est quon ne sait pas, ce jour,trouver la dcomposition en temps polynomial en n.

    1.5 Arbre de Knuth

    Une autre mthode consiste utiliser larbre de Knuth, reprsent Figure 1.1. Le cheminmenant de la racine de larbre n indique une squence dexposants permettant de calculer xn

    de faon efficace.

    1

    2

    3

    5

    7

    14

    19 21 28

    10

    11

    22

    13

    23 26

    15

    25 30

    20

    40

    6

    9

    18

    27 36

    12

    24

    48

    4

    8

    16

    17

    33 34

    32

    64

    Fig.1.1 Les sept premiers niveaux de larbre de Knuth.

    12

  • 5/23/2018 algo2

    13/159

    Construction de larbre Le (k+ 1)-me niveau de larbre est dfini partir des kpremiersniveaux de la faon suivante : prendre chaque nud nduk-me niveau, de gauche droite, etles relier avec les nuds

    n + 1, n + a1, n + a2, . . . , n + ak1= 2n

    (dans cet ordre), o 1, a1, . . . , ak1= n reprsente le chemin de la racine n. On najoutera pasun nud si celui ci est dj prsent dans larbre.

    Voici quelques statistiques dues Knuth : les plus petits nombres pour lesquels la mthode

    nest pas optimale sont n = 77, 154, 233. Le plus petit n pour lequel la mthode de larbre estsuprieure la fois la mthode binaire et celle des facteurs est n= 23. Le plus petit n pourlequel la mthode de larbre est moins bonne que celle des facteurs est n= 19879 = 103193 ;de tels cas sont rares : pour n 100000, larbre bat les facteurs 88803fois, fait match nul 11191fois et perd seulement 6fois.

    1.6 Rsultats sur la complexit

    Thorme 1. Opt(n) log n

    Preuve. Soit un algorithme permettant de calculer les puissances dex, avec pour tout i, yi =x(i). Montrons par rcurrence que (i)2i. Pour la base, on a bien y0 = x do 120 = 1.Soit i un entier, il existe j et k (j, k < k) tels que yi = yj yk. On a (i) = (j) + (k), parlhypothse dinduction, (j) 2j 2i1 et de mme (k) 2i1. On en dduit donc que(i) 2i1 + 2i1 = 2i.

    Intuitivement, la preuve exprime quon ne peut pas faire mieux que doubler lexposant obtenu chaque tape de lalgorithme.

    Grce au thorme prcdent, et ltude de la mthode binaire, dont le nombre dtapesest infrieur 2 log n, on a le rsultat suivant :

    1

    limn

    Opt(n)

    log n 2.

    Thorme 2. limnOpt(n)log n = 1

    Preuve. Lide est damliorer la mthode binaire en appliquant cette mthode en base m.Posons m = 2k, o k sera dtermin plus tard, et crivons nen base m :

    n= 0mt + 1m

    t1 + + t,

    o chaque i est un chiffre en base m, donc compris entre 0 et m 1. Puis on calcule tous lesxd,1 d m 1) par la mthode nave, ce qui requiert m 2multiplications. En fait, on napas forcment besoin de toutes ces valeurs, seulement des xi , mais comme on les calcule au

    vol on peut les calculer tous sans surcot.Ensuite on calcule successivement :

    y1 = (x0 )m x1

    y2 = (y1)m x2 =x(0m+1)m+2

    ...yt = (yt1)m xt =xn

    13

  • 5/23/2018 algo2

    14/159

    On effectue pour chaque ligne k + 1oprations (klvations au carr pour calculer la puissancem-me, et une multiplication), do le cot total du calcul de xn :

    t (k+ 1) + (m 2).

    En remplaant mpar 2k, et t parlogm n, on trouve un cot total de

    logm n(k+ 1) + 2k 2 log2 n

    k (k+ 1) + 2k.

    Il suffi

    t donc de prendre k tendant vers linfini, pour que (k + 1)/k tende vers 1, et tel que2k =o(log n), par exemplek= 1/2 log(log n)(on aura alors 2k log n).

    1.7 Exercices

    Exercice 1.7.1. Le grand saut

    Le problme est de dterminer partir de quel tage dun immeuble, sauter par une fentreest fatal. Vous tes dans un immeuble n tages (numrots de 1 n) et vous disposez de ktudiants. Il ny a quune opration possible pour tester si la hauteur dun tage est fatale :faire sauter un tudiant par la fentre. Sil survit, vous pouvez le rutiliser ensuite, sinon vous

    ne pouvez plus.Vous devez proposer un algorithme pour trouver la hauteur partir de laquelle un saut estfatal (renvoyer n+ 1 si on survit encore en sautant du n-me tage) en faisant le minimum desauts.

    1 - Si k log2(n), proposer un algorithme en O(log2(n))sauts.2 - Si k < log2(n), proposer un algorithme en O(k+ n2k1 )sauts.3 - Si k = 2, proposer un algorithme en O(

    n)sauts.

    Correction.

    1 - La complexit en O(log2(n)) qui est indique nous aiguille vers une dichotomie. En effet,

    en supposant que lon a k log2(n), on obtient le rsultat sur les tages de i j en jetantun tudiant depuis le nme tage, o n = j i/2, puis en itrant le procd sur les tages dei n 1 si la chute t fatale, et sur les tages de n j dans le cas contraire. La mthodedichotomique nous garantit alors que lon obtient le bon rsultat (lorsquil ne reste plus quunseul tage, cest--dire lorsque lon calcule pour les tages de i= j ), et ce avec une complexitlogarithmique dans le pire des cas.

    2 - Puisquici on ne dispose que de k < log2(n) tudiants, on ne peut pas appliquer directementla mthode dichotomique propose prcdemment. Cependant, on va remdier au problme demanire simple en appliquant une recherche dichotomique avec k 1 tudiants, de manire dlimiter un intervalle dtages dans lequel se trouve ltage recherch. On se sert alors du derniertudiant restant pour parcourir lintervalle de faon linaire, donc en le jetant de chaque tageen partant du plus bas de lintervalle, jusquau plus haut. Aprs avoir jet les k 1 premierstudiants, si lon na pas encore trouv le bon tage, il reste exactement n/2k1 tages danslintervalle de recherche, do une complexit dans le pire des cas en O(k+ n/2k1)sauts.

    3 - Dans le cas particulier o lon a k = 2, on ne veut pas avoir tester chaque tage de faonlinaire, cest pourquoi on va reprendre notre compte les ides prcdentes, et notamment cellequi consiste dlimiter un intervalle de recherche. Nous dcoupons donc lensemble des tages

    14

  • 5/23/2018 algo2

    15/159

    en tranches de

    ntages, avant de jeter le premier tudiant de chacun des tages de dbut detranche. Lorsque ltudiant y laisse sa peau, on se ramne au dernier tage ntest qui ne soit pasfatal, et on na plus qu parcourir de manire linaire lintervalle allant de ltage n + 1 ltagefatal trouv prcdemment. On a ainsi deux sries dessais en O(

    n), et donc une complexit

    finale dans le pire des cas galement en O(

    n)sauts.

    Exercice 1.7.2. Cherchez la star

    Dans un groupe denpersonnes (numrotes de 1 npour les distinguer), une starest quelquun

    qui ne connait personne mais que tous les autres connaissent. Pour dmasquer une star, sil enexiste une, vous avez juste le droit de poser des questions, nimporte quel individu idu groupe,du type est-ce que vous connaissezj ? (not i j ?), on suppose que les individus rpondentla vrit. On veut un algorithme qui trouve une star, sil en existe, ou sinon qui garantit quilny a pas de star dans le groupe, en posant le moins de questions possibles.

    1 - Combien peut-il y avoir de stars dans le groupe ?

    2 - Ecrire le meilleur algorithme que vous pouvez et donner sa complexit en nombre de questions(on peut y arriver en O(n)questions).

    3 - Donner une borne infrieure sur la complexit (en nombre de questions) de tout algorithmersolvant le problme. ((Difficile) prouver que la meilleure borne infrieure pour ce problme est

    3n log2(n) 3).Correction.

    1 - Il ne peut y avoir quune seule star dans le groupe, puisque sil y en a une, elle ne connaitpersonne, et donc tous les autres sont inconnus dau moins une personne, et ne peuvent donctre eux aussi des stars.

    2 - Lorsquon effectue le testi j ? , cest--dire lorsque lon cherche savoir si la personneiconnat la personne j , on obtient le rsultat suivant :

    si oui, alors i nest pas une star, mais j en est potentiellement une. si non, alors j nest pas une star, mais i en est potentiellement une.

    Lalgorithme consiste alors a parcourir le tableau des personnes une fois, en gardant en memoire chaque instant la personne i qui est jusquici reconnue par tous, tandis quau j me test, toutesles autres personnes, dont les indices sont les k < j (avec k= i, bien sr) ne peuvent pas desstars. Cet algorithme scrit donc de la manire suivante :

    i 1 et j 2tant que j n faire

    si i j alors faire j j+ 1sinon faire i j et j j+ 1

    istar vraiet k 1tant que (k n et istar) faire

    sik i alors faire k k+ 1sinon faire istar faux

    si istar alors faire retourner i est la star sinon faire retourner il ny a pas de star

    3 - En observant notre algorithme, on constate que lon peut utiliser comme borne infrieurepour le nombre de questions la valeur3n2, puisque lon fait ici deux boucles sur n1personnes

    15

  • 5/23/2018 algo2

    16/159

    et une boucle sur lensemble des n personnes. Pour ce qui est de la borne infrieure optimale, ilsagit dune question difficile, dont on nexplicitera pas la solution ici.

    Exercice 1.7.3. Bricolage

    Dans une boite outils, vous disposez de n crous de diamtres tous diffrents et des nboulons correspondants. Mais tout est mlang et vous voulez appareiller chaque crou avec leboulon qui lui correspond. Les diffrences de diamtre entre les crous sont tellement minimesquil nest pas possible de dterminer lil nu si un crou est plus grand quun autre. Il en va

    de mme avec les boulons. Par consquent, le seul type dopration autoris consiste essayer uncrou avec un boulon, ce qui peut amener trois rponses possibles : soit lcrou est strictementplus large que le boulon, soit il est strictement moins large, soit ils ont exactement le mmediamtre.

    1 - Ecrire un algorithme simple en O(n2)essais qui appareille chaque crou avec son boulon.

    2 - Supposons quau lieu de vouloir appareiller tous les boulons et crous, vous voulez justetrouver le plus petit crou et le boulon correspondant. Montrer que vous pouvez rsoudre ceproblme en moins de 2n 2essais.3 - Prouver que tout algorithme qui appareille tous les crous avec tous les boulons doit effectuer(n log n)essais dans le pire des cas.

    Problme ouvert : proposer un algorithme en o(n2)essais pour rsoudre ce problme.

    Correction.

    1 - AlgorithmePour appareiller les boulons et les crous, il suffit de prendre un boulon arbitrairement, de

    le tester avec tous les crous.On trouve alors le bon en au plus n tests et il suffit alors derecommencer avec tous les autres boulons.On obtient donc le rsultat en au plus n(n1)2 =O(n

    2)tests.

    2 - Le plus petit crou et son boulonLe principe est de numroter les boulons et les crous de 1 n, de manire arbitraire, et de

    faire progresser des compteurs (par exemple i et j) pour marquer le minimun courant dans lunedes catgories, et la structure en cours de test dans lautre.

    dbutwhile (i n) && (j n) do

    si i=j=nalors sortir de la boucle ;si ecrou.i= boulon.j alorssen souvenir et faire i:= i + 1;si ecrou.i < boulon.j alorsj :=j + 1 ; min = ecrou;si ecrou.i > boulon.j alorsi := i + 1 ; min = boulon;

    finA la fin de cette boucle, si min=crou, lcrou i est le plus petit.

    si min=boulon, le boulon j est le plus petit. Et dans les deux cas, on sait dj quel estllment qui correspond : en effet, le compteur de lautre catgorie vaut n+1 (ou n dans uncas spcial),et on a donc dj rencontr le minimum. la seule raison possible pour laquelleil na pas t conserv est donc quil ait t test avec lautre minimum. Pour le cas spcialou i=j=n, le dernier test est inutile : en effet, on sait que lun des deux, est minimum, etque une fois le boulon minimum atteind, j reste fixe : do le boulon n est minimum, etson homologue a soit dj t trouv, soit est lcrou restant.

    16

  • 5/23/2018 algo2

    17/159

    Cette boucle effectue donc au plus 2 n 2tests.3 - Algorithme dappareillage des crous et de leur boulon

    On note f(T)le nombre de feuilles de larbre et h(T)sa hauteur. Si T est un arbre ternaireh(T) log3f(T). Par induction sur la hauteur de T :

    Pour h(T) = 0larbre une feuille donc on a bien h(T) log3f(T). Pour h(T) > 0 un arbre ternaire a trois fils, le fils gauche f g, le fils central f c, et le

    fils droit f dde hauteur infrieur h(T) 1.On suppose que h(T) log3f(T) est vraipour h(T) k k tant fix on veut dmontrer que cette proprit est vrai aussi pourh(T) =k + 1. Les feuilles dun arbre sont aussi celles de ses fils. Donc

    !"#$

    %"%&$%"%'$

    %' %&

    %"%($

    %(

    %"#$

    #

    !"#$)*

    f(T) =f(f d) + f(f g) + f(f d)

    de plus :h(T) h(f d) + 1h(T) h(f g) + 1h(T) h(f c) + 1

    or par induction commeh(T) =k + 1, h(f g) k,h(f g) k,et h(f g) kon a :k= h(f c) log3f(f c)

    h(f d) log3f(f d)h(f g) log3f(f g)

    Doncf(f c), f(f g), f(f d) 3k or :f(T) =f(f c) + f(f g) + f(f d)

    donc :f(T) 3 3k = 3k+1

    D o on en dduit que :h(T) log3f(T)

    Il y a !nagencements boulons-crous possibles donc larbre de dcision, qui est ternaire a pourhauteur :log3!n nlog3n, donc la complexit dans le pire cas de lalgo est de : (n logn).

    1.8 Rfrences bibliographiques

    La prsentation du cours sinspire de Knuth [6]. Les exercices Le grand saut et Bricolagesont tirs de Rawlins [8].

    17

  • 5/23/2018 algo2

    18/159

    18

  • 5/23/2018 algo2

    19/159

    Chapitre 2

    Diviser pour rgner

    2.1 Algorithme de Strassen

    Calculons un produit de matrices : r st u

    =

    a bc d

    e fg h

    Lalgorithme classique calcule en Add(n) = n2(n

    1) additions et Mult(n) = n3 multipli-

    cations. En effet, il y a n2 coefficients calculer, chacun correspondant un produit scalaire detaille n, donc avecnmultiplications, n 1additions, et une affectation. Peut-on faire mieux ?1V. Strassen rpond que oui : soient

    p1= a(g h)p2= (a + b)hp3= (c + d)ep4= d(f e)p5= (a + d)(e + h)p6= (b d)(f+ h)p7= (a c)(e + g)

    alors on peut crire

    r= p5+ p4 p2+ p6s= p1+p2t= p3+p4u= p5+p1 p3 p7

    Comptons maintenant les oprations :

    Classique Strassen

    Mult(2) = 8 Mult(2) = 7Add(2) = 4 Add(2) = 18

    On a gagn une multiplication, mais en perdant 14additions ; donc, pour des matrices2x2,cest un bilan ngatif. Par contre, il est remarquable que lopration ne ncessite pas la commu-tativit de la multiplication. On peut donc lutiliser avec des matrices de taillenpaire.

    1Dans les temps anciens de linformatique, il tait surtout intressant de diminuer le nombre de multiplications,

    quitte augmenter le nombre dadditions. Larchitecture pipeline des processeurs actuels permet de raliser, en

    moyenne, une addition ou une multiplication par temps de cycle.

    19

  • 5/23/2018 algo2

    20/159

    Supposons donc n = 2m pair, et utilisons la mthode prcdente une seule fois, en par-titionnant chaque matrice de dpart en quatre sous-blocs de taille m m. On effectuera m3multiplications pour chaque pi, do un total de Mult(n) = 7m3 = 7n3/8multiplications. Pourles additions, il y a deux sources : les additions effectues dans chaque produit pi, donc aunombre de 7m2(m 1), et les additions pour former les 18 matrices auxiliaires, au nombre de18m2. Do Add(n) = 7m3 + 18m2 = 7n3/8 + 18n2/4. Asymptotiquement, le terme dominantest en n3/7 pour Mult(n) comme pour Add(n), et la nouvelle mthode est gagnante pour nassez grand. La raison profonde est la suivante : une multiplication de deux matrices de taille nrequiert O(n3) oprations, alors que leur addition nen demande que O(n2). Pour n grand, les

    additions sont gratuites en face des multiplications. Ce qui ntait pas le cas pour les nombresrels.

    Lalgorithme de Strassen est lapplication rcursive de la dcomposition prcdente. On consi-dre le cas o nest une puissance de 2, i.e. n = 2s. Sin nest pas une puissance de 2, on tendles matrices avec des0 la puissance de 2suprieure :

    X 00 0

    et on remplacera dans les formules qui suivent log nparlog n.Prenons doncn = 2s. On fonctionne de manire rcursive : on refait le mme dcoupage pour

    chacun des produits de matrice pi. On sarrtera quand on arrive des matrices de taille 1, ou

    mieux, la taille pour laquelle la mthode est plus coteuse que la mthode classique ( n 32).Soient : M(n) =nombre de multiplications ralises par lalgorithme de Strassen pour multiplier

    2matrices de taille n A(n) = nombre dadditions ralises par lalgorithme de Strassen pour multiplier 2 ma-

    trices de taille nOn a :

    M(1) = 1M(n) = 7 M(n/2) = M(n) = 7

    s = 7log2(n) =nlog2(7)

    Comme prcdemment, les additions viennent de 2 sources : les additions lies aux additionsde matrices pour la construction des termespiet les additions effectues pour les multiplications

    de matrices (appels rcursifs). On a donc : A(1) = 0A(n) = 7 A(n/2) + 18 (n/2)2 = A(n) = 6 (n

    log2(7) n2)

    (on verra Section 2.4 comment rsoudre cette rcurrence). On voit que lordre de grandeur ducot des calculs nest plus en n3, mais seulement en nlog27.

    Lalgorithme de Strassen nest pas souvent utilis car il introduit des problmes dinstabi-lit numrique. Notons enfin quil existe des algorithmes de complexit meilleure que celle deStrassen, et que le problme de dterminer la complexit du produit de deux matrices est encoreouvert. La seule borne infrieure connue est en O(n2): il faut bien toucher chaque coefficient aumoins une fois.

    2.2 Produit de deux polynmes

    Le but est de multiplier deux polynmes. On notera n-polynmes les polynmes de degrstrictement infrieur n, donc avec n coefficients. Soient :

    P : n-polynme :n1

    i=0 aiXi

    20

  • 5/23/2018 algo2

    21/159

    Q: n-polynme :n1

    i=0 biXi

    R= P Q=? : (2n 1)-polynmeSoient :

    M(n) = nombre de multiplications ralises par lalgorithme pour multiplier deux n-polynmes

    A(n) =nombre dadditions ralises par lalgorithme pour multiplier deux n-polynmesAvec lalgorithme usuel de multiplication de n-polynmes :

    M(n) =n2 et A(n) =n2 (2n 1) affectations

    = (n 1)2

    On suppose n pair, n = 2mP =P1+ X

    m P2Q= Q1+ X

    m Q2

    avec P1,P2, Q1,Q2 m-polynmes

    Soient :

    R1= P1 Q1R2= P2 Q2R3= (P1+ P2) (Q1+ Q2)

    On a alors : R = R1+ (R3 R2 R1) Xm + R2 X2mQuel est lintrt ? On ne ralise que3 multiplications de polynmes de taille moiti. Les ad-

    ditions sont de deux types : les additions de polynmes, et les additions lies aux multiplications

    dem-polynmes.On suppose maintenant que n = 2s et on applique lalgorithme de manire rcursive.

    M(1) = 1M(n) = 3 M(n/2) = M(n) = 3

    s =nlog2(3)

    A(1) = 0A(n) = 3 A(n/2)

    appels recursifs

    + 2 n/2 pour avoir R3

    + 2 (n 1) pour avoir R3R2R1

    + (n 2) construction de R

    En effet, pour la construction de R :

    R= R1+ (R3 R1 R2) Xm

    + R2 X2m

    =

    n2i=0

    r1i X

    i

    X0Xn2

    +

    n2i=0

    zi Xi+n/2

    +

    n2i=0

    r2i X

    i+n

    XnX2n2

    Tous les termes du terme du milieu sadditionnent aux termes de gauche et de droite, il fautdonc faire n 2additions. Do :

    A(1) = 0A(n) = 3 A(n/2) + 4 n 4 = A(n) = 6n

    log2(3) 8n + 2

    (on verra Section 2.4 comment rsoudre cette rcurrence)

    Remarque Le meilleur algorithme de multiplication de polynmes est enO(n log(n)), il est

    obtenu par transforme de Fourrier rapide (FFT).P, Q evaluation

    P(xi), Q(xi) en 2n points

    P(xi) Q(xi) interpolation

    P Q

    Lvaluation et linterpolation sont ralises en n2 par la mthode classique, en utilisant Newtonet Lagrange. Pour la FFT, on value les polynmes en les racines complexes de lunit.

    21

  • 5/23/2018 algo2

    22/159

    2.3 Master theorem

    Diviser pour rgner :On considre un problme de taillen, quon dcoupe ena sous-problmes de taillen/b permettantde rsoudre le problme. Le cot de lalgorithme est alors :

    S(1) = 1S(n) =a S(n/b) + Reconstruction(n)

    cn en general a b cStrassen 7 2 2 18

    Polynomes 3 2 1 4

    S(n) =a S(n/b) + R(n) =a2 S(n/b2) + a R(n/b) + R(n) =. . .On pose n= bk, on a alors :

    S(n) = ak

    nlogb(a)S(1) +

    k1i=0

    ai R(n/bi)

    avec R(n) =c n

    et : = c n

    k1i=0

    (a/b)i

    On distingue alors plusieurs cas :

    1. (a > b): n ( ab )k ak = S(n) =O(nlogb(a))

    2. (a= b): k n = S(n) =O(n log(n))

    3. (a < b): c n 11

    ab

    = S(n) =O(n)Retour sur Strassen :

    A la lumire de ce qui prcde, et si on dcoupait les matrices en 9 blocs de taille n/3 au lieude4blocs de taille n/2 ?

    On a :a b ca 3 2

    Pour que lalgorithme soit plus intressant que Strassen, il faut que :

    log3(a) < log2(7)

    a < elog2(7)log2(3) a < 7log2(3) 21, 8

    Cest un problme ouvert : on connat une mthode avec a = 23mais pas avec a = 21 !

    22

  • 5/23/2018 algo2

    23/159

    2.4 Rsolution des rcurrences

    2.4.1 Rsolution des rcurrences homognes

    p0 sn+p1 sn1+ +pk snk = 0piconstantes

    Soit P =k

    i=0pi Xki. On cherche les racines de P. Si les racines de P sont distinctes :

    sn =

    ki=0

    ci rin

    Sinon, siqi est lordre de multiplicit de ri

    sn =l

    i=0

    Pi(n) polynome de degre qi1

    rin

    2.4.2 Rsolution des rcurrences avec second membre

    On note E loprateur de dcalage : E{sn}= {sn+1}On dfinit les oprations suivantes sur

    les suites :c.{sn} = {c.sn} (2.1)

    (E1+ E2){sn} = E1{sn}+ E2{sn} (2.2)

    (E1E2){sn} = E1(E2{sn}) (2.3)ex:

    (E 3){sn}= {sn+1 3sn}(2 + E2){sn}= {2sn+ sn+2}

    P(E)annule {sn}si P(E){sn}= 0ex :

    suite annulateur

    {c} E 1{Qk(n)} (E 1)k+1{cn} E c

    {cn Qk(n)} (E c)k+1

    o Qk(n) est un polynme de degr k. En effet, il suffit de montrer la dernire relation, parrcurrence sur k :

    (E c)k+1 {cn Qk(n)} {cn(a0nk+Qk1(n))}

    = (E c)k [(E c){cn(a0nk + Qk1(n))}] {cn+1(a0(n+1)k+Qk1(n+1))cn+1(a0nk+Qk1(n))}

    = (E c)k[cn+1 Rk1(n)]

    = 0

    (par hypothse de rcurrence)

    Rsolution pour les additions dans lalgorithme de Strassen :

    A(n) = 7 A(n/2) + 18 n2

    4

    23

  • 5/23/2018 algo2

    24/159

    On a n = 2s, on pose As= A(2s)

    As+1= 7 As+ 18 (2s+1)2

    4 = 7 As+ 18 4s

    (E 4) (E 7){As} As+17As=184s

    = 0

    As=k1 7s + k2 4savec :

    A0 = 0A1 = 18

    On en dduit les valeurs de k1 et k2 donnes plus haut.

    Rsolution pour les additions dans lalgorithme de multiplication de polynmes :

    A(n) = 3 A(n/2) + 4n 4As = 3 As1+ 4 2s 4

    Do : (E 1)(E 2)(E 3){As}= 0 As = k1 3s + k2 2s + k3

    avec :A0 = 0

    A1 = 4

    A2 = 24

    On en dduit les valeurs de k1= 6, k2= 8et k3= 2donnes plus haut.

    2.5 Multiplication et inversion de matrices

    Soient : M(n) =cot de la multiplication de 2matrices dordre n

    I(n) =cot de linversion dune matrice dordre n

    Hypothses : O(n2) M(n)

    I(n) O(n3)

    M(n) et I(n) croissantsThorme 3. M(n) etI(n) ont le mme ordre de grandeur.

    Preuve. On montre que chaque opration est au moins aussi difficile que lautre :

    La multiplication est au moins aussi complexe que linversion

    On veut multiplier les matrices A et B de taille n. Soit Zde taille 3nsuivante :

    Z= I A 00 I B0 0 I

    Z1 = I A A.B0 I B

    0 0 I

    Do : M(n) I(3n)

    24

  • 5/23/2018 algo2

    25/159

    Linversion est au moins aussi complexe que la multiplication

    On procde en deux tapes :

    Si A est symtrique dfinie positive

    A=

    B tCC D

    Soit S=D

    C.B1. tC(Shur complement).

    A1 =

    B1 + B1. tC.S1.C.B1 B1. tC.S1S1.C.B1 S1

    Il suffit de construire :

    B1,C.B1, (C.B1). tC, S1, S1.(C.B1), t(C.B1).(S1.C.B1)

    do :I(n) = 2 I(n/2) + 4 M(n) + O(n2) =O(M(n))

    Cas gnral On poseB = tA A. On veut calculer A1, et on sait calculer B1 car B estsymtrique dfinie positive.

    I=B1.B= B1.( tA.A) = (B1. tA).A A1 =B1. tADo : I(n) = 2 M(n) + O(M(n)) =O(M(n))

    2.6 Exercices

    Exercice 2.6.1. Matrices de Tplitz

    Unematrice de Tplitzest une matrice n n (ai,j )telle que ai,j =ai1,j1 pour 2 i, j n.1 - La somme de deux matrices de Tplitz est-elle une matrice de Tplitz ? Et le produit ?

    2 - Trouver un moyen dadditionner deux matrices de Tplitz en O(n).

    3 - Comment calculer le produit dune matrice de Tplitzn npar un vecteur de longueur n ?Quelle est la complexit de lalgorithme?

    Correction.

    1 Par linarit, la somme de deux Tplitz reste une Tplitz. Ce nest pas vrai pour le produit.Par exemple,

    1 01 1

    1 10 1

    =

    1 11 2

    2 On nadditionne que les premires lignes et les premires colonnes, ce qui fait 2n 1opra-tions.

    3 On ne considre que les matrices de taille 2k 2k.On dcompose la matrice en blocs de taille n= 2k1

    MT =

    A BC A

    XY

    25

  • 5/23/2018 algo2

    26/159

    On pose :

    U = (C+ A)X

    V = A(Y X)W = (B+ A)Y

    et on calcule :

    MT =

    W VU+ V

    Calcul de la complexit : On note respectivement M(n)et A(n)le nombre de multiplications etdadditions pour un produit de matricesn n.

    M(2k) = 3M(2k1)M(1) = 1

    A(2k) = 3A(2k1) + 2(2k 1) + 3.2k1A(1) = 0

    On rsoud les rcurrences :on pose Ms = M(2s), et on pose As = A(2s).

    le calcul pour les multiplications : Ms = 3Ms1M0= 1

    (E 3)Ms= 0; Ms = 3log n =nlog3

    puis le calcul pour les additions :

    As = 3As1+ 7.2s1 2A0= 0(E 3)(E 2)(E 1){As}=0As = i3

    s +j2s + lA0= A(1) = 0 i +j+ l= 0A1= A(2) = 5 3i + 2j+ l= 5A2= A(4) = 27 9i + 4j+ l= 27Doi= 6, j= 7, l= 1

    26

  • 5/23/2018 algo2

    27/159

    Exercice 2.6.2. Recherche dun lment majoritaire

    SoitEune liste de n lments rangs dans un tableau numrot de 1 n. On suppose que laseule opration quon sait effectuer sur les lments est de vrifier si deux lments sont gauxou non. On dit quun lment x E est majoritaire si lensemble Ex = {y E|y = x} astrictement plus de n/2lments. Sauf avis contraire, on supposera que n est une puissance de2. On sintressera la complexit dans le pire des cas.

    1 - Algorithme naf

    crire un algorithme calculant le cardinal de cx de Ex pour un x donn. En dduire unalgorithme pour vrifier si Epossde un lment majoritaire. Quelle est la complexit de cetalgorithme ?

    2 - Diviser pour rgner

    2.1- Donner un autre algorithme rcursif bas sur un dcoupage de Een deux listes de mmetaille. Quelle est sa complexit ?

    2.2 - Donner un algorithme similaire (en prcisant sa complexit) dans le cas gnral o n nestpas une puissance de 2.

    3 - Encore mieux

    Pour amliorer lalgorithme prcdent, on va se contenter dans un premier temps de mettreau point un algorithme possdant la proprit suivante :

    soit lalgorithme garantit que Ene possde pas dlment majoritaire, soit lalgorithme fournit un entier p > n/2 et un lment x tels que xapparaisse au plus

    pfois dans Eet tout lment autre que x apparat au plus n pfois dans E.3.1 - Donner un algorithme rcursif possdant cette proprit. Quelle est sa complexit ?

    3.2 - Mme question quand nnest pas une puissance de 2.

    3.3 - En dduire un algorithme efficace vrifiant si Epossde un lment majoritaire.

    4 - Encore encore mieux

    On change la manire de voir les choses. On a un ensemble de n balles et on cherche le caschant sil y a une couleur majoritaire parmi les balles.

    4.1 - Supposons que les balles soient ranges en file sur une tagre, de manire navoir jamaisdeux balles de la mme couleur ct. Que peut-on en dduire sur le nombre maximal de ballesde la mme couleur ?

    On a un ensemble de n balles, une tagre vide o on peut les ranger en file et une corbeillevide. Considrons lalgorithme suivant :

    - Phase 1 - Prendre les balles une par une pour les ranger sur ltagre ou dans la corbeille.SI la balle nest pas de la mme couleur que la dernire balle sur ltagre, la ranger ct,

    et si de plus la corbeille nest pas vide, prendre une balle dans la corbeille et la ranger ctsur ltagre. SINON, cest dire si la balle est de la mme couleur que la dernire balle surltagre, la mettre dans la corbeille.

    - Phase 2 - Soit C la couleur de la dernire balle sur ltagre la fin de la phase 1. Oncompare successivement la couleur de la dernire balle sur ltagre avec C. SI la couleur est lamme on jette les deux dernires balles sur ltagre, sauf sil nen reste quune, auquel cas onla met dans la corbeille. SINON on la jette et on jette une des balles de la corbeille, sauf si la

    27

  • 5/23/2018 algo2

    28/159

    corbeille est dj vide auquel cas on sarrte en dcrtant quil ny a pas de couleur majoritaire.Quand on a puis toutes les balles sur ltagre, on regarde le contenu de la corbeille. Si elleest vide alors il ny a pas de couleur majoritaire, et si elle contient au moins une balle alors Cest la couleur majoritaire.

    4.2 - (Correction de lalgorithme) Montrer qu tout moment de la phase 1, toutes les ballesventuellement prsentes dans la corbeille ont la couleur de la dernire balle de ltagre. Endduire que sil y a une couleur dominante alors cest C.

    Prouver la correction de lalgorithme.

    4.3 - (Complexit) Donner la complexit dans le pire des cas en nombre de comparaisons decouleurs des balles.

    5 - Optimalit

    On considre un algorithme de majorit pour les couleurs de n balles. Le but est de regarderfaire lalgorithme, en choisissant au fur et mesure les couleurs des balles pour que lalgorithmeait le maximum de travail (tout en restant cohrent dans le choix des couleurs). On obtiendraainsi une borne infrieure de complexit pour un algorithme de majorit. Cest la technique deladversaire.

    tout moment de lalgorithme, on aura une partition des balles en deux ensembles : larneet lesgradins. Larne contient un certain nombre de composantes connexes de deux sortes : les

    binmeset lestroupeaux. Un binme est un ensemble de deux balles pour lesquelles lalgorithme adj test si elles taient de la mme couleur et a rpondu non. Un troupeau est un ensemble nonvide de balles de la mme couleur, connectes par des tests de lalgorithme. Ainsi, un troupeauavec k lments a subi au moins k 1comparaisons de couleurs entre ses membres. Soient B lenombre de binmes et Tle nombre de troupeaux. Soient g le nombre dlments dans les gradinset tle nombre total dlments dans tous les troupeaux. Enfin, soit m= n/2 + 1 le seuil demajorit.

    Au dbut de lalgorithme toutes les balles sont des troupeaux un lment. La stratgie deladversaire est la suivante. Lalgorithme effectue un test couleur(x) =couleur(y)?

    1. Si x ou y sont dans les gradins, la rponse est non.

    2. Si x (resp. y) est dans un binme, la rponse est non et x (resp. y) est envoy dans les

    gradins alors que llment restant devient un troupeau singleton.3. Si x et y sont dans le mme troupeau la rponse est oui.

    4. Si x et y sont dans des troupeaux diffrents alors cela dpend de d= B + t.

    (a) d > m: cela signifie que les balles sont dans des troupeaux singletons. La rponse estnon et les balles deviennent un nouveau binme.

    (b) d= m : la rponse est oui et les troupeaux de x et y fusionnent.

    5.1 - Vrifier que les quatre cas prcdents traitent tous les cas possibles.Montrer qu tout momentd met que sid > malors tous les troupeaux sont des singletons.

    5.2 - Montrer qu tout moment les deux coloriages suivants sont consistants avec les rponsesde ladversaire :

    (i) Toutes les balles sont de couleurs diffrentes sauf celles qui sont dans un mme troupeau.(ii) Une mme couleur est attribue toutes les balles de tous les troupeaux et une balle

    de chaque binme. Les balles restantes ont chacune une couleur distincte.

    5.3 - Montrer que si un algorithme correct sarrte alors larne ne contient quune seule compo-sante connexe qui est un troupeau de taille m.

    28

  • 5/23/2018 algo2

    29/159

    5.4 - tout moment le nombre de comparaisons ingales effectues par lalgorithme est au moins2g+ B et le nombre de comparaisons gales est au moins t T.

    5.5 - Considrons un algorithme qui rsout la majorit. Montrer quil existe une donne pourlaquelle lalgorithme effectue au moins 2(n m) = 2n/2 1 comparaisons dingalit et aumoinsn/2comparaisons dgalit, et donc au moins au total 3n/2 2comparaisons.

    Correction.

    On se restreint ici aux algorithmes o la seule opration quon sait effectuer sur les lments estde tester si deux lments sont gaux. Si la rponse est OUI, on dira quil sagit dunecomparaisongale, et si la rponse est NONdune comparaison ingale.

    Remarque :sil existe un lment majoritaire, il est ncessairement unique.

    1 - Algorithme naf

    dbutpouri de 1 nfaire

    c 0;pourj de 1 nfaire

    si E[j] =E[i]alors c c + 1 ;si c > n/2alorsretourner E[i]est majoritaire

    Retourner Pas dlment majoritaire.fin

    Complexit :nombre total de comparaisons = n2.

    2 - Diviser pour rgner

    E EE 1 2

    n/2 n/2

    2.1 -Principe :

    Couper Een deux tableaux E1 et E2 de taillesn/2(on suppose n pair). Sil existe un lment majoritaire x dans E, alors x est majoritaire dans au moins une

    des deux listes E1 et E2 (en effet si x non majoritaire dans E1, ni dans E2, alors dans E,cx n/4 + n/4 =n/2).

    Algorithme rcursif : calculer les lments majoritaires deE1et deE2(sils existent) avecle nombre total doccurences de chacun et en dduire si lun des deux est majoritaire dansE.

    Lalgorithme suivantM ajoritaire(i, j)renvoie un couple qui vaut (x, cx)six est majoritairedans le sous-tableauE[i..j]aveccxoccurences et qui vaut(, 0)sil ny a pas de majoritaire dansE[i..j], lappel initial tant Majoritaire(1, n). La fonction Occurence(x,i,j)calcule le nombredoccurences de x dans le sous-tableau E[i..j].

    29

  • 5/23/2018 algo2

    30/159

    Algorithm:Majoritaire(i, j)

    dbutsi i = j alorsretourner (E[i], 1);sinon

    (x, cx) =M ajoritaire(i, (i +j)/2);(y, cy) =M ajoritaire((i +j)/2 + 1, j);si cx= 0alors cx cx+ Occurence(x, (i +j)/2 + 1, j);si cy

    = 0alors cy

    cy+ Occurence(x,i,

    (i +j)/2

    );

    si cx> (j i + 1)/2alorsretourner (x, cx);sinon si cy > (j i + 1)/2alorsretourner (y, cy);sinonretourner (, 0).

    fin

    Complexit :le nombre total de comparaisons dans le pire des cas C(n)vrifie la relation (onsuppose que nest une puissance de 2) :

    C(n) = 2(C( n2

    ) + n2

    )avec C(1) = 0

    On en dduit C(n) =n log2(n).

    2.2 - Si n nest pas une puissance de 2, les trois points du principe prcdent restent vrais encoupant E en un tableau de taillen/2 et lautre de taillen/2, et lalgorithme dcrit ci-dessus fonctionne sans aucune modification. La rcurrence pour la complexit est alorsC(n) =

    C(n

    2 ) + C(n

    2 ) + navec C(1) = 0, dont la rsolution donne C(n) n log2(n).3 - Encore mieux

    Remarque 1 : soit x vrifiant la proprit, alors aucun autre lment z= x ne peut tremajoritaire (carcz n p < n/2), donc, dans ce cas,x est uncandidat-majoritaire. Autrementdit un algorithme vrifiant les proprits de lexercice nous fournit :

    soit la garantie quil nexiste aucun lment majoritaire, soit un candidat-majoritairex, dont on peut vrifier ensuite sil est vraiment majoritaire

    en reparcourant une fois le tableau (soit n

    1comparaisons).

    Remarque 2 :un lment majoritaire x est bien un candidat-majoritaireavecp = cx(donc silexiste un majoritaire, il sera bien propos comme candidat-majoritairepar lalgorithme).

    3.1 - Algorithme rcursifCandidat majoritaire(E)renvoyant AUCUNsil ny a pas dlmentmajoritaire dansEet sinon renvoyant (x, p)avec les bonnes proprits.

    30

  • 5/23/2018 algo2

    31/159

    Algorithm:Candidat majoritaire(E)

    dbutsi Ena quun lmentxalorsretourner (x, 1);sinon

    couper Een deux tableaux E1 et E2 de taille n/2;appeler Candidat majoritaire(E1)qui renvoie AUCUNou (x, p);appeler Candidat majoritaire(E2)qui renvoie AUCUNou (y, q);suivant la rsponse pour E1 et E2, fairesi AUCUN etAUCUNalorsretourner AUCUN;si AUCUN et(y, q)alorsretourner (y, q+ n4 );si (x, p) etAUCUNalorsretourner (x, p + n4 );si (x, p) et(y, q)alors

    si x =y etp > qalorsretourner (x, p + n2 q);si x =y etp < qalorsretourner (y, q+ n2p);si x =y etp= qalorsretourner AUCUN(sinon ce serait x ou y maiscx n2 etcy n2 );si x= y alorsretourner (x, p + q)

    fin

    Complexit :on a suppos n un puissance de 2, le nombre de comparaisons C(n) pour un

    tableau n lments vrifie : C(n) = 2C( n2 ) + 1 avec C(1) = 0, ce qui donne C(n) =n 1.3.2 - Si on ne suppose pas que n est une puissance de 2, couper Een deux tableaux de taillesn2 etn2 , et affiner lanalyse.Sinest pair, faire comme la question prcdente en remplaant juste n4 par n4 . La complexitvrifie alors C(n) =C(n2 ) + C(n2 ) + 1.Si n est impair,n = 2m + 1, adapter la procdure prcdente de la manire suivante :

    dbutsi m = 0, Ena quun lmentxalorsretourner (x, 1);sinon

    couper Een un tableau E1 de taille met un tableauE2 de taille m + 1 ;

    appeler Candidat majoritaire(E1)qui renvoie AUCUNou (x, p);appeler Candidat majoritaire(E2)qui renvoie AUCUNou (y, q);suivant la rsponse pour E1 et E2, fairesi AUCUN etAUCUNalorsretourner AUCUN;si AUCUN et(y, q)alorsretourner (y, q+ m2 );si (x, p) etAUCUNalorsretourner (x, p + m+12 );si (x, p) et(y, q)alors

    si x =y etp qalorsretourner (x, p + m + 1 q);si x =y etqp + 1 alorsretourner (y, q+ m p);si x= y alorsretourner (x, p + q)

    finLa complexit vrifie toujours C(n) = C(n2 ) +C(n2 ) + 1 avec C(1) = 0. La rsolution decette formule de rcurrence donne C(n) =n 1.3.3 - Algorithme complet pour rechercher un majoritaire :

    Recherche duncandidat-majoritaireavec lalgorithme prcdent, soit n 1comparaisons. Si lalgorithme renvoie un candidat, vrification que le candidat est bien majoritaire en

    reparcourant le tableau, soit n 1comparaisons.

    31

  • 5/23/2018 algo2

    32/159

    Complexit au total = 2n 2comparaisons.4 - Encore encore mieux

    4.1 - Soit k le nombre de balles ranges en file sur ltagre telles que deux balles conscutivesnaient jamais la mme couleur, alors le nombre de balles dun mme couleur est toujours k2 .Preuve prcise : utiliser le lemme des tiroirs, cest dire si Mchaussettes sont ranges parmim tiroirs avec M > m, alors il existe un tiroir avec au moins deux chaussettes. Ici dcouperltagre en k2 tiroirs disjoints qui sont des paires demplacements conscutifs sur ltagre. Sily a plus de

    k

    2balles dune mme couleur, il en existe deux dans un mme tiroir, cest dire

    ici adjacentes sur ltagre.

    4.2 - Correction de lalgorithme : on montre des invariants (proprits restants vraies pendantune phase de lalgorithme).

    - Phase 1 -Invariant 1 :si la corbeille nest pas vide, toutes les balles dans la corbeille ont la mme couleurque la dernire ballle sur ltagre.Preuve :montrer que si la prop. est vraie un instant donn, elle reste vraie ltape suivante.Plusieurs cas peuvent se produire ici, vrifier la conservation de la proprit dans chaque cas (faire) :

    ajout dune balle diffrente de la dernire et corbeille pleine ... ajout dune balle diffrente de la dernire et corbeille vide ... ajout dune balle identique la dernire ...

    Invariant 2 : sur ltagre, il ny a jamais deux balles de mme couleur cte cte.Preuve :idem au cas par cas.

    Fin de Phase 1 :soitCla couleur de la dernire balle sur ltagre. Les balles dautres couleurssont dans les k 1 premires balles de ltagre, o k est le nombre de balles sur ltagre etk n. Comme il ny a pas deux balles adjacentes de mme couleur, daprs la question 1,le nombre de balles dune couleur diffrente de C est n12 = n2 . Donc la seule couleurcandidate pour tre majoritaire est C.

    - Phase 2 -vrifie si Cest bien majoritaire : Quand on retire une paire de balles, on en a toujours une de couleur Cet lautre diffrente,

    doncCest majoritaire si et seulement si une majorit de balles la fin (tagre + corbeille)est de couleur C.

    Deux cas de fin se prsentent : La phase 2 sarrte car on a besoin dune balle de la corbeille mais la corbeille est

    vide. Dans ce cas, la dernire balle sur ltagre nest pas de couleur C et daprs laquestion 1, au plus la moiti des balles restant sur ltagre sont de couleur C, il ny apas de majoritaire. Ok, cest bien ce que rpond lalgorithme.

    Lalgorithme va jusquau bout de ltagre, les balles restantes (sil en reste) sont dansla corbeille, elles sont toutes de couleurC. DoncCest majoritaire si et seulement si lacorbeille est non vide, cest bien le test effectu par lalgorithme.

    4.3 -Complexit :Phase 1 : (n 1)comparaisons (1car la premire balle est directement pose sur ltagre).Phase 2 : une comparaison par paire de balles limines, plus ventuellement une comparaisonavec Cpour la dernire balle de ltagre sil en reste une unique, soit n2 comparaisons (1car au dbut de la phase 2, on sait que la dernire balle sur ltagre est de couleur C).Complexit totale 3n2comparaisons.

    32

  • 5/23/2018 algo2

    33/159

    5 - Optimalit

    5.1 - Tous les cas possibles sont bien reprsents. Au dpart d = n et tous les troupeaux sontdes singletons. Quels cas modifient d ?Cas 1 : non.Cas 2 : non (car -1 binme, +1 dans les troupeaux).Cas 3 : non.Cas 4(a) : oui, d diminue de 1 (mais les troupeaux restent des singletons).Cas 4(b) : non.Conclusion :

    Invariant d m(si dchange, cest que d > mavec le cas 4(a) et alors d 1 m). d > m implique que tous les troupeaux sont des singletons.

    5.2 - Consistence des rponses de ladversaire tout moment.Coloration (i) : correspond bien aux rponses donnes, car respecte les binmes ( comparaisonsingales) et les troupeaux (comparaisons gales). De plus les balles envoyes dans les gradins onttoujours engendr la rponse NON aux comparaisons, ce qui fonctionne si leurs couleurs sonttoutes diffrentes et diffrentes des couleurs des balles dans larne.Coloration (ii): idem avec de plus le fait quune balle dans un binme na jamais t compare quelquun dautre que son binme (donc pas de risque de contradiction avec les choix descouleurs ailleurs).

    5.3 - Un algorithme correct ne peut sarrter que si larne ne contient quune composanteconnexe qui sera un troupeau de taille m.

    Preuve par labsurde : supposons que larne contienne au moins deux composantes (ce quiimplique n 2 et m 2). Par dfinition de d, chaque troupeau contient < d balles. Chaquetroupeau contient donc < mballes, car soit d= m, soit d > met daprs la question 1 chaquetroupeau est un singleton. La coloration (i)na pas dlment majoritaire, mais la coloration (ii)a un lment majoritaire (car d m). Donc aucun algorithme correct ne peut sarrter cetinstant.

    Conclusion : la fin, il y a ncessairement une unique composante, ncessairement de tailled= m (par dfinition de d et daprs la question 1 qui implique que d > m).

    5.4 - A tout moment, on a eu jusqu prsent : Nombre de comparaisons ingales 2g +B , car il faut 2 comparaisons ingales pour

    mettre une balle dans les gradins (entre dans un binme puis sortie du binme) et il y aB comparaisons ingales qui ont construit les binmes en place.

    Nombre decomparaisons gales t T, car un troupeau i avectiballes est connexe doncil a ti 1artes, soit ici ti 1comparaisons gales.

    5.5 - En fin dalgorithme, daprs la question 3, g = n m, B = 0, t = m et T = 1. Donc,avec la question 4, il y a eu 2(n m) = 2n2 2 comparaisons ingales et m 1 =n2 comparaisons gales, soit au total 3n2comparaisons.

    2.7 Rfrences bibliographiques

    La prsentation du cours, et lexerciceMatrices de Toeplitz, sinspirent du Cormen [2]. Lexer-ciceRecherche dun lment majoritaireest tir de Darte et Vaudenay [4].

    33

  • 5/23/2018 algo2

    34/159

    +,-(./0

    +,-(./0

    +,-(./0

    1,2/3

    1,2/3

    1,2/3

    456-,7

    83/(-/7

    9./

    7,:;63-;

  • 5/23/2018 algo2

    35/159

    Chapitre 3

    Programmation dynamique

    3.1 Pices de Monnaies

    On dispose de pices en nombre illimit, de valeurs10,5,2et1. On veut arriver a une sommeSavec le minimum de pices.

    Algorithme Glouton : Trier les types de pices par valeurs dcroissantes. Pour chaque valeurde pice, maximiser le nombre de pices choisies. Plus formellement, soit R la somme restante,

    initialise S. Pour chaque valeur vi, prendre ci = Rvi pices, et poser R R ci vi.

    Pour prouver loptimalit de lalgorithme glouton avec les valeurs 10, 5, 2 et 1 : Au plus une pice de 5(sinon une de 10) Au plus une pice de 1(sinon une de 2) Au plus deux pices de 2 (sinon une de 5 et une de 1) Au plus quatre pices qui ne sont pas des pices de 10 (1 5 + 2 2 + 1 = 1 10), pour un

    total infrieur ou gal 9 Le nombre de pices de 10 est donc S10 Conclure avec ce qui prcde

    Remarque : lalgorithme glouton nest pas optimal pour le jeu de pices de valeurs (6, 4, 1):

    pour S= 8, le glouton renvoie 8 = 6 + 1 + 1alors quon a 8 = 4 + 4.

    Dans le cas gnral, on cherche m(S), le nombre minimum de pices pour faire Savec despices de valeur (a1, a2, . . . , an). Pour cela on introduit la fonction z telle que :

    z(T, i) = nombre minimum de pices choisies parmi les i premires (a1,...,ai) pour faireT

    on remarque que z(S, n) = m(S), on rsout un problme apparemment plus compliquque le problme de dpart

    Mais on a une relation de rcurrence :

    z(T, i) = min z(T, i 1) i-me pice non utilisez(T

    vi, i) + 1 on a utilis une fois (au moins) lai-me pice

    Il faut initialiser la rcurrence correctement, par exemple en posant z(T, i) = 0pour T 0 oui= 0.

    Comment calculer toutes lesSnvaleurs dezdont on a besoin ? Un algorithme qui calcule parcolonnes (boucle suriexterne, boucle sur Tinterne) permet de respecter les dpendances, i.e. detoujours avoir en membre droit des valeurs prcdemment obtenues. On obtient une complexit

    35

  • 5/23/2018 algo2

    36/159

    enO(n S)., alors que lalgorithme glouton avait une complexit en O(n log n)(lexcution estlinaire, mais il faut auparavant trier les valeurs).

    Remarque Caractriser les jeux de pices pour lesquels lalgorithme glouton est optimal estun problme ouvert. Il est facile de trouver des catgories qui marchent (par exemple des pices1, B , B2, B3, . . .pour B 2) mais le cas gnral rsiste !

    3.2 Le problme du sac dos

    On se donne n objets ayant pour valeurs c1, . . . , cn et pour poids (ou volume) w1, . . . , wn.Le but est de remplir le sac dos en maximisant

    iIci, sous la contrainte

    iIwi W, o

    West la contenance maximale du sac

    3.2.1 En glouton

    On va travailler sur le rapport qualit/prix. On commence par trier les objets selon les ciwidcroissants, puis on gloutonne en remplissant le sac par le plus grand lment possible chaquetour.

    Question : Est-ce optimal ? Non.

    Le problme qui se pose est que lon travaille avec des lments discrets non divisibles.Prenons un contre-exemple : si lon considre 3 objets, le 1er ( ci/wi max) remplissant le sac lui seul (aucun autre objet ne rentre) et les 2me et 3me tels que c1 > c2, c1 > c3, mais quec2 +c3> c1et que les deux objets puissent rentrer ensemble dans le sac. Alors la solution donnepar glouton (remplissage par le premier objet) est sous-optimale, contrairement au remplissagepar les objets 2 et 3.

    (W = 10) (w1= 6; w2= 5; w3= 5) (c1= 7; c2= 5; c3= 5)

    est un exemple dun tel cas de figure.

    3.2.2 Par programmation dynamique

    Afin de rsoudre le problme par une rcurrence, on va le compliquer. Un problme de rem-plissage plus complexe que celui de dpart est celui o la taille du sac et le nombre dobjets employer sont arbitraires. Posons alors C(v, i)comme lexpression du meilleur cot pour remplirun sac de taillev avec lesipremiers objets. Rsoudre le problme de remplissage du sac de tailleWavec les n objets revient donner C(W, n).

    La rcurrence : soit on a pris le dernier objet, soit on ne la pas pris, do

    C(v, i) = max

    C(v, i 1) dernier objet non considrC(v

    wi, i

    1) + ci dernier objet pris

    La solution optimale des sous-problmes va servir retrouver la solution optimale du pro-blme global, sans que lon calcule jamais 2 fois la mme valeur. Ceci implique par contre derespecter les dpendances du calcul.

    Remarque Le cot de glouton est en O(n log n) (tri de n nombres) tandis que le cot dutraitement en programmation dynamique est en O(nW)

    36

  • 5/23/2018 algo2

    37/159

    >??!>.

    .!*

    .

    /

    @ "?B.$

    @ "?B .!*$@ "?!>.B .!*$

    Fig.3.1 Attention au respect des dpendances !

    3.3 Quelques exemples de programmation dynamique

    Les exemples que nous allons voir ici concernent le traitement de chanes de matrices dunepart, et la dtermination de la plus longue sous-suite de deux chanes de caractres dautre part.

    Credo du programmeur dynamique : Demain est le premier jour du reste de ta vie.

    3.3.1 Chanes de matrices

    Considrons n matrices Ai, de taille Pi1 Pi On veut calculer A1 A2 . . . An. Leproblme que lon se pose est de trouver comment parenthser cette expression, le parenthsageinfluant sur les calculs.

    Le nombre de parenthsages diffrents peut se calculer par rcurrence. Soit Cnle nombre deparenthsages. Si lon place la dernire parenthse en k, on obtient si n 2:

    C(n) =n1

    k=1C(k) C(nk)

    On comprend intuitivement que le nombre de faons de parenthser dpend de la faon dont lesdeux parties de lexpression ont t elles-mmes parenthses. La condition initiale est C(1) = 1.Knuth nous explique que lon peut calculer C(n) par lintermdiaire des nombres de Catalan(obtenus par sries gnratrices 1). On aC(n) = 1n C

    n12n2= (4

    n/n1.5). Cette quantit effarantenous fait bien vite dchanter, et lon se rsout abandonner la stratgie de la force brute.

    Pourquoi faire simple quand on peut faire compliqu ? Tchons de nous ramener de laprogrammation dynamique (aprs tout cest le titre de ce paragraphe). Nous cherchions paren-thserA1, . . . , An, cherchons donc le cot optimal du parenthsage de Ai, . . . , Aj (notC(i, j)).La solution de notre problme sobtiendra pour i = 1et j = n.

    La rcurrence :Supposons que la meilleure faon de couper(Ai, . . . , Aj )est de couper un endroit k :

    (Ai . . . Ak) cot optimal pour lobtenir : C(i, k)

    cot optimal pour lobtenir : C(k+ 1, j)

    (Ak+1 . . . Aj )

    1En cas de besoin urgent de compulser une rfrence sur les sries, se rfrer Flajeolet et Sedgewick

    37

  • 5/23/2018 algo2

    38/159

    Le cot total dun parenthsage en k est donc de

    C(i, k) + C(k+ 1, j) + cot du produit des 2 membres (Pi1 Pk Pj)et le cot optimal sobtient par

    minj1k=i {C(i, k) + C(k+ 1, j) + (Pi1 Pk Pj)}Le calcul se fait en respectant les dpendances : le calcul de C(i, j)demande tous les C(i, k)

    et tous les C(k+ 1, j)

    .

    @ ".B C$ @ "DE*B C$

    @ ".BD$

    Fig.3.2 Linitialisation se fait sur C(i, i + 1) =Pi1 Pi Pi+1etC(i, i) = 0sur la diagonale

    Lalgorithme ralisant le calcul en respectant les dpendances sera en O(n3)(for diag = ...for lment dans diag calcul for k = ...)

    Question :Cet algorithme peut-il scrire en rcursif ? Oui.Cela demande t-il plus de calcul ? Non, condition de sarrter lentre dun calcul C(i, j)dj effectu. On initialise toutes les valeurs de C(i, j) +

    , et on effectue un test lentre

    de lappel rcursif.

    3.3.2 Plus longue sous-suite

    Exemple : Votre petit frre apprend langlais avec un logiciel qui demande What is thecapital of the USA ?. Il serait intressant que le logiciel soit capable de diffrencier New-Yorkde Washington mal crit, pour donner une rponse approprie (mauvaise rponse ou mauvaiseorthographe).On peut alors dfinir une mesure dedistance ddition, cest dire le nombre de transformationsncessaires pour passer dune chane une autre.Soient

    A= a1

    ...an

    B=b1

    ...bm

    On dfinit une sous-chane de A comme tant ai1 ai2 ...aik .On recherche les sous-chanes communes A et B, et plus particulirement la Plus LongueSous-Chane Commmune ou P LSCC.Exemple :A= aabaababaa, B= ababaaabbalors P LSCC=ababaaa, non conscutifs.

    38

  • 5/23/2018 algo2

    39/159

    Solution exhaustive

    On essaie toutes les sous-suites : on numre les 2n sous-suites dans chaque chane, puis onles compare. Sans doute peu efficace.

    Programmation dynamique

    On cherche la plus longue sous-chane commune entre les mots A et B , de longueurs respec-tivesn et m. On recherche :

    PLSCC(n, m) : A[1 . . . n]B[1 . . . m]Pour cela, on utilise la plus longue sous-chane commune entre les iet j premires lettres de Aet B respectivement, soit :

    PLSCC(i, j) =p(i, j) :

    A[1 . . . i]B[1 . . . j]

    On peut alors enclencher une rcurrence pour rsoudre le problme de la recherche de p(i, j).

    p(i, j) =max

    p(i, j 1)p(i 1, j)p(i

    1, j

    1) + [ai= bj] avec [ai= bj]vaut 1 si ai= bj , 0 sinon

    PreuveOn constate dabord que :

    max

    p(i, j 1)p(i 1, j)p(i 1, j 1) + [ai= bj]

    p(i, j)

    Trivial en effet car p(i, j)est croissant valeurs entires en i et en j .On peut diviser la preuve de lgalit en deux cas : soit (1) pi=pj , soit (2) pi= pj .

    1. Si pi=pj , pi et pj ne peuvent pas appartenir tous deux la mme sous-suite commune :on a donc deux cas : soit pi appartient la sous-suite et p(i, j) =p(i, j 1), soit cest pjqui y appartient, et on a p(i, j) =p(i 1, j).

    2. Si pi = pj , deux cas se prsentent nouveau : soit la PLSCC contient pi = pj , et alorsp(i, j) =p(i1, j1)+1, soit elle ne contient paspi= pjet doncp(i, j) =p(i1, j1)+0.

    On a donc prouv la relation de rcurrence.

    ExempleA= a b c b d a bB= b d c a b a

    La P LSCCtrouve est bdab: dans la Figure 3.3, on trouve une lettre commune lorsque lesflches sont diagonales. En effet, lalgorithme consiste prendre loption qui maximise le score,

    cest dire le maximum de la pente.Le cot de la recherche de la plus longue sous-chane commune est de O(nm). Il existe de

    meilleurs algorithmes dans la littrature, de deux types :les algorithmes qui sont efficaces lorsque les squences sont ressemblantesles algorithmes qui sont efficaces lorsque les squences sont trs diffrentes.

    On trouve alors des algorithmes en O((n r)m)ou en O(rm), avecr la longueur de la P LSCCde deux mots de longueurs net m.

    39

  • 5/23/2018 algo2

    40/159

    Fig.3.3 La P LSCCest bdab.

    3.3.3 Location de skis

    Voici un exercice trs joli, pour lequel il est conseill de chercher la solution avant de lire larponse!

    Allocation de skis aux skieurs Spcifier un algorithme efficace pour une attribution opti-male de mpaires de skis de longueur s1, . . . , sm, respectivement, nskieurs (mn) detaille h1, . . . , hn, respectivement, via une fonction (injective) f :{1, . . . , n} {1, . . . , m},f tant optimale lorsquelle minimise

    nk=1|sf(k) hk|. On donne lindication suivante :

    soit A[n, m] ce minimum. Dfinir A[i, j] pour des valeurs plus petites i n et j m(lesquelles?), par une quation de rcurrence (iet j font rfrence aux ipremiers skieurset auxj premires paires de skis, respectivement).

    Complexit Analyser la complexit (en veillant affiner lanalyse de sorte garantir quelalgorithme soit en O(n log n)si m= n).

    Grand choix de skis Montrer quon peut avoir une meilleure complexit lorsque n2 =o(m).(Indication : se restreindre O(n2)paires de skis).

    Allocation de skis aux skieurs On considre le mme problme, mais en ne prenant quelesi premiers skieurs et les j premires paires de skis (avec videmment les mmes longueurs ettailles). Pour crire la rcurrence dfinissant A[i, j], on est naturellement amen sintresser laj-me paire de skis et au i-me skieur. Il y a deux cas. Si la solution optimale pouri, jnutilisepas la j-me paire de skis, alors A[i, j] =A[i, j 1]. Si la j-me paire de skis est utilise, il esttentant de laffecter au i-me joueur. On fait dsormais lhypothse que les suites s1, . . . , sm eth1, . . . , hn sont ranges dans lordre croissant, ou plus prcisment lont t dans une premirephase de lalgorithme. On a la proprit suivante :

    Lemme 1. (P) Si f : {1, . . . , i} {1, . . . , j} (injective) est telle quil existe i1 i avecf(i1) =j , alorsik=1|sf(k)hk| ik=1|sf(k)hk|, avecfobtenue partir defen changeantles images dei1 eti (doncf(i1) =f(i), f(i) =j etf = f ailleurs).Preuve. Intuitivement, la proprit (P) dit que si on a une attribution avec deux paires deski pour deux skieurs donns, mieux vaut (plus exactement on ne perd rien ) attribuer la pluspetite paire au plus petit skieur et la plus grande paire au plus grand skieur. On pose

    j1 = f(i) A= |sj hi1 |+|sji hi| B= |sj1 hi1 |+|sj hi|.

    40

  • 5/23/2018 algo2

    41/159

    Il faut montrer A B 0. On examine les diffrentes positions relatives de sj1 , sj , hi1 et hi.

    sj1 hi1 hi sj :A B = (sj hi1+ hi sj1 ) (hi1 sj1+ sj hi)= 2(hi hi1 ) 0

    sj1 hi1 sj hi: A B = (sj hi1+ hi sj1 ) (hi1 sj1 sj+ hi)= 2(sj hi1 ) 0

    sj1 sj hi1 hi: A B = (hi1 sj+ hi sj1 ) (hi1 sj1+ hi sj)= 0

    (On a omis les cas hi1 sj1 hi sj et hi1 hi sj1 sj qui sont similaires.)Par la proprit (P), on peut supposer que le i-me skieur se voit attribuer la j-me paire

    de skis. En effet, si ce nest pas le cas pour f, alors f tel que dfini plus haut est meilleureque f, donc est optimale aussi, et attribue la j-me paire de skis au i-me skieur. Et on aA[i, j] =A[i 1, j 1] +|sj hi|. Au total, on a prouv :

    A[i, j] = min(A[i, j 1], (A[i 1, j 1] +|sj hi|)).

    Lalgorithme consiste donc calculer cesA[i, j], et si lon veut calculer lattribution fen mme

    temps, on notef(i) =j au passage si on est dans le deuxime cas.

    Complexit Combien dentres A[i, j] faut-il calculer? Il est facile de voir que les appelsrcursifs depuis A[n, m] laissent de ct les deux triangles gauche infrieur et droite suprieurde la matrice (n, m) qui ensemble ont une dimension (n, n). Donc, ce ne sont pas nm, mais(m n)n entres qui sont calculer. Si lon compte le temps du tri des deux suites, on arrivedonc une complexit

    O((m log m) + (n log n) + (m n)n).Ceci est satisfaisant dans le cas particulier o m= n : on obtient alors O(m log m), et en effet,si m = n, il suffit de trier les deux suites et de poser f = id(ce qui se voit par rcurrence enutilisant la proprit (P)). (Noter que la complexit mal affine O(m log m) +O(n log n) +mn

    aurait donnO(n2).)

    Grand choix de skis On remarque que si les listes sont tries, on peut se contenter, pourchaque skieur, de trouver la meilleure paire de skis et les n 1meilleures paires de skis aprs lameilleure, de part et dautre de la meilleure longueur. Cette fentre Side taille2n1permet deprvoir les conflits avec les autres skieurs. Plus prcisment, les paires de skis ainsi dterminesreprsentent un ensemble S=

    ni=1 Si de n(2n 1) paires de skis avec de possibles rptitions

    tel que lon peut dfinir une injection f : {1, . . . , n} Savec f(i) Si pour tout i (choisirsuccessivement une paire de skis diffrente pour chaque skieur, la marge de manoeuvre laissedau moins n 1autres paires de skis pour chaque skieur garantit que cest possible). On peutdonc appliquer ltude du dbut net cet ensembleSdont le cardinal est au plusn(2n1). Letemps pris pour dterminer le sous-ensemble Sest O(n((log m) + n)): le premier n correspond la recherche des Si successifs,log mest le temps pour dterminer la meilleure paire de skis (pardichotomie dans la liste trie des si), et le dernier n correspond la taille de la fentre autourde la meilleure hauteur.

    Il reste voir quune solution optimale pour ce sous-ensemble de paires de skis est optimalepour lensemble de toutes les paires de skis. On remarque que pour tout j / S, on a parconstruction que pour tout i il existe au moins n lmentssj1 , . . . , sjn deSi tels que |sj hi|

    41

  • 5/23/2018 algo2

    42/159

    |sjk hi| (1 k n). (Noter ici limportance davoir pris des paires de part et dautrede lameilleure paire de skis.) Si donc il existait une fonction dattribution optimale qui atteintj (ainsipossiblement que dautres valeurs hors de S), on pourrait remplacer sans conflit (cf. ci-dessus)ces valeurs par des valeurs de S, et donc obtenir une autre fonction optimale valeurs dans S.

    La complexit relative netSsexprime comme suit (en y incorporant le temps de recherchedes lments de S) :

    O(n2 log n) + O(n log n) + O((n2 n)n) + O(n((log m) + n)) =O(n3 + n log m).

    Ce temps est meilleur que le temps obtenu en (A2) si n2

    = o(m), car alors O(n3

    +n log m) =o((m log m) + (n log n) + (m n)n). En effet,(n log m)/(m log m)et n3/(m n)ntendent vers0 (noter quon a fortiori n= o(m)).

    3.4 Exercices

    Exercice 3.4.1. Triangulation de polygones

    On considre les polygones convexes du plan. Une triangulation dun polygone est un en-semble de cordes qui ne se coupent pas lintrieur du polygone et qui le divisent en triangles.

    1 - Montrer quune triangulation dun polygone ncts a (n 3)cordes et (n 2)triangles.2 - Le problme est celui de la triangulation optimale de polygones. On part dun polygoneconvexe P= v0,...,vn, ov0, . . . , vn sont les sommets du polygone donns dans lordre direct,dfinie sur les triangles forms par les cts et les cordes de P(par exemplew(i,j,k) = vivj +vj vk+vkvi est le primtre du trianglevivjvk). Le problme est de trouver une triangulationqui minimise la somme des poids des triangles de la triangulation.

    On dfinit pour 1 i < j n,t[i, j]comme la pondration dune triangulation optimale dupolygonevi1,...,vj, avect[i, i] = 0pour tout 1 i n.

    Dfinirt rcursivement, en dduire un algorithme et sa complexit.

    3 - Si la fonction de poids est quelconque, combien faut-il de valeurs pour la dfinir sur touttriangle du polygone ? Comparez avec la complexit obtenue.

    4 - Si le poids dun triangle est gal son aire, que pensez-vous de lalgorithme que vous avezpropos?

    Correction.

    1- On procde par rcurrence sur n 3.Pour n= 3, le polygne est un triangle, qui a bien n 2 = 1triangle et n 3 = 0corde.Soit n N, n3. On suppose le rsultat dmontr pour tout polygne convexe possdant unnombre de cts strictement infrieur n. Soit alors un polygne n cts et une triangulationde ce polygne. Considrons une corde qui divise ce polygne en deux polygnes, respectivement (i + 1) et (j+ 1) cts avec i +j = n, i 2, j 2(comme le montre la figure 3.4).

    Par hypothse de rcurrence, on a (i

    2) cordes dans le premier polygne et j

    2dans lesecond, ce qui fait pour le polygne entier (i 2) + (j 2) + 1 = n 3 cordes en tout (le +1reprsente la corde qui sparait le polygne en deux).

    De mme, on obtient un total de(i 1 ) + (j 1) =n 2triangles dans le polygne en tout,ce qui achve la dmonstration.

    2- Pour trouver une formule de rcurrence sur t, il suffit de saperevoir que le vi1vjfait partie dun triangle dont le troisime sommet est vk. On en dduit la formule : t[i, j] =

    42

  • 5/23/2018 algo2

    43/159

    i + 1 cts

    j+ 1 cts

    Fig.3.4 Une corde (en bleu) qui divise un polygone en deux

    minikj1(t[i, k]+ t[k+1, j]+w(i1, k , j))(On remarque que la conventiont[i, i]est bien adap-te puisque la formule ci-dessus reste vraie quandj = i+1: on a bient[i, i+1] =w(i1, i , i+1).).

    Nous pouvons maintenant crire un algorithme qui calculet[1, n], et ce partir dest[k, j], i +1 k jet dest[i, k], i k j 1, cest dire, si lon reprsente les valeurs calculer dans undiagramme(i, j)comme celui donn dans la figure 3.5, partir des valeurs situes en-dessous

    et droite du point (1, n). On saperoit alors quil suffi

    t de calculer les t[i, j]pour i de 1 net pour j i, et ce par (j i)croissant.

    F

    /

    /

    7G.BCH

    *

    *

    C

    .

    7G*B/H

    Fig.3.5 Diagramme (i, j)des valeurs calculer par lalgorithme de rsolution

    43

  • 5/23/2018 algo2

    44/159

    Ceci donne lalgorithme :dbut

    pouri de0 nfairet[i, i] 0

    pourd de 1 n 1fairepouri de1 n dfaire

    t[i, i + d] minikj1(t[i, k] + t[k+ 1, j] + w(i 1, k , j))Retournert[1, n]

    fin

    Cet algorithme calcule t[i, j]en 2(j i)additions et en j i 1comparaisons pour calculer lemin.

    Le nombre total dadditions est donc : An=n1

    d=1((n d)(2d))o (n d)correspond aunombre det[i, j] calculer sur la diagonale j i= d et 2dau nombre dadditions dans le calculde chaque t[i, j]o j i= d, ce qui nous donne :

    An = 2n n1d=1

    d 2n1d=1

    d2

    = 2n n (n 1)

    2 2 (n 1) n (2n 1)

    6

    = (n 1) n (n + 1)3

    n3/3 = (n3)

    Pour calculer le nombre Tn de tests effectuer, il suffit de remarquer quon fait deux foismoins de tests que dadditions dans le calcul du minimum, ce qui nous donne Tn =An/2 Cno Cn reprsente le nombre total de t[i, j]calculs (ie le nombre daffectations) On en dduit :

    Tn = An/2 n1d=1

    (n p)

    = (n3)

    La complexit globale de lalgorithme est donc en (n3).

    3- Dans le cas gnral, il faut autant de valeurs pour dfinir la fonction w quil ny a detriangles possibles, soit C3n+1 = (n

    3). Comme il faudra bien lire chacune de ces valeurs pourconstruire une triangulation optimale, nimporte quel algorithme doit fonctionner en une com-plexit dau moins (n3). Notre algorithme est donc optimal en complexit du point de vue delordre de grandeur.

    4- Dans le cas o le poids dun triangle est gal son aire, toutes les triangulations donnentle mme poids qui est laire du polygne. Lalgorithme prcdent est donc inadapt, et on peut la place procder par