la Complexté Algorithmique
Cours et exercices Filière SMI
2016-2017
Mustapha kchikech
Département de Mathématiques et Informatique
Faculté Polydsciplinaire-Safi
Université Cadi Ayyad
Introduction iii
1 Complexit´e algorithmique 1
1.1 Introduction . . . 1
1.2 Complexit´e des algorithmes . . . 2
1.2.1 Motivation . . . 2
1.2.2 Complexit´e . . . 3
1.2.3 Analyse des algorithmes . . . 3
1.2.3.1 Taille des donn´ees . . . 4
1.2.3.2 Le temps d’ex´ecution . . . 5
1.2.3.3 Evaluation des coˆ´ uts . . . 5
1.2.3.4 Objectif . . . 6
1.2.3.5 Evaluation du temps de calcul . . . .´ 6
1.2.3.6 Evaluation de T(n)´ . . . 6
1.2.4 Notation asymptotique . . . 7
1.2.4.1 Pourquoi une analyse asymptotique ? . . . 7
1.2.4.2 D´efinition Θ-Notation . . . 8
1.2.4.3 D´efinition,O-Notation . . . 9
1.2.4.4 Complexit´e d’un algorithme . . . 9
1.2.4.5 Classes de complexit´e . . . 9
1.2.4.6 Hi´erarchie entre les classes de complexit´e . . . 10
1.2.5 Exemples et exercices . . . 11
2 R´eurrence 13 2.1 Pr´esentation . . . 13
2.2 R´esolution des r´ecurrences . . . 15
2.2.1 M´ethode it´erative . . . 16
2.2.2 M´ethode de substitution . . . 18
2.2.3 M´ethode g´en´erale . . . 20
2.2.4 DIVISER-POUR-R ´EGNER . . . 20
2.3 R´esolution des r´ecurrences . . . 21
2.3.1 Th´eor`eme g´en´eral : . . . 22
2.3.1.1 Signification intuitive du th´eor`eme . . . 22
2.4 Exercices . . . 23
Ce polycopi´e pr´esente une introduction sur la complexit´e algorithmique et des notions sur la r´ecurrence en algorithmique. L’objectif est de pr´esenter des concepts fondamentaux de la th´eorie de la complexit´e algorithmique qui offrent un ensemble d’outils permettant d’analyser, de comparer et d’optimiser des algorithmes par la suite des programmes informatique.
Par cons´equent, ce document met ´egalement `a la disposition des ´etudiants un sup- port de cours qui pourrait leur permettre d’acqu´erir et d’am´eliorer leurs comp´etences en programmation.
Notons que ce document est un support p´edagogique qui s’adresse principalement aux
´
etudiants de la fili`ere SMI semestre 4 de la Facult´e Poly-disciplinaire de Safi, universit´e cadi Ayyad. Il pourrait ´egalement servir comme support de cours aux ´etudiants d’autres fili`eres.
Complexit´ e algorithmique
1.1 Introduction
— Le mot algorithme provient du nom du math´ematicien arabe du IXe si`ecle,Mo- hammed Ibn-Moussa Al-Khuwarizmi (livre d’arithm´etique).
— Autant dire que les algorithmes sont connus et utilis´es bien avant les d´ebuts de l’informatique.
— Premier algorithme est l’Algorithme d’EUCLIDE (300 avant JC) pour calculer le plus grand diviseur commun de deux entiers.
— La notion actuelle d’algorithme a ´et´e ´elabor´ee par les logiciens des ann´ees 1930 (Herbrand, G¨odel, Church et Turing).
— En 1968, Knuth publia le premier ouvrage The Art of Computer Programming sur l’´etude moderne des algorithmes informatiques.
— Il existediff´erentesfa¸cons ded´efinir un algorithme. C’est pourquoi, nous pr´esentons ici quelques d´efinitionsqui peuvent donner une id´ee sur la notion d’algorithme.
— Un algorithme est une proc´edure de calcul bien d´efinie, qui prend en entr´ee une valeur, ou un ensemble de valeurs, et qui produit, en sortie, une valeur ou un ensemble de valeurs. Un algorithme est donc une s´equence d’´etapes de calcul per- mettant de passer de la valeur d’entr´ee `a la valeur de sortie.
— Un algorithme est une proc´edure de calcul sp´ecifique permettant d’obtenir une relation d´esir´ee entre l’entr´ee et la sortie d’un probl`eme.
— L’algorithmique est la branche de l’informatique qui traite des algorithmes.
Exemple 1.
— Algorithmes d’Euclide :
Entr´ee : deux entiers naturels a,b Sortie : pgcd(a,b)
— Calcul de puissance :
Entr´ee : deux entiers naturels a,n Sortie : an
— Algorithmes de tri :
Entr´ee : un tableau de n entiers tab= [a0, a1,· · ·, an−1]
Sortie : un tableau de n entiers tab= [b0, b1,· · ·, bn−1] t.q.b0 ≤b1 ≤ · · · ≤bn−1
— Algorithme de recherche dans un arbre binaire de recherche : Entr´ee : un arbre binaire de recherche, une valeur v
Sortie : une r´eponse :la valuer figure oui ou non dans l’arbre
— Test de primalit´e :
Entr´ee : un entier naturel n
Sortie : une r´eponse :n est premier oui ou non
— · · ·
1.2 Complexit´ e des algorithmes
1.2.1 Motivation
— Un algorithme est ditcorrect si, pour chaque donn´ee en entr´ee, il doit fournir la bonne sortie.
— Dans ce cas, on dit que l’algorithme (correct)r´esout leprobl`eme donn´e.
— Pour r´esoudre informatiquement un probl`eme donn´e, on implante donc un al- gorithme sur un ordinateur. C-`a-d, l’algorithme sera r´e´ecrit avec un langage de programmation.
— Mais, pour un probl`eme donn´e, il existe bien souvent plusieursalgorithmesqui le r´esout.
— Cesalgorithmesdiff`erent entre eux en termes d’efficacit´e. Ces diff´erences peuvent ˆ
etre bien plus importantes que celles dues au mat´eriel et au logiciel.
— Y a-t-il un int´erˆet `a choisir des algorithmes ? et si oui comment choisir ?
1.2.2 Complexit´e
En informatique, la notion decomplexit´e signifiedeux concepts:
— la complexit´e des algorithmes : C’est l’´etude de l’efficacit´e compar´ee des algo- rithmes.
— En effet, la complexit´eintroduit la notion decoˆut et montre qu’il ne suffit pas de trouver une m´ethode correcte pour r´esoudre un probl`eme, il faut aussi que cette m´ethode soit efficace.
— L’efficacit´e est mesur´ee par le temps et l’espace n´ecessaire `a un algorithme pour r´esoudre un probl`eme.
— La complexit´e des probl`emes: C’est l’´etude qui permet classification des probl`emes en fonction des performances des meilleurs algorithmes connus qui les r´esolvent.
Pour notre cours, on parlera de la complexit´e c’est pour designer la complexit´e des algorithmes.
Remarque 1.
1.2.3 Analyse des algorithmes
— Lar´esolution informatiqued’un probl`eme donn´e passe par un algorithme qui est impl´ement´e par un langage de programmation.
— L’ex´ecution d’un programme a un coˆut. Il existe deux param`etres essentiels pour
´
evaluer ce coˆut :
— le temps d’ex´ecution :la complexit´e temporelle
— l’espace m´emoire requis : la complexit´e spatiale
— Ainsi, analyser un algorithme est une op´eration qui consiste `a pr´evoir les res- sources n´ecessaires (m´emoire, temps de calcul) au programme qui impl´emente cet algorithme.
— Pour pouvoir analyser un algorithme, il faut avoir un mod`ele de la technologie qui sera employ´ee.
— En algorithmique, les algorithmes sont analys´es selonles calculs dans un mod`ele g´en´eriquedemachine `a acc`es al´eatoires (RAM=Random Access Machine), `a pro- cesseur unique.
— Dans le mod`ele RAM, les instructions sont ex´ecut´ees l’une apr`es l’autre, sans op´erations simultan´ees.
— En r´esum´e,
Analyse des algorithmes⇐⇒´etude de la complexit´e des algorithmes
1.2.3.1 Taille des donn´ees
Si l’on prend en compte tous les param`etres : fr´equence d’horloge, nombre de proces- seurs, temps d’acc`es disque,... l’estimation de ces ressources peut :
— ˆetre assez compliqu´ee, voire irr´ealisable,
— devenir irr´ealiste d`es que l’on change d’architecture.
— Pour cela on se contente souvent d’estimer l’influence de la taille des donn´ees sur la taille des ressources n´ecessaires. Ainsi,
La taille des donn´ees d´epend du probl`eme ´etudi´e
— On appelle les entr´ees ou les instances lataille des donn´eesn´ecessaires `a un algo- rithme pour r´esoudre un probl`eme donn´e.
— La taille nva d´ependre du codage de ces entr´ees
Exemple :en binaire, il fautblog2(n)c+ 1bits pour coder l’entier n.
— En pratique, on choisit comme taille la ou les dimensions les plus significatives.
— Exemple :
— des matrices m×n:max(m, n),m.n,m+n
— des listes, tableaux, fichiers : nombre de cases, d’´el´ements
— des chaˆınes de caract`eres : leur longueur
1.2.3.2 Le temps d’ex´ecution
— Le temps d’ex´ecution d’un algorithme sur une entr´ee particuli`ere est le nombre d’op´erations ´el´ementaire (affectations, comparaisons, op´erations arithm´etiques), ex´ecut´ees.
— Le temps d’ex´ecution du programme d´epend :
— des donn´ees du probl`eme pour cette ex´ecution
— de la qualit´e du code engendr´e par le compilateur
— de la nature et de la rapidit´e des instructions offertes par l’ordinateur
— de l’efficacit´e de l’algorithme
— de l’encodage des donn´ees
— ... et aussi de la qualit´e de la programmation
— En g´en´eral, on ne peut pas mesurer le temps de calcul sur toutes les entr´ees possibles. Il faut trouver une autre m´ethode d’´evaluation.
— L’id´ee estd’´evaluer le temps de calculen fonction d’unegrandeur nrepr´esentant la taille des donn´ees.
1.2.3.3 Evaluation des coˆ´ uts
— P :unprobl`emeetM:une m´ethodepour r´esoudre le probl`eme P
— AlgorithmeA:descriptiondeMdans un langage donn´e (algorithmique, C/C++, Java, ...)
— Structures de contrˆole :
— s´equence (suite d’instructions)
— embranchement (ou s´election) : if()ou switch()
— boucle (ou it´eration) : for(); do...while(); while()
1.2.3.4 Objectif
— Evaluer le temps de calcul´ de A pourP
— ComparerA avec un autre algorithmeA0
— L’´evaluation :
— d´epends de la taille du probl`eme,
— doit ˆetre ind´ependante de la machine utilis´ee.
1.2.3.5 Evaluation du temps de calcul´
— Lacomplexit´e d’un algorithmeoul’´evaluation du temps de calcul d’un algorithme est unemesure exprim´eeen fonction de la taille n des donn´ees :
T(n)=nombre d’op´erations ´el´ementaires
— On distingue trois sortes de complexit´es :
— la complexit´e dans le pire des cas :calcul du coˆut dans le pire des cas, Tpire(n) =max
n {T(n)}
— la complexit´e en moyenne : on calcule le coˆut pour chaque donn´ee possible puis on divise la somme de ces coˆuts par le nombre de donn´ees diff´erentes,
Tmoyenne(n) =n1 P
n
{T(n)}
— la complexit´e dans le meilleur des cas :on calcule le coˆut en se pla¸cant dans le meilleur des cas.
Tmeilleur(n) =min
n {T(n)}
— Remarque : Enanalyse de complexit´e, on ´etudie souvent lepire casce qui donne une borne sup´erieure de la complexit´e de l’algorithme.
1.2.3.6 Evaluation de T(n)´
— S´equence (sommes des coˆuts) : Exemple 2.
TraitementT1(n)
· · ·
TraitementTp(n)
⇒T(n) =T1(n) +T2(n) +· · ·+Tp(n)
— Embranchement (Max des coˆuts) : Exemple 3.
si(condition logique) alors TraitementT1(n)
sinon
TraitementT2(n)
⇒T(n) = max(T1(n), T2(n))
— Boucle (Somme des coˆuts de chaque passage) : Exemple 4.
Tant que (condition logique) faire TraitementTi(n)
Fin faire
⇒T(n) =
k
P
i
Ti(n)
k=nombre de r´ep´etition du traitement Ti(n).
1.2.4 Notation asymptotique
1.2.4.1 Pourquoi une analyse asymptotique ?
— En pratique une analyse pr´ecise d’un algorithme mˆeme dans le pire des cas est presque impossible (sauf pour un algorithme simple).
— La solution est d’´etablir uneapproximation asymptotique du temps de calcul de l’algorithme. Autrement, on fait une analyse asymptotique.
— On veut comparer des algorithmes diff´erents sans les impl´ementer, sans d´evelopper des programmes. Pour faire ¸ca on compare l’efficacit´e asymptotique des algo- rithmes.
1.2.4.2 D´efinition Θ-Notation
Soient f etg deux fonctions deNdansR.
— On dit que g(n) est une borne approch´ee asymptotique pour f(n) et l’on ´ecrit f(n)∈Θ(g(n)) s’il existe deux constantes strictement positivesc1 etc2 telles que, pourn assez grand, on ait
0≤c1g(n)≤f(n)≤c2g(n)
— Ceci revient `a dire que f(n) est ´egale `ag(n) `a un facteur constant pr`es.
— Pour indiquer quef(n)∈Θ(g(n)), on ´ecrit f(n) = Θ(g(n))
Exemple 5.
— Montrons quef(n) = 12n2−3n= Θ(n2).
— On doit trouver c1, c2, n0>0 telles que
pour tout n≥n0
c1n2 ≤ 12n2−3n ≤ c2n2 c1 ≤ 12 −n3 ≤ c2
Prenons c2= 12, on a
∀n≥1, 1 2 − 3
n ≤c2 Prenons c1 = 141 , on a
∀n≥7, c1≤ 1 2 − 3
n On prend donc n0 = 7, c1 = 141 etc2 = 12.
1.2.4.3 D´efinition, O-Notation
Soientf etg deux fonctions deNdansR.
— On dit que g(n) est une borne sup´erieure asymptotique pour f(n) et l’on ´ecrit f(n) ∈ O(g(n)) s’il existe une constante strictement positive c telle que pour n assez grand on ait
0≤f(n)≤cg(n)
— Ceci revient `a dire que f(n) est inf´erieure `a g(n) `a une constante pr`es et pourn assez grand.
— Pour indiquer quef(n)∈ O(g(n)), on ´ecrit f(n) =O(g(n))
1.2.4.4 Complexit´e d’un algorithme
— Un algorithmeAr´esout un probl`eme P en temps O(f(n))si pour toute instance de taille n, l’algorithme retourne unesolution correcte avec un coˆut O(f(n)).
— La nature de la fonctionf(n) d´efinie la classe de complexit´e de l’algorithme A.
1.2.4.5 Classes de complexit´e
Lors de l’analyse de complexit´e, on essaie de se ramener aux classes suivantes :
— temps constant :Coˆut : O(1) Exemple : addition, affectation...
— Complexit´e logarithmique : Coˆut : O(log(n))
Exemple : recherche dichotomique dans un tableau tri´e A[1...n]
— Complexit´e lin´eaire : Coˆut : O(n) Exemple : calcul du produit scalaire de deux vecteurs deRn
— Complexit´e quasi-lin´eaire : Coˆut :O(nlog(n)) Exemple : Tri par fusion
— Complexit´e polynˆomial : Coˆut : O(nk),k > 1, pour k = 2, on parle de la Com- plexit´e quadratique Exemple : Multiplication de deux matrices carr´ees d’ordren: O(n3)
— Complexit´e exponentielle : Coˆut : O(an) avec a >1 Exemple : Tours de Hano¨ı
1.2.4.6 Hi´erarchie entre les classes de complexit´e
On peut ´etablir une hi´erarchie entre les classes de complexit´e du plus petit au plus grand:
— O(1)→O(log(n))→O(n)→O(nlog(n))→O(n2)→O(nk)→O(an)
k >2,a >1.
— Comparaison :
1.2.5 Exemples et exercices
1. Quelle est lacomplexit´ede ces parties de programme? somme=0;
for(i=1; i<=n; i++) somme += n;
——————————————-
somme=0;
for (j=1; j<=n; j++)
a for (i=1; i<=n; i++) a somme++;
for (k=0; k<n; k++) a A[k] = k;
——————————————-
somme = 0;
for (i=1; i<=n; i++)
a for (j=1; j<=i; j++) somme++;
——————————————-
somme = 0;
for (i=1; i<=n; i*=2) a for (j=1; j<=n; j++) a somme++;
2. Pour chacun des probl`emes suivants, ´ecrire en langage C une fonction it´erative qui permet de le r´esoudreet donner sa complexit´e.
(a) Puissance n-`eme d’un entier.
(b) Suite de Fibonacci.
(c) Tri des tableaux.
(d) Test de Primalit´e d’un entier.
R´ eurrence
2.1 Pr´ esentation
— Une r´ecurrence est une ´equation ou une in´egalit´e qui d´ecrit une fonction `a partir de sa valeur sur des entr´ees plus petites.
— une fonction est r´ecursive si elle fait appel `a elle-mˆeme d’une mani`ere directe ou indirecte.
— Un algorithme est dit r´ecursif si son temps de calcul peut ˆetre d´ecrit par une r´ecurrence.
— L’utilisation des algorithmes r´ecursifs est une technique de programma- tion qui permet de trouver des solutions d’une grande ´el´egance `a un certain nombre de probl`emes.
— Dans un algorithme r´ecursif, la r´ecursivit´e doit s’arrˆeter `a un moment donn´e (test d’arrˆet). Autrement, l’ex´ecution va continuer ind´efiniment.
— Ce processus est connu sous le nom du processus de r´eduction qui `a chaque appel, on doit se rapprocher de la condition d’arrˆet.
— Attention !: lorsqu’elle mal utilis´ee, on peut cr´eer un code de programme totalement inefficace.
Remarque 2.
Suite de Fibonacci
— La suite de Fibonacci est d´efinie par :
u0 =u1 = 1
un+2=un+1+un si n≥2
— Un algorithme r´ecursif qui calcule leni`eme terme de cette suite : int fib(int n)
{
a if(n<=1) a return 1;
a else
a return fib(n-1)+fib(n-2);
}
— Complexit´e :
— SoitT(n) =nombre d’additions effectu´ees par cet algorithme lors du calcul.
— T(n) v´erifie les ´equations suivantes :
T(0) =T(1) = 1
T(n) =T(n−2) +T(n−1) sin≥2
— C’est une ´equation de r´ecurrence o`u chaque terme d’ordre≥2 d´epend unique- ment des 2 termes qui le pr´ec`edent.
— La solution de l’´equation de r´ecurrence est
T(n) = 5 +√ 5 10
1 +√ 5 2
n
+5−√ 5 10
1−√ 5 2
n
— T(n) =O 1+
√ 5 2
n .
— La complexit´e de cet algorithme est donc exponentielle !
2.2 R´ esolution des r´ ecurrences
Dans ce chapitre, nous allons proposer trois m´ethodes de r´esolution des r´ecurrences, c-`a-d pour obtenir des bornes asymptotiques Θ ouO pour la solution.
— M´ethode it´erative
— M´ethode de substitution
— M´ethode g´en´erale
— En pratique, quand ond´efinitetr´esout des r´ecurrences, on omet souvent les parties enti`eres et les conditions aux limites.
— En fait, ces d´etails n’affectent pas les bornes asymptotiques des r´ecurrences rencontr´ees dans l’analyse des algorithmes. En effet :
— On passe souvent sur le fait que les arguments des fonctions sont des entiers. Normalement, le temps d’ex´ecutionT(n)d’un algorithme n’est d´efinit que pour n entier puisque, dans la plupart des algo- rithmes, la taille de l’entr´ee a toujours une valeur enti`ere.
— Le plus souvent on ignore les conditions aux limites. Puisque le temps d’ex´ecutiond’un algorithme sur une entr´ee de taille constante est une constante, les r´ecurrences sous-jacentes au calcul du temps d’ex´ecution des algorithmes ont g´en´eralement T(n) = Θ(1) pour n suffisamment petit. Ainsi, pour simplifier, on suppose g´en´eralement queT(n) est constant pourn petit.
Remarque 3.
2.2.1 M´ethode it´erative
— L’id´eede la m´ethode consiste `a d´evelopper la r´ecurrenceen sommation.
— On utilise les techniques d’´evaluation des sommations pour trouver les bornes `a la solution.
— Cette m´ethode n´ecessite plus de manipulations alg´ebriques.
Exemple 6.
T(n) = 2T(n
2) + 2n+ 1
On d´eveloppe comme suit :
T(n) = 2n+ 1 + 2T(n 2)
= 2n+ 1 + 2(n+ 1 + 2T(n 4))
= 2n+ 1 + 2(n+ 1 + 2(n
2 + 1 + 2T(n 4)))
= 3(2n) + 1 + 2 + 4 + 23T(n 4)
=· · ·
= 2in+
i−1
P
j=0
2j + 2iT(n 2i) On arrive `a T(1) lorsque n
2i = 1,c-`a-d lorsque i=log(n).Ainsi, T(n) = 2n log(n) +
log(n)−1
P
j=0
2j+nT(1)
= 2n log(n) +n−1 +nΘ(1)
= 2n log(n) +n−1 + Θ(n) Par cons´equentT(n) =O(n log(n))
Exemple 7.
T(n) = 3T(n 4) +n
On d´eveloppe comme suit:
T(n) =n+ 3T(n 4)
=n+ 3(n
4 + 3T(n 42))
=n+ 3(n
4 + 3(n
42 + 3T(n 43)))
=n+3 4n+ (3
4)2n+ 33T(n 43)
=· · ·
=
i−1
P
j=0
(3
4)jn+ 3iT(n 4i)
On arrive `a T(1) lorsque n
4i = 1, c-`a-d lorsque i=log4(n). Ainsi, T(n) = 4n(1−(3
4)log4(n)) + 3log4(n)T(1)
= 4n(1−(3
4)log4(n)) +nlog4(3)Θ(1) car 3log4(n)=nlog4(3)
= 4n+ Θ(nlog4(3)) pour n assez grand (3
4)log4(n)≈0 Par cons´equent T(n) =O(n)
2.2.2 M´ethode de substitution Cette m´ethode recouvre deux phases :
— On conjecture la forme de la solution : c-`a-d on devine (par intuition) une id´ee de la solution.
— On utilise une r´ecurrence math´ematique pour trouver les constantes et pour mon- trer que la solution est correcte.
— Le nom de cette m´ethode vient du fait que l’on substitue la r´eponse suppos´ee `a la fonction quand on appliquel’hypoth`ese de r´ecurrence aux valeurs plus petites.
— Elle ne s’applique que lorsquela forme de la r´eponseest facile `a deviner.
Remarque 4.
Exemple 8.
T(n) = 2T(n 2) +n
On conjecture (par intuition) que la solution est T(n) =O(n log(n)).
La m´ethode consiste `a d´emontrer que T(n) ≤ cn log(n) pour un choix appropri´e de la constante c >0.
On suppose que T(n 2)≤cn
2 log(n 2).
La substitution donne
T(n) ≤2(cn 2log(n
2)) +n
≤cn log(n 2) +n
=cn log(n)−cn log(2) +n
=cn log(n)−cn+n
≤cn log(n) sic≥1
Comment conjecturer les solutions des r´ecurrences ?
— Malheureusement, il n’existe pas de r`egle g´en´erale.
— Deviner une bonne solution ressort de l’exp´erience, c-`a-d se servir des r´ecurrences d´ej`a rencontr´ees. Par exemple si T(n) = 2T(n2 + 100) +n.
Pour n assez grand,T(n2) etT(n2 + 100) sont quasiment les mˆemes. On peut donc supposer queT(n) =O(n log(n)).
— Parfois, il suffit d’une petite manipulation alg´ebrique pour faire resembler une r´ecurrence inconnue `a une autre d´ej`a vue. Par exemple, on utilise un changement de variables.
Exemple :PrenonsT(n) = 2T(√
n) +log(n).
Posonsm=log(n) ⇒ n= 2m. On aura doncT(2m) = 2T(2m2 ) +m.
On poseS(m) =T(2m), on obtient une nouvelle r´ecurrence S(m) = 2S(m
2) +m⇒ S(m) =O(m log(m)).
D’o`u T(n) =T(2m) =S(m) =O(m log(m)) =O(log(n)log(log(n))).
— Et parfois, de l’intuition pure ! ! ! Remarque 5.
Exemple & exercice : La recherche dichotomique
— V´erifier que lenombre d’it´erationde l’algorithme derecherche dichotomiqued’un tableau de taille n est
T(n) =T(n 2) + 1
— Montrer que
T(n) =O(log(n))
2.2.3 M´ethode g´en´erale
La m´ethode g´en´erale est une m´ethode qui s’appuie sur le th´eor`eme maˆıtre de la complexit´e, il est connu comme Master theorem en anglais et on l’appelle Th´eor`eme g´en´eral en fran¸cais.
— Elle est consid´er´ee comme une ”recette” pour r´esoudre les r´ecurrences de la forme
T(n) =aT(n
b) +f(n),
o`u a ≥1 et b > 1 sont des constantes, et f(n) une fonction asymptotiquement positive.
— Elle permet d’analyser letemps d’ex´ecutionT(n)(au pire des cas) d’un algorithme r´ecursif obtenu par l’approche ”DIVISER-POUR-R ´EGNER”.
2.2.4 DIVISER-POUR-R´EGNER
— L’approche ”diviser-pour-r´egner”est une technique pour la conception des algo- rithmes.
— En effet, un algorithme bas´e sur l’approche”diviser-pour-r´egner”
1. s´epare le probl`eme en plusieurs sous-probl`emessemblablesau probl`eme initial mais de taille inf´erieure,
2. r´esolve les sous-probl`emes de fa¸con r´ecursive,
3. combine toutes les solutions pour produire la solution du probl`eme original.
— Le principe de l’approche ”diviser-pour-r´egner”se base sur trois ´etapes`a chaque niveau de r´ecursivit´e :
1. Diviser leprobl`eme en un certain nombre desous-probl`emes.
2. R´egnersur lessous-probl`emesen les r´esolvant r´ecursivement.
Si la taille d’un sous-probl`eme est assez r´eduite, on peut le r´esoudre directe- ment.
3. Combiner les solutions aux sous-probl`emes en une solution compl`ete pour le probl`eme initial.
Problème Solution
sous-problème 1 sous-problème 2 sous-problème j
sous-problème p
diviser régner
solution 1 solution 1 solution 1
solution 1
combiner
Problème Solution
sous-problème 1 sous-problème 2 sous-problème j
sous-problème p
diviser régner
solution 1 solution 1 solution 1
solution 1
combiner
2.3 R´ esolution des r´ ecurrences
— La r´ecurrence de la forme T(n) =aT(nb) +f(n),d´ecritletemps d’ex´ecutiond’un algorithme quidivise un probl`emede taillenenasous-probl`emes, chacun de taille
n b.
— Les asous-probl`emessont r´esolus r´ecursivement, chacun dans un temps T(nb).
— f(n) =D(n) +C(n) repr´esente lecoˆut induitpar la d´ecomposition du probl`eme (D(n)) et lacombinaison des r´esultats des sous-probl`emes(C(n)).
2.3.1 Th´eor`eme g´en´eral :
Soienta≥1 etb >1 deux constantes, soitf(n) une fonction et soitT(n) d´efinie pour les entiers n≥0 par la r´ecurrence
T(n) =aT(n
b) +f(n),
T(n) peut alors ˆetre born´ee asymptotiquement de la fa¸con suivante.
1. Si∃ε >0t.q. f(n) =O(nlogb(a)−ε)alors T(n) = Θ(nlogb(a)).
2. Sif(n) = Θ(nlogb(a)) alors T(n) = Θ(nlogb(a)log(n)).
3. Si∃ε >0 t.q.f(n) = Ω(nlogb(a)+ε) et si∃c < 1t.q. af(nb)≤cf(n), pour nsuffisamment grand, alorsT(n) = Θ(f(n)).
f(n) = Ω(g(n))si∃c >0t.q. pournassez grandon ait0≤cg(n)≤f(n) Th´eor`eme 1.
2.3.1.1 Signification intuitive du th´eor`eme
Dans chaque cas, on compare la fonctionf(n) `a la fonctionnlogb(a). La solution de la r´ecurrence est d´etermin´ee par la plus grande des deux.
— Cas 1 :nlogb(a) est la plus grandeT(n) = Θ(nlogb(a)).
— Cas 2 :f(n) est la plus grande T(n) = Θ(f(n)).
— Cas 3 :f(n) =nlogb(a),T(n) = Θ(nlogb(a)log(n)).
Le th´eor`eme g´en´eral ne couvre pastoutes les possibilit´espour f(n).
Remarque 6.
Exemple 9.
T(n) = 9T(n 3) +n
Pour cette r´ecurrence, on a a= 9,b= 3 et f(n) =n.
On a donc nlogb(a)=nlog3(9)= Θ(n2) etf(n) =n=O(nlog3(9)−ε), avec ε= 1.
D’apr`es le cas 1 du th´eor`eme g´en´eral, on peut dire que T(n) = Θ(n2).
Exemple 10.
T(n) =T(2n 3 ) + 1 Pour cette r´ecurrence, on a a= 1,b= 32 et f(n) = 1.
On a donc nlogb(a) = n(log32(1)) = n0 = 1. On est dans le cas 2 puisque f(n) = Θ(nlogb(a)) = Θ(1).
La solution de la r´ecurrence est doncT(n) = Θ(log(n)).
Exemple 11.
T(n) = 3T(n
4) +n log(n) Pour cette r´ecurrence, on a a= 3,b= 4 et f(n) =n log(n).
On a donc nlogb(a)=nlog4(3)=O(n0.793). Puisque f(n) = Ω(nlog4(3)+ε), avec ε'0.2, on est dans le cas 3.
Pour n suffisamment grand, a f(n4) = 3n4log(n4)≤3n4 log(n) =c f(n) avec c= 34 <1.
Par cons´equent, D’apr`es le cas 3, on peut dire queT(n) = Θ(n log(n)).
Exemple 12.
T(n) = 2T(n
2) +n log(n)
On aa= 2, b= 2 et f(n) =n log(n). On a donc nlogb(a)=nlog2(2)=n. Dans ce cas, le th´eor`eme g´en´eral ne s’applique pas `a la r´ecurrence. En effet,
On pourrais penser que le cas 3 s’applique, puisque f(n) est plus grande asymptotique- ment que nlogb(a) =n. Le probl`eme est que f(n)
nlogb(a) =log(n) est asymptotiquement plus petit que nε, ∀ε >0.
2.4 Exercices
Exercice 1 :
Pour chacune des fonctions suivantes, d´eterminer le temps de calcul dans le pire des cas et enO() en justifiant votre r´eponse :
1. int fonct1(int n) 2. int fonct2(int n)
{ {
int i,j,s=0; int i,j,s=n;
for(j=30;j>10;j--) for(i=200;i>100;i-=20) for(i=n/2;i>0;i-=2) for(j=n;j>=n-4;j-=2)
s*=2; s/=2;
return s; return s;
} }
3. int fonct3(int n) 4. int fonct4(int n)
{ {
int i,j=1,s=0; int i=0,j,s=0;
while(j<n) do
{ {j=i++;
for(i=1;i<n*n;i*=2) while(j<2*i)
s++; {
j++; s++;
} j+=3;
return s; }
} }while(i<n);
return s;
}
5. int fonct5(int n) 6. int fonct6(int n)
{ {
if(n==0) if(n==0)
return 1; return 1;
return 2*fonct5(n/4); return fonct6(n-1)+fonct6(n-1);
} }
Exercice 2 :
1. Donner la complexit´e des algorithmes it´eratifs suivants :
(a) Ajouter un ´el´ement en tˆete, fin et quelconque, d’une liste chaˆın´ee.
(b) Supprimer un ´el´ement en tˆete, fin et quelconque, liste chaˆın´ee.
(c) Rechercher un ´el´ement quelconque dans une liste chaˆın´ee.
2. ´Evaluer la complexit´e des m´ethodes it´eratives propos´ees pour (a) calculer la puissanceni`eme d’un entier,
(b) trier (selection, bulle, insertion) un tableau (ou une liste), (c) calculer leni`eme terme de la suite de Fibonacci,
(d) effectuer la recherche dichotomique dans une table,
(e) parcourir un arbre binaire et rechercher un ´el´ement dans un arbre binaire AVL.
Exercice 3 :
1. Donnez des bornes asymptotiques approch´ees pourT(n) dans chacun des r´ecurrences suivantes :
(a) T(n) = 4T(n2) +n.
(b) T(n) = 4T(n2) +n3. (c) T(n) = 2T(n2) +√
n.
(d) T(n) =√ nT(√
n) +n.
2. Le temps d’ex´ecution d’un algorithmeA1 r´esolvant un probl`emeP est d´ecrit par la r´ecurrence T1(n) = 7T1(n2) +n2. Un autre algorithme A2 r´esolvant le mˆeme probl`emeP a un temps d’ex´ecution d´ecrit parT2(n) =αT2(n4) +n2. Quelle est la plus grande valeur deα telle queA2 soit asymptotiquement plus rapide queA1? 3. Soit une fonction d´efinie par :
int fonct(int n) {
if(n<2) return 1;
else return 4*fonct(n-1)-2*fonct(n-2);
}
(a) Soit T(n) le temps d’ex´ecution de la fonction fonct(). Exprimer T(n) en fonction deT(n−1) etT(n−2).
(b) Calculer la complexit´e dans le pire des cas et en O() de cette fonction. Ce programme est-il efficace ?
(c) Proposer une autre fonction en O(n) pour effectuer le mˆeme traitement.
Exercice 5 :
1. Donner la complexit´e des algorithmes r´ecursifs suivants : (a) Supprimer un ´el´ement quelconque dans une liste chaˆın´ee.
(b) Rechercher un ´el´ement quelconque dans une liste chaˆın´ee.
(c) calculer la puissanceni`eme d’un entier,
(d) trier (fusion, rapide, tas) un tableau (ou une liste), (e) calculer le ni`eme terme de la suite de Fibonacci, (f) effectuer la recherche dichotomique dans une table.
2. ´Evaluer la complexit´e des diff´erents algorithmes r´ecursifs, vus au cours et en TD, traitant les arbres binaires.
Exercice 4 :
Le tri fusion est une m´ethode algorithmique bas´ee sur la technique ”diviser pour r´egner”. Le principe de cette m´ethode peut ˆetre d´ecrit par l’algorithme r´ecursif suivant :
— On divise la liste en deux parties presque de mˆeme tailles,
— On trie les deux parties,
— On fusionne les deux parties.
Ce processus de la r´ecursivit´e s’arrˆete une fois la d´ecomposition des sous-listes donnent des sous-listes compos´ees d’un seul ´el´ement et le tri est alors trivial.
1. ´Ecrire une fonction de prototype liste diviseListe(liste l) qui permet de diviser une liste chaˆın´ee en deux sous-liste. Calculer sa complexit´e en fonction de la taille de la liste d’entr´ee.
2. ´Ecrire une fonction de prototype liste FusionListe(liste lG,liste lD) qui permet de fusionner deux listes. Calculer sa complexit´e.
3. ´Ecrire une fonction de prototype void triFusionListe(liste *l) qui permet de trier une liste chaˆın´ee d’entiers. Calculer sa complexit´e en fonction de la taille de la liste d’entr´ee.