Académique Documents
Professionnel Documents
Culture Documents
Cest en forgeant quon devient forgeron... Ce vieil adage, dont les hommes ont us depuis la nuit des temps, est mis dans cet ouvrage au service des tudiants de licence et de premire anne de master de mathmatiques et dinformatique, des lves-ingnieurs et de toute autre personne souhaitant goter les joies et matriser les dicults de lalgorithmique. Au cur de linformatique, cette science est celle de la conception de mthodes ecaces pour rsoudre des problmes laide dun ordinateur. Elle dnit des outils gnraux permettant de rpondre aux questions suivantes : Sur quelle proprit mathmatique dun problme peut-on tablir une mthode de rsolution ? tant donn un algorithme, rsout-il le problme pos ? Lorsque lon dispose de deux mthodes de rsolution direntes, laquelle est prfrable ? Lalgorithmique a donn lieu de nombreux ouvrages remarquables depuis plus de trente ans, sur lesquels se fondent les enseignements dispenss dans les universits et coles dingnieurs, et dont nous donnons une liste non exhaustive la n de cet ouvrage. Lexprience des auteurs, enseignants chevronns dans direntes universits, les a depuis longtemps confronts aux dicults de leurs tudiants face cette matire. Celles-ci semblent de plusieurs ordres : il est ncessaire de pouvoir exprimenter les algorithmes sur dirents exemples pour en comprendre intuitivement le fonctionnement ;
apprendre des lments de cours implique de pouvoir refaire, au besoin, les dmonstrations qui y ont t prsentes, de les rdiger ; les algorithmes manipulent des entits qui voluent dans le temps, et cela ajoute une dimension inhabituelle aux raisonnements mathmatiques ncessaires pour les prouver et analyser leurs performances ;
lapprentissage souvent simultan dun langage de programmation peut parfois ajouter des dicults de comprhension dues la syntaxe propre du langage. Cest pour rpondre ces dicults que les auteurs ont form le projet de cet ouvrage, partir dexercices progressifs conus lors de leurs annes de pratique, et utiliss dans le cadre de travaux dirigs, dexamens, ou pour des devoirs de plus grande envergure. Louvrage a pour objectif daider ltudiant dans son apprentissage de la conception et de lanalyse dalgorithmes en insistant sur le raisonnement et sa rdaction, en vue dcrire dans le langage de son choix des programmes ecaces. Si la plupart des ouvrages de cours dalgorithmique contiennent des noncs dexercices, peu sont corrigs. Cest donc lune des originalits de ce livre que de
VII
Avant-propos
proposer une correction entirement rdige, rigoureuse et complte de chaque question. On y trouvera, pour chaque notion, des exercices visant la comprhension du cours, qui permettent dappliquer un algorithme connu des donnes numriques, ou de redmontrer, partir dlments de base dont les dnitions sont explicites, les proprits de certains algorithmes du cours dcomposes en questions progressives. On y trouvera aussi des exercices qui enrichissent des algorithmes classiques de nouvelles fonctionnalits ou qui permettent de les intgrer dans des applications originales. Concernant la programmation, le parti pris de cet ouvrage est demployer, pour la rdaction des algorithmes, un pseudo-langage impratif, plutt quun vritable langage de programmation, an de se concentrer sur ce qui ressort de la conception de lalgorithme, et non sur son implmentation. Ce choix devrait toutefois permettre une implmentation aise des algorithmes dans des langages comme Pascal, C ou C++, avec sans doute un eort supplmentaire en ce qui concerne les langages objets. Nous indiquons plus loin les conventions dcriture de ce langage, auxquelles le lecteur pourra se rfrer pour comprendre, mais aussi pour programmer les algorithmes dans le langage de son choix. Louvrage aborde un panel assez vaste de domaines dapplication de lalgorithmique, et devrait couvrir la plupart des cours dispenss actuellement en license et master de mathmatiques et informatique et en coles dingnieurs. On y dveloppe notamment, aprs un chapitre mthodologique qui traite de la preuve et de lanalyse de la complexit dun algorithme, les types de donnes abstraits pour reprsenter, grer et manipuler des ensembles dynamiques, et leur implmentation laide de structures de donnes linaires ou arborescentes (piles, les, listes, arbres binaires de recherche, arbres quilibrs, tas). On aborde ensuite ltude des algorithmes de tri. Les chapitres suivants sont consacrs ltude de lalgorithmique de base des graphes valus et non valus : connexit, accessibilit, parcours, arbres couvrants et chemins de cot minimum, pour ne citer que les principaux problmes abords. Ensuite, deux chapitres consacrs lun aux algorithmes relatifs la gomtrie plane et lautre aux algorithmes relatifs aux automates et aux mots achvent cet ouvrage. Dans chaque section, les exercices sont prsents dans un ordre de dicult croissante, sauf ncessit de regroupement thmatique, et souvent les questions dun exercice respectent une certaine progressivit dans la dicult. Dautres algorithmes auraient mrit de gurer dans ce livre, plus proches de lalgorithmique numrique, ou de la recherche oprationnelle. Avec quelques encouragements, les auteurs pourraient envisager une suite...
VIII
Avant-propos
Prrequis
Le livre ncessite les connaissances de mathmatiques du niveau des deux premires annes de licence, en particulier une bonne matrise du raisonnement par rcurrence, ainsi que la connaissance de base dun langage de programmation. Chacun des chapitres demande des prrequis, explicits dans les exercices lorsque cela semble ncessaire. Il est recommand de traiter les exercices en ayant dautre part tudi un cours oral ou un livre de rfrence. Toutefois, de nombreux exercices peuvent tre traits en se rfrant uniquement aux dnitions et rsultats de base rappels en dbut de sous-chapitre. Cet en-tte de chapitre na pas pour objectif dtre un abrg de cours. Les dnitions prsentes sont loin dtre exhaustives, mais sont celles juges indispensables pour traiter les exercices avec le plus dautonomie possible.
si condition alors instruction sinon instruction nsi ; tant que condition faire instruction ntantque ; rpter instruction jusqu condition nrpter ; pour variable de valeur initiale valeur nale faire instruction npour ; pour tout lment dun ensemble faire instruction npour.
Les tableaux sont indexs par des entiers, et un lment dindice i dun tableau T scrit T [i], de mme les lments dun tableau M deux dimensions se notent M [i, j]. La principale spcicit du pseudo-langage est le traitement des pointeurs. Dabord, nous nous aranchissons des problmes lis lallocation dynamique de mmoire (les objets manipuls sont supposs allous). Ensuite, pour ne pas alourdir la prsentation des algorithmes, lorsquune variable x dsigne un pointeur sur un enregistrement plusieurs champs, par exemple un enregistrement comportant des champs nomms a et b, alors on notera x.a la variable correspondant au champ a de lenregistrement point par x. La mme notation sera employe lorsque x reprsente lenregistrement lui-mme. Un pointeur qui ne pointe sur aucun enregistrement a la valeur nul.
IX
Avant-propos
Remerciements
Les auteurs se souviennent avec tendresse du vide de leurs premiers regards quune explication miraculeuse a un jour allum dune petite amme. Ils saluent leurs matres, qui leur ont inculqu une forme de pense archaque consistant chercher en toute circonstance la matrise absolue de la situation, par lintermdiaire dune preuve au pire longue et laborieuse, au mieux lgante et belle. Ils arrosent dune larme mue les bancs des facults, uss par ceux qui ont, depuis vingt ans, leur insu, particip la conception de cet ouvrage. Ils remercient chaleureusement les collgues dont ils ont sans vergogne pill les archives.
Troisime dition
La troisime dition introduit dans la plupart des chapitres des exercices nouveaux qui se caractrisent par une plus grande originalit, une plus grande dicult et par leur intrt pdagogique pour apprhender en profondeur les fondements thoriques des concepts algorithmiques prsents dans le chapitre.
P REUVE
ET COMPLEXIT
Un algorithme (O, V, S) est form dun ensemble ni O doprations lies par une structure de contrle S et dont les oprandes portent sur un ensemble ni V de variables. Un algorithme rsout le problme P si pour tout nonc I de P (stock dans le sous-ensemble des variables dentre de V), dune part la suite des oprations excutes est nie (condition de terminaison) et si dautre part, lors de la terminaison, le sous-ensemble des variables de sortie de V contient le rsultat associ lnonc I (condition de validit). Prouver un algorithme, cest dmontrer mathmatiquement que la proprit prcdente est satisfaite. Une mesure de complexit dun algorithme est une estimation de son temps de calcul, mmoire utilise ou de toute autre unit signicative. On sintresse le plus souvent la recherche dune estimation par excs une constante positive multiplicative prs du cas le plus dfavorable sur le sousensemble des noncs de taille xe n (complexit dite pire-cas ). On obtient ainsi le taux asymptotique de croissance de la mesure indpendamment de la machine sur laquelle lalgorithme est excut et lon peut alors comparer les complexits pire-cas de plusieurs algorithmes rsolvant un mme problme. Ce chapitre propose dexercer cette dmarche danalyse sur des algorithmes de base, itratifs et rcursifs, en demandant le dveloppement dtaill des preuves laide de questions progressives. An de dnir rigoureusement la notion de mesure de complexit, nous introduisons les trois notations de Landau relatives aux ensembles de fonctions O(g), (g) et (g), lorsque g est une fonction de I N dans I N.
Dnition 1.1 Borne suprieure asymptotique
Si une fonction f (n) O(g(n)), on dit que g(n) est une borne suprieure asymptotique pour f (n). On note abusivement : f (n) = O(g(n)).
Chapitre 1
Preuve et complexit
(g(n)) = { f : I NI N | k > 0 et n0 0 tels que n n0 0 k g(n) f (n)} Si une fonction f (n) (g(n)), on dit que g(n) est une borne infrieure asymptotique pour f (n). On note abusivement : f (n) = (g(n)).
Dnition 1.3 Borne asymptotique
(g(n)) = { f : I NI N | k1 > 0, k2 > 0 et n0 0 tels que n n0 0 k1 g(n) f (n) k2 g(n)} Si une fonction f (n) (g(n)), on dit que g(n) est une borne asymptotique pour f (n). On note abusivement : f (n) = (g(n)).
1. Dmontrer que
Soient f , g, S et T : I NI N.
4. Montrer que si f (n) O(g(n)), alors g(n) ( f (n)). 5. Montrer que si f (n) O(g(n)), alors f (n) + g(n) O(g(n)). 6. Montrer que f (n) + g(n) (max( f (n), g(n))).
2
Exercices
1. Pour la premire relation, il sut donc de trouver deux entiers strictement positifs k et n0 tels que n2 k 105 n3 n n0
Si lon prend k = 105 et n0 = 1, il est vident que n2 k 105 n3 = n3 n n0 donc n2 O(105n3 ). Pour la seconde relation, remarquons tout dabord que 25n4 19n3 + 13n2 25n4 + 19n3 + 13n2 (25 + 19 + 13)n4 n 1 On en dduit que 25n4 19n3 + 13n2 O(n4 ). Il sut en eet de choisir k = 25 + 19 + 13 = 57 et n0 = 1. Finalement, soit k = 2100 et n0 = 0, il est vident que 2n+100 k2n n n0
1 log n n 3 et log n n n 1 et pour la mme raison, O(n log n) O(n2 ). On montre facilement que O(n3 ) O(2n ). En eet, n3 2n log n3 log 2n 3 log n n log(2) qui est vrai partir dune certaine valeur de n puisque log n O(n).
3
Chapitre 1
Preuve et complexit
Lordre dinclusion est donc nalement : O(1) O(log n) O(n) O(n log n) O(n2 ) O(n3 ) O(2n ) Un algorithme ayant une complexit logarithmique sera donc meilleur (en terme de complexit) quun algorithme linaire, lui-mme meilleur quun algorithme polynomial, son tour meilleur quun algorithme exponentiel.
60 4,09 106 6 105 2,46 104 3,60 103 2,16 101 1,15 1012
1,02 10
1,05
1,07 10
6. De faon vidente,
max( f (n), g(n)) f (n) + g(n) 2 max( f (n), g(n)) n 0 f (n) + g(n) est donc en (max( f (n), g(n))).
7. Pour montrer lgalit des deux ensembles O( f (n) + g(n)) et O(max( f (n), g(n))), il
faut montrer la double inclusion. O( f (n) + g(n)) O(max( f (n), g(n))) :
4
Exercices
Pour toute fonction h(n) O( f (n) + g(n)), il existe k > 0 et n0 0 tels que h(n) k( f (n) + g(n)) 2k max( f (n), g(n)) n n0 Donc h(n) est donc en O(max( f (n), g(n))). O(max( f (n), g(n))) O( f (n) + g(n)) : Pour toute fonction h(n) O(max( f (n), g(n))), il existe k > 0 et n0 0 tels que h(n) k max( f (n), g(n)) k( f (n) + g(n)) n n0 Donc h(n) est en O( f (n) + g(n)).
Si dans un algorithme, on a une premire partie en O( f (n)) dans laquelle est imbrique une seconde partie en O(g(n)), alors lalgorithme est globalement en O( f (n)g(n)).
Chapitre 1
Preuve et complexit
3. crire un algorithme rcursif qui calcule la somme des lments de A et prouver cet algorithme. 4. Dterminer la complexit de cet algorithme rcursif.
Solution
Sommei =
j=1
A[ j]
la n de litration i + 1, Somme contiendra la valeur quelle contenait la n de litration i, donc la somme des i premiers lments, plus A[i + 1] qui lui a t ajoute litration i + 1. Somme sera donc bien la somme des i + 1 premiers lments de A :
i i+1
A[ j] + A[i + 1] =
j=1
A[ j]
Vraie initialement, la proprit reste vraie chaque nouvelle itration. Cette proprit est donc un invariant de lalgorithme. On parle dinvariant de boucle. Lalgorithme se terminant, la n de litration n, il aura donc bien calcul la somme des n lments du tableau A.
6
Exercices
dente, a(n) = n. On en dduit que lalgorithme est en O(n). Il est noter, que lingalit a(n) n susait aboutir cette conclusion. On peut par ailleurs dduire de lingalit a(n) n que lalgorithme est en (n) et donc nalement conclure quil est en (n).
Sommen =
i=1
A[i]
Ds linstant o la fonction se termine (ce que nous avons prouv), elle calcule bien la somme des lments du tableau A.
4.
nouveau, on appelle a(n) le nombre dadditions eectues par la fonction Somme_Rec appele avec un paramtre n. a(n) est solution de lquation de rcurrence : a (n ) = 0 a(n 1) + 1 si n = 0 si n > 0
dont la solution (vidente) est a(n) = n. On en dduit, nouveau, que lalgorithme est la fois en O(n) et en (n), donc globalement en (n).
Chapitre 1
Preuve et complexit
fonction F (n : entier) : entier si n = 0 alors retourner(2) sinon retourner(F (n 1) F (n 1)) n si Que calcule cette fonction ? Le prouver.
2. Dterminer la complexit de la fonction F . Comment amliorer cette complexit ? 3. Soit la fonction itrative G suivante :
fonction G(n : entier) : entier R : entier R2 pour i 1 n faire RRR n pour retourner(R) Que calcule cette fonction ? Le prouver.
4. Dterminer la complexit de la fonction G.
Solution
Exercices
La terminaison de la fonction F se dmontre par rcurrence sur n. De faon vidente, lappel de la fonction F avec un paramtre 0 se termine immdiatement. Si on suppose que lappel de la fonction F avec un paramtre n se termine, lappel de la fonction F avec le paramtre n + 1 appelle deux fois la fonction F avec le paramtre n, ces deux appels se terminant par hypothse, multiplie les deux rsultats (identiques) obtenus et se termine. Si on note Fn la valeur retourne par lappel de la fonction F avec le paramtre n, la fonction rcursive F reproduit la relation mathmatique suivante : F0 = 0 2 Fn = Fn1 Fn1 = Fn 1 si n > 0
On montre alors par rcurrence sur n que la solution de cette relation de rcurrence est : F n = 22
n
Cette relation est bien satisfaite pour n = 0. Si on la suppose satisfaite pour n, Fn = 22 , on calcule Fn+1 partir de la relation de rcurrence :
2 = (22 )2 = 22 Fn+1 = Fn
n n+1
2i = 2n 1. On en dduit que
lalgorithme est en (2n ) et possde donc une complexit exponentielle. Pour amliorer lalgorithme, il sut bien videmment dviter le double appel rcursif ; la fonction F scrit alors : fonction F (n : entier) : entier si n = 0 alors retourner(2) sinon retourner(F (n 1)2 ) n si On calcule alors la complexit par rapport au nombre c(n) dappels de la fonction carr . c(n) est solution de lquation de rcurrence : c( n ) = 0 c(n 1) + 1 si n = 0 si n > 0
9
Chapitre 1
Preuve et complexit
3. La fonction G calcule la mme valeur que la fonction F . Pour le dmontrer il faut prouver la terminaison et la validit de lalgorithme.
La terminaison est triviale puisque lalgorithme eectue n itrations. Pour prouver la validit, il faut dterminer un invariant de boucle. On se propose de i prouver que la proprit suivante en est un : la n de litration i, R = 22 . Cette proprit est vrie la n de la premire itration, puisque R (initialis 2) vaut 1 alors 4 = 22 . Si on suppose que la proprit est vraie pour i, la n de litration i + 1, i+1 2i 2i R = 2 2 = 22 . La proprit est donc bien un invariant de boucle. Elle est donc vraie n la terminaison de lalgorithme. Celui-ci calcule donc bien 22 .
On considre deux matrices carres (dentiers) dordre n, A et B. Le produit de A par B est une matrice carre C dnie par :
n
Ci, j =
k=1
Ai,k Bk, j
1. Donner un algorithme calculant le produit de deux matrices reprsentes sous forme dun tableau deux dimensions. Calculer la complexit de cet algorithme. Doit-on prciser dans quels cas (pire cas, meilleur des cas, cas moyen) cette complexit est obtenue ? 2. Modier lalgorithme prcdent lorsque la matrice A est de dimension (m, n) et la matrice B de dimension (n, p). Quelle est alors la complexit de lalgorithme ?
Solution
Exercices
Si lon sintresse au nombre a(n) dadditions (ou de multiplications) eectues par lalgorithme, on obtient de faon immdiate que a(n) = n3 . On en dduit que lalgorithme est en (n3 ). Il ny a donc ici ni meilleur ni pire des cas.
Dterminer la complexit des algorithmes suivants (par rapport au nombre ditrations eectues), o m et n sont deux entiers positifs. Algorithme A i 1; j 1 tant que (i m) et ( j n) faire i i+1 j j+1 n tant que
Dunod. La photocopie non autorise est un dlit.
11
Chapitre 1
Preuve et complexit
Algorithme C i 1; j 1 tant que j n faire si i m alors ii+1 sinon j j+1 n si n tant que
Algorithme D i 1; j 1 tant que j n faire si i m alors ii+1 sinon j j+1 i1 n si n tant que
Solution Le corps des dirents algorithmes ne contient que des oprations en O(1). En comptant le nombre ditrations eectues par chacun des algorithmes, on obtient immdiatement que :
lalgorithme A est en O(min(m, n)) ; lalgorithme B est en O(max(m, n)) ; lalgorithme C est en O(m + n) ; lalgorithme D est en O(mn).
On considre la fonction suivante, qui a deux arguments : un tableau T [0..n] de n + 1 nombres rels et un nombre rel x.
12
Exercices
fonction Calcul(T : tableau ; x : rel) : rel s T [n] pour i n 1 0 faire s T [i] + x s n pour retourner( s)
1. Donner le droulement de lalgorithme pour la donne suivante :
n=5 T = 3
et x = 2
2. Exprimer le rsultat de la fonction Calcul en fonction de x et de T . Que calcule cette fonction ? Le prouver. 3. crire une fonction rcursive ralisant le mme calcul. Prouver lalgorithme.
Solution
si =
j=i
T [ j] x ji
On en dduit que la fonction Calcul value le polynme de degr n dont les coecients sont les valeurs du tableau T , au point x :
n
s0 =
j=0
T [ j] x j
On vient en fait de dmontrer la validit de lalgorithme. Il reste vrier la terminaison. Celle-ci est bien sr triviale puisque lalgorithme nest constitu que dune boucle de n itrations.
13