• Aucun résultat trouvé

Introduction à la Complexté Algorithmique

N/A
N/A
Protected

Academic year: 2022

Partager "Introduction à la Complexté Algorithmique"

Copied!
32
0
0

Texte intégral

(1)

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

(2)

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

(3)

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

(4)

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.

(5)
(6)

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.

(7)

— 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.

(8)

— 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

(9)

— 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 :

(10)

— 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()

(11)

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.

(12)









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.

(13)

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

(14)

pour tout n≥n0

c1n212n2−3n ≤ c2n2 c112n3 ≤ 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 :

(15)

— 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)

(16)

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++;

(17)

——————————————-

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.

(18)

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.

(19)

— 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 :

(20)

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

(21)

— 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

(22)

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)

(23)

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

(24)

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

(25)

— 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.

(26)

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)).

(27)

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

(28)

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 :

(29)

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 :

(30)

(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);

}

(31)

(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.

(32)

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.

Références

Documents relatifs

Tout groupe d’ordre 80 n’admet-il qu’un seul 5-sous-groupe de

(2) En d´ eduire la fonction supprime qui prend en arguments une liste L et un nombre n et supprime le premier ´ el´ ement de la liste ´ egal ` a n... Avec la fonction random

Le but de cet exercice est donc de rechercher s’il existe une position du point T sur le segment [EM] pour laquelle l’angle ATB est maximum et, si c’est le cas, de d´ [ eterminer

Observons que chaque classe est non vide ; que deux classes sont disjointes ou confondues ; et que la r´eunion de toutes les classes est E.. Dans cette situation, nous dirons que

[r]

b) Combien de multiplications de nombres de moins de m chiffres sont n´ ecessaires au calcul de x.y ? En d´ eduire un algorithme de multiplication des entiers, et ´ evaluer

K d´esignant le corps des r´eels ou celui des complexes, on note M n,p (K) le K-espace vectoriel des matrices `a coefficients dans K ayant n lignes et p colonnes.. On lui donne le

Q 1.1 Ecrivez une fonction RechSeq qui, ´ etant donn´ ee une plage de cellules et un ´ el´ ement x, retourne vrai si x est pr´ esent dans la plage, et faux sinon.. On cherche `