Vous êtes sur la page 1sur 7

Karine Deschinkel

2007/2008

CHAPITRE 6 : COMPLEXITE DUN ALGORITHME 1 INTRODUCTION

Le temps dexcution dun programme dpend de plusieurs facteurs : Les donnes entrant dans le programme La qualit du code binaire engendr par le compilateur travers lanalyse du code source La nature et la vitesse dexcution des instructions du microprocesseur utilis La complexit algorithmique du programme (Attention : il ne faut pas confondre la complexit thorique dun problme qui mesure la difficult trouver un algorithme de rsolution efficace avec la complexit algorithmique qui mesure son efficacit. Ces deux complexits sont complmentaires. Toutefois la complexit dun problme est beaucoup plus difficile dmontrer.) L excution dun programme est mesure en fonction de lutilisation des ressources de lordinateur : Le temps de calcul pour excuter les oprations L occupation mmoire pour contenir et manipuler les programmes ainsi que leurs donnes En programmation squentielle, il sagit souvent de trouver le meilleur compromis entre lutilisation de ces deux ressources principales. L analyse de la complexit a pour objectif de quantifier les deux grandeurs physiques cites ci-dessus (temps dexcution, place mmoire) dans le but de comparer diffrents algorithmes qui rsolvent le mme problme, indpendamment de la machine, du langage de programmation, du compilateur et des dtails dimplmentation. Le rsultat souhait est darriver lassertion : sur toutes les machines, quelque soit le langage de programmation, lalgorithme A1 est meilleur que lalgorithme A2 pour les donnes de grande taille. 2 ELMENTS DE BASE DE CALCUL DE COMPLEXIT

2.1 Complexit en temps 2.1.1 Oprations fondamentales Il sagit de mettre en vidence une ou plusieurs oprations de base (fondamentales) de telle sorte que lon puisse exprimer le temps des algorithmes en fonction (proportionnellement ) ce nombre doprations. On peut se poser la question : quel niveau doit-on considrer quun opration est fondamentale : binaire, instruction, machine, langage de programmation ? Quelles oprations dun programme doit-on considrer comme fondamentales ? Pour un tri, on peut considrer que les

Karine Deschinkel

2007/2008

comparaisons entre deux lments et les dplacements des lments comme fondamentaux. Pour une application de base de donnes, les entres et sorties sur disque peuvent tre fondamentales. Pour un calcul dalgbre linaire, les multiplications et additions sont fondamentales. Il ny a donc pas de rgle absolue de mesure. Il convient de bien prciser quel niveau dabstraction on se place et quelles sont les oprations fondamentales considres. 2.1.2 Rgle de calcul du nombre doprations de base Il suffit de compter le nombre doprations de chaque type : Les nombres doprations des squences dinstructions (spares par les ;) sajoutent. Exemple 1 : A=0 ; (1 op) C=0 ; (1 op) A=A+1 ; (2 ops: 1 addition + 1 affectation) B=A+C; (2 ops) Au total, 6 oprations Exemple 2: Recherche dun lment dans un tableau int recherche (float tab[], int n, float elem) { int i ; i=0 ; while ((i <n) && (tab[i] !=elem)) i=i+1; if (i>=n) i=-1; return i; } Comme oprations fondamentales, nous ne pouvons prendre que la comparaison de elem avec les lments du tableau. En effet, tout le reste concerne soit la programmation, soit limplmentation de liste par un tableau. Deux cas se prsentent : - le nombre doprations est gal n, et i=-1 si elem nest pas dans le tableau - le nombre doprations est gal (j+1) si elem est dans le tableau en tab[j] (j variant de 0 n-1) La complexit dpend de 3 points essentiels : - le choix des oprations fondamentales - la taille des donnes, ici n - pour une taille donnes, les diffrentes donnes possibles (ici, j varie) Les branchements (instructions conditionnelles) : difficile de savoir le nombre exact, on va donc majorer : if (condition) I1 ; else I2 ;

Karine Deschinkel

2007/2008

# (if (condition) I1 ; else I2 ;) <= #(condition) + max(#(I1), #(I2)) avec # le nombre doprations Les boucles (instructions itratives) : cest la somme des nombres #(I(i)) doprations fondamentales lors de lexcution de la ime itration de la boucle : for (i=) I(i); #( for (i=) I(i);) = #(I(i))

Les appels de fonctions : sil sagit des fonctions simples, on applique les mmes rgles de calcul dfinies prcdemment sil sagit des fonctions rcursives, le comptage demande dune part lexpression dune quation rcurrente, et dautre part la rsolution de cette quation

Exemple : int fac(int n) { if(n>1) return n*fact(n-1) ; else return (1); } L quation rcurrente sexprime comme suit : T(0) = 0 T(n) = 1 + T(n-1), T(n) = k + T(n-k)
i n i 1

Donc T(n)=

+ T(0) = n + 0 = n

2.2 Complexit en espace mmoire Mme genre de calcul, mais en terme de cases mmoires (octets) au lieu du nombre doprations fondamentales. 2.3 Autre critre dvaluation possible Il convient de trouver un compromis entre le temps de calcul et loccupation mmoire. Pendant la phase danalyse, il convient de bien prendre en compte le contexte de dveloppement et dutilisation du programme pour savoir quels aspects privilgier. 3 COMPLEXIT EN MOYENNE, AU MEILLEUR ET AU PIRE CAS

Le temps dexcution dun algorithme est en gnral exprim en fonction des donnes sur lesquelles il opre. T(n) est le temps dexcution exprim en fonction des donnes de taille n.

Karine Deschinkel

2007/2008

3.1 Une mesure de la taille des donnes Il faut donc dfinir une mesure de taille sur les donnes. Cette mesure doit reflter la quantit dinformation contenue. Par exemple : - la multiplication dentiers : taille des nombres = nombre de bits - la multiplication de matrices : taille des matrices traites (n * m) - parcours darbres/ de graphes : nombre de sommets/nuds et dartes/arcs Pour certains algorithmes, le temps dexcution ne dpend que de la taille des donnes, on fait dans ce cas une analyse simple. Mais la plupart varie, pour une taille donne, en fonction des donnes elles-mmes. Dans ce cas, il faut faire une analyse au pire, en moyenne et au meilleur cas, mais cest souvent plus difficile. 3.2 Complexit dun algorithme A sur des donnes Dn de taille n Complexit dans le pire des cas Tmax(A(n)) = max { cotA(n) (d), d Dn } Complexit dans le meilleur des cas Tmin(A(n)) = min { cotA(n) (d), d Dn } Complexit en moyenne / dans le cas moyen Tmoy(A(n)) =
d

o p(d) est la probabilit davoir la donne d en entre de lalgorithme. On a : Tmin(A(n)) Tmoy(A(n)) Tmax(A(n)) Cette analyse permet de trouver un comportement en gnral de lalgorithme, plus intressant, mais elle ncessite aussi de trouver un modle probabiliste adquat pour formaliser le temps dexcution du problme trait et ce nest pas toujours vident ! 3.3 Exemples a. Multiplication de matrices void multimat(int A[][], int B[][], int R[][], int n) { int i,j,k ; for(i=0; i<n; i++) for(j=0; j<n; j++) {

Dn

p d

cotA(n) (d)

Karine Deschinkel

2007/2008 R[i][j]=0; for(k=0; k <n; k++) R[i][j] + = A[i][k] * B[k][j];

} } Cette fonction a une complexit qui ne dpend que de la taille des matrices :
i n 1 i 0 j n 1 k j 0 n 1 0

Tmin(A(n)) = Tmoy(A(n)) = Tmax(A(n)) =

n3

b. Recherche dun lment dans un tableau (cf exemple prcdent) Pour la recherche dun lment dans un tableau, il est facile de dterminer les complexits extrmes : Tmin(n) = 1 (llment est au dbut du tableau) Tmax(n) = n (llment est la fin du tableau ou nest pas dans le tableau) Pour calculer Tmoy(n), on doit se donner des probabilits : - soit q la probabilit que llment cherch soit dans le tableau - on suppose que si llment est dans le tableau, toutes les places sont quiprobables On note Dn,k lensemble des donnes o llment elem apparat la k ime place. On note Dn,0 lensemble des donnes o llment elem nest pas dans le tableau. On a : q p(d Dn,k) = et p(d Dn,0) = 1 q n cot (d Dn,k) = k et cot (d Dn,0) = n Ce qui donne en moyenne : Tmoy(n) =
k n k 0

p(d Dn,k) cot (d Dn,k)


k n

q = (1-q) n + k n k 1 n (n+1 ) q = (1-q) n + 2n n (n+1 ) q = (1-q) n + 2n

Conclusion : Si elem est dans le tableau, q=1 et Tmoy(n) =

(n+1 )
2

, on doit parcourir

en moyenne la moiti du tableau avant de le trouver.

Karine Deschinkel

2007/2008

Si elem a une chance sur deux dtre dans le tableau (q=1/2), Tmoy(n) =
3 +1 n , il faut parcourir en moyenne du tableau avant de trouver 4

elem ou non. 4 ORDRES DE GRANDEUR : COMPARAISONS DALGORITHMES

Comme nous avons pu constater, les complexits sont exprimes en fonction de la taille des donnes. Or pour un problme donn, si la taille des donnes est faible, le choix dun algorithme par rapport un autre importe souvent peu. En revanche, lorsque la taille des donnes devient grande, il convient de bien connatre la croissance de la fonction de complexit. 4.1 Approximations des complexits Souvent, il suffit dune approximation simple de la complexit pour savoir si un algorithme est plus efficace quun autre : 1. Dans les approximations, il nest pas utile de tenir compte des constantes additives. Par exemple, il est secondaire de savoir si un algorithme fait n oprations , n+2, ou encore n+10 oprations pour un n grand. 2. De mme pour les constantes multiplicatives, mais l, il convient dtre plus prudent au moment de lapproximation. Par exemple, A1 a une complexit (Min, Max, ou Moy) gale T1(n)=n2 et A2 de complexit T2(n)=2n est meilleur que A1 pour tous les n>2. De mme, si A1 a pour complexit T1(n)=3n2 et A2 a T2(n)=25n, A2 est meilleur que A1 que si n>8. Toutefois, peu importe les constantes multiplicatives, si T1(n)=k1 n2 et T2(n)=k2 n, alors lalgorithme A2 est toujours meilleur que A1 partir dun certain rang pour n, car la fonction n 2 crot 2 beaucoup plus vite que n : lim n/ n = 0 n On dit alors que lordre de grandeur asymptotique de n2 est strictement plus grand que celui de n. 4.2 Ordre de grandeur asymptotique et notation de Landau Supposons que lon ait comparer les algorithmes A1 et A2 de complexits respectives T1(n) et T2(n), si lordre de grandeur asymptotique de A1 est strictement plus grand que celui de A2, on peut conclure immdiatement que A2 est meilleur que A1 pour n grand. En revanche, si T1(n) et T2(n) ont le mme ordre de grandeur asymptotique, il convient de faire une analyse plus fine pour comparer A1 et A2. Pour comparer les ordres de grandeur asymptotique, on a lhabitude dutiliser la notation Landau en mathmatiques. Dfinitions

Karine Deschinkel

2007/2008

Soient f et g deux fonctions de N dans R+, 1. f = O(g) si et seulement si il existe c dans R+, il existe n0 dans N tel que quelque soit n > n0, f(n) c. g(n). Ainsi f= O(g) veut dire que f est domine asymptotiquement par g. Par exemple : 2n=O(n2), mais aussi 2n=O(n) aussi ! Il suffit de bien choisir la constante n0. Remarque : lorsquune complexit est donne en termes de O(g), il convient de donner la fonction g la plus serre possible. 2. f = (g) si et seulement si il existe d dans R+, il existe n0 dans N tel que quelque soit n > n0, d.g(n) f(n). 3. f = (g) si et seulement si f=O(g) et g=O(f) ou encore f =O(g) et f=(g). Cest dire quil existe c et d dans R+, il existe n0 dans N tel que quelque soit n > n0, d.g(n) f(n) c. g(n). On dit que f et g sont de mme ordre de grandeur asymptotique. En dautres termes, O() est une borne asymptotique suprieure, () est la borne asymptotique infrieure et () la borne asymptotique exacte , cette dernire est beaucoup plus prcise que les deux premires. 4.3 Exemple

Complexit du tri par slection - Oprations de base = comparaison dlments. T(n)=


i = n2 j = n 1 i =0

j = i+

1= (n1 ) (i +1 )+1= n 1 i = (n1 ) i


i =0 i =0 i =0 i =0

n2

n2

n2

n2

=(n1 )(n1 )
=

(n1 )(n 2 )
2

(n1 )( 2n 2 n + 2 )

2 2 Le tri par slection a une complexit en (n2) pour le nombre de comparaisons dlments.

n(n1 )

Oprations de base = dplacements ou changes dlments

T(n)=

1=(n 2 )+1= n 1 i=
0

n2

Le tri par slection a une complexit en (n) pour le nombre dchanges dlments.

Vous aimerez peut-être aussi