Vous êtes sur la page 1sur 7

Complexit algorithmique

0.1 Analyse d'un algorithme

Analyser un algorithme consiste prvoir les ressources cet algorithme. Parfois, les ressources pertinentes sont : la mmoire utilise, la largeur de bande d'une communication, ou les portes logiques, mais le plus souvent, on souhaite mesurer le temps de calcul. Considrons un problme donn, et un algorithme pour le rsoudre. Sur une donne x de taille n, l'algorithme requiert un certain temps, mesur en nombre d'oprations lmentaires, soit c(x). Le cot en temps varie videmment avec la taille de la donne, mais peut aussi varier sur les direntes donnes de mme taille n.

Exemple 1 Considrons l'algorithme de tri qui, partant d'une suite (a1 , ..., an ) de nombres rels distincts trier en ordre croissant qui : 1. cherche la premire descente, c'est--dire le plus petit entier i tel que ai > ai+1 , 2. change ces deux lments, 3. recommence sur la suite obtenue. Si l'on compte le nombre d'inversions ainsi ralises, il varie de 0 pour une suite trie n(n 1)/2 pour une suite dcroissante.
Notre but est d'valuer le cot d'un algorithme, selon certains critres, et en fonction de la taille n des donnes.
0.1.1 Dterminer les oprations fondamentales

Pour certains problmes, on peut mettre en vidence une ou plusieurs oprations qui sont fondamentales au sens o le temps d'excution d'un algorithme rsolvant ce problme est toujours proportionnel au nombre de ces oprations. Il est alors possible de comparer des algorithmes traitant ce problme selon cette mesure simplie. Donnons quelques exemples d'oprations fondamentales : 1. pour la recherche d'un lment dans une liste en mmoire centrale : le nombre de comparaisons entre cet lment et les entres de la liste ; 2. pour la recherche d'un lment sur un disque : le nombre d'accs la mmoire secondaire ; 1

Lebbah, EPST d'Oran, Informatique 2, Algrie

3. pour trier une liste d'lments : on peut considrer deux oprations fondamentales : le nombre de comparaisons entre des lments et le nombre de dplacements d'lments ; 4. pour multiplier deux matrices de nombres : le nombre de multiplications et le nombre d'additions. Remarquons que si l'on choisit plusieurs oprations fondamentales, on doit les dcompter sparment puis, si besoin est, on les aecte chacune d'un poids qui tient compte des temps d'excution dirents. 1. En faisant varier le nombre d'oprations fondamentales, on fait varier le degr de prcision de l'analyse, et aussi son degr d'abstraction, i.e. d'indpendance par rapport l'implmentation. A la limite, si l'on veut faire une microanalyse trs prcise du temps d'excution du programme, il sut de dcider que toutes les oprations du programme sont fondamentales. 2. On a fait l'hypothse que le temps d'excution est proportionnel la mesure choisie. On ne peut pas comparer deux algorithmes utilisant des mesures diffrentes.
0.1.2 Compter le nombre d'oprations (Calculer le cot)

Aprs avoir dtermin les oprations fondamentales, il s'agit de compter le nombre d'oprations de chaque type. Il n'existe pas de systmes complet de rgles permettant de compter le nombre d'oprations en fonction de la syntaxe des algorithmes mais l'on peut faire quelques remarques : 1. Lorsque les oprations sont dans une squence d'instructions, leurs nombres s'ajoutent. 2. Pour les branchements conditionnels, il est en gnral dicile de dterminer quelle branche de la condition est excute, et donc quelles sont les oprations compter. Cependant, on peut majorer ce nombre d'oprations. 3. Pour les boucles, le nombre d'oprations dans la boucle est P (i), o i est la variable de contrle de la boucle, et P (i) le nombre d'oprations fondamentales lors de l'excution de la ime itration. Si le nombre d'itrations est dicile calculer, on peut se contenter d'une bonne majoration. 4. Pour les appels de procdures et fonctions non rcursives, on peut s'arranger calculer la complexit de ces appels, et les prendre en compte suivant l'imbrication de l'appel dans l'algorithme. 5. Pour les appels de procdures et fonctions rcursives, compter le nombre d'oprations fondamentales donne en gnral lieu la rsolution de relations de rcurrence. En eet le nombre T (n) d'oprations dans l'appel de la procdure avec un argument de taille n s'crit, selon la rcursion, en fonction de divers T (k), pour k < n. L'exemple de Fibonacci donn dans le chapitre d'introduction illustre bien ce cas. Il est vident que le calcul du cot d'un algorithme dpend de la donne sur laquelle il opre.

Lebbah, EPST d'Oran, Informatique 2, Algrie

1. Il faut d'abord dnir une mesure de taille sur les donnes qui rete la quantit d'information contenue. Par exemple, si l'on additionne ou on multiplie des entiers, une mesure signicative est le nombre de chires des nombres. 2. Pour certains algorithmes, le temps d'excution ne dpend que de la taille des donnes ; mais la plupart du temps la complexit varie aussi, pour une taille xe des donnes, en fonction de la donne elle-mme.
0.2 Calcul de la complexit d'un algorithme

Dnition 1 La complexit d'un algorithme A est une fonction C(N ) donnant le nombre d'instructions caractristiques excutes par A dans le pire des cas pour une donne de taille N .
0.2.1 La taille d'une donne

La taille d'une donne est la quantit mmoire pour la stocker. Pour tre rigoureux il faudrait la mesurer en nombre de bits. Dans notre cours, il sura de compter le nombre de mots-mmoire ncessaires, sans prcision. Selon le contexte, ces mots peuvent tre des entiers courts ou longs, des rels, etc.

Exemple 2 Pour le tri de N nombres, on va avoir besoin de N + 1 mots-mmoire : N nombres + 1 pour le nombre N . Ce qui donne une taille de N + 1.
0.2.2 L'ordre d'une fonction

Considrons deux algorithmes A1 et A2 pour un mme problme de taille N , avec CA1 = 0.5N 2 et CA2 = 5N (voire 1). A2 fait plus d'oprations que A1 pour N = 5 mais moins ds que N 10. En fait, quels que soient les coecients positifs de N et N 2 dans CA1 et CA2 , A2 ira toujours plus vite partir d'une certaine taille de problme.

Figure 1  Les courbes respectives de CA

et CA2

Lebbah, EPST d'Oran, Informatique 2, Algrie

Dnition 2 Soient f et g deux fonctions de IR dans IR. On dit que f est d'ordre infrieur ou gal g, ou d'ordre au plus g, si on peut trouver un rel x0 et un rel positif c tels que : x x0 , f (x) c.g(x).
En d'autres termes, g devient plus grande que f partir d'un certain nombre x0 , un facteur c prs. On crit f est O(g), f est en O(g) ou f = O(g) et on prononce grand O de g . Cette notation, dite de landau, est consacr par l'usage. En fait, O(g) est un ensemble de fonctions, celles d'ordre au plus g : il sera prfrable d'crire f O(g).

Exemple 3 Un cas simple d'application de la dnition est quand f g partir d'une certaine valeur. Ainsi, 5N = O(5N 2 ) pour N 10
Si f et g admettent des limites, on a les dnitions suivantes : 1. si limn f = c > 0, f et g sont du mme ordre : f = O(g) et g = O(f ), on g note f = (g), 2. si limn f = 0, f = O(g) mais g = O(f ), g 3. si limn f = +, f est d'ordre superieur g , on note f = (g), ou g = O(f ), g Les complexits sont le plus souvent expimes l'ordre prs grace aux avantages suivants : f = O(g) signie en fait que g est un majorant de la complexit relle. On peut se contenter, par exemple, de borner grossirement le comportement au pire d'un algorithme. 10N 2 = O(0.5N 2 ) et vice versa : deux fonctions dirant d'un facteur constant sont du mme ordre. Ceci permet de s'aranchir des puissances relatives diffrentes de deux ordinateurs. N 2 +3N +4 = O(N 2 ) : les termes d'order infrieur peuvent trengligs. Ainsi, pour N assez grand, l'initialisation d'un tableau T de N lments en O(N ) est ngligeable devant deux boucles imbriques de N itrations sur T qui cotent O(N 2 ). Il n'est pas besoin d'tre prcis sur la notion d'opration caractristiques d'un algorithme. Le nombre exact d'instructions compt dans un corps d'une boucle, par exemple, sera sans eet sur la complexit.
0.3
0.3.1

Les types de complexit


La complexit dans le meilleur des cas

Le cot M inA (n) d'un algorithme A dans le meilleur des cas

M inA (n) = min|x|=n c(x).


0.3.2 La complexit dans le pire des cas

Le cot M axA (n) d'un algorithme A dans le cas le plus dfavorable ou dans le cas le pire 1 est par dnition le maximum des cots, sur toutes les donnes de taille
1. worst-case en anglais.

Lebbah, EPST d'Oran, Informatique 2, Algrie

n: M axA (n) = max|x|=n c(x).


0.3.3 La complexit en moyenne

Dans des situations o l'on pense que le cas le plus dfavorable ne se prsente que rarement, on est plutt intress par le cot moyen de l'algorithme. Une formulation correcte de ce cot moyen suppose que l'on connaisse une distribution de probabilits sur les donnes de taille n. Si p(x) est la probabilit de la donne x, le cot moyen M oyA (n) d'un algorithme A sur les donnes de taille n est par dnition

M oyA (n) =
|x|=n

p(x)c(x).

Le plus souvent, on suppose que la distribution est uniforme, c'est--dire que p(x) = 1/T (n), o T (n) est le nombre de donnes de taille n. Alors, l'expression du cot moyen prend la forme

M oyA (n) =

1 T (n)

c(x).
|x|=n

En pratique, la complexit en moyenne est souvent beaucoup plus dicile dterminer que la complexit dans le pire des cas , d'une part parceque l'analyse devient mathmatiquement dicile, et d'autre part parcequ'il n'est pas toujours facile de dterminer un modle de probabilits adquat au problme. En claire, il existe entre les complexits en moyenne et les complexits extrmales la relation suivante :

M inA (n) M oyA (n) M axA (n).


Si le comportement de l'algorithme dpend uniquement de la taille des donnes (comme dans l'exemple de la multiplication de matrices), alors ces trois quantits sont confondues. Mais en gnral, ce n'est pas le cas et l'on ne sait mme pas si le cot moyen est plus proche du cot minimal ou du cot maximal.
0.3.4 Exemple illustratif : recherche linaire

On cherche determiner la complexit, en nombre de comparaisons, de l'algorithme RechSeq de recherche squentielle d'un lment dans une liste. Dans le meilleur des cas, l'lment X se trouve dans la premire case de la liste, d'o M in(n) = 1. Dans le pire des cas, X se trouverait dans la dernire case de la liste, d'o M ax(n) = n. Pour calculer M oy(n), on doit se donner des probabilits sur L, et X ; on suppose tous les lments distincts : soit q la probablit que X soit dans L ; on suppose que X est dans L, toutes les places sont quiprobables.

Lebbah, EPST d'Oran, Informatique 2, Algrie

Algorithm 1 RechSeq(L, j ) Input: L une liste n lments Output: Recherche la place j d'un lment X dans une liste L. Si X n'est pas dans
1: 2: 3: 4: 5: 6: 7:

la liste, j est mis zro. j1 while (j n) (L[j] = X) j j+1

do

end while if (j>n) then end if


j0

On note Dn,i pour 1 i n, l'ensemble des donnes o X apparait la iime place et Dn,0 l'ensemble des donnes o X est absent. D'aprs les conventions cidessus, on a : p(Dn,i ) = q/n et

p(Dn,0 ) = 1 q.
D'aprs l'analyse de l'algorithme, on a :

cout(Dn,i = i
et

cout(Dn,0 ) = n.
On a donc :

M oy(n) =
i=0..n

p(Dn,i .cout(Dn,i ) = (1 q).n +


i=1..n

i.q/n

M oy(n) = (1 q).n + (n + 1).q/2.


Si on sait que X est dans la liste, on a q = 1, on a :

M oy(n) = (n + 1)/2.
Si X a une chance sur deux d'tre dans la liste, on a q = 1/2, et :

M oy(n) = n/2 + (n + 1)/4 = (3n + 1)/4.


0.4 Bons et mauvais algorithmes

Une classication grossire mais reconnue distingue les algorithmes polynomiaux (de complexit de l'ordre d'un polynome), et les autres dits exponentiels. Des exemples de complexits polynomiales sont : log n, n0.5 , n.log n, n2 ,... Une complexit exponentielle peut tre une vraie exponentielle au sens mathmatique (en ,2n ), mais aussi les fonctions nlog n (dite sous exponentielle), n! et nn . Un bon algorithme est dit polynomial. Ce critre d'ecacit est conrm par la pratique :

Lebbah, EPST d'Oran, Informatique 2, Algrie

Une exponentielle dpasse tout polynme pour n assez grand. Par exemple, 1.1n crot d'abord lentement, mais nit par dpasser n100 . Il est vrai que 1.1n , complexit exponentielle, est plus interessant que n100 pour n pas trop grand. Mais il est rare de trouver des complexit polynomiales d'ordre suprieur n4 enpratique. L'ensemble des polynmes a d'interessantes proprits de fermeture. L'addition, la multiplication, la composition de polynmes donnent des polinmes. On peut ainsi constituer de grands algorithmes polinmiaux partir de plus petits.

Exemple 4 Le tableau ci-dessous donne une estimation du temps d'exction de chacun de ces algorithmes pour direntes tailles n des donnes du problme sur un ordinateur base de microprocesseur 386 ou 486. Les cases non remplies ont des dures suprieures 1000 milliards d'annes (suprieures l'age estim de l'univers).

Figure 2  Temps d'excution et taille des donnes


La puissance de la machine ne rsout rien pour les complexits exponenetielles. Ainisi pour traiter un problme de taille 100 dans le mme temps qu'un problme de taille 50, il sut d'un ordinateur 10 fois plus puissant pour 10.n3 , 4800 fois plus puissant pour nlog2 n (limite des plus puissants ordinateurs), 100 000 fois plus pour 2n/3 . Et tout cela pour seulement doubler la taille des problmes traits.
Les algorithmes utilisables pour des donnes de grande taille sont ceux qui s'excutent en temps : - constant (c'est le cas de la complexit en moyenne de certaines mthodes de hachage) ; - logatithmique (par exemple la recherche dichotomique, ou les arbres binaires de recherche) ; - linaire (par exemple la recherche squentielle) ; - n.log(n) (par exemple les bones algorithmes de tri).