2 TD 10 : COMPLEXIT´
E
Dans le pire des cas, l’´el´ement ne se trouve pas dans le tableau et on le parcourt
donc int´egralement (dans les deux cas). Cela donne
n
tests d’´egalit´es. Il est par
contre tout `a fait possible que l’´el´ement cherch´e soit le dernier ´el´ement du tableau.
Dans ce cas on ne fait qu’un seul test dans le deuxi`eme programme. En revanche le
premier programme fait quand mˆeme ntests.
(3)
On remarque que pour le deuxi`eme programme le nombre de tests “==” d´epend de
la position de
x
dans
tab
. On peut donc se demander quelle est la complexit´e en
moyenne de l’algorithme pr´ec´edent. En faisant l’hypoth`ese que l’´el´ement
x
apparaˆıt
exactement une fois dans le tableau
tab
, en moyenne
x
est au milieu de
tab
, ce qui
donne une complexit´e en moyenne de n/2 pour le second programme et de npour
le premier.
Remarques :
–
Vous avez sans doute remarqu´e que ce dernier point est peu rigoureux. Il est tout a fait
possible de le rendre s´erieux en d´ecrivant une mesure de probabilit´e sur les diff´erents
tableaux, et sur les occurences de
x
. Puis il reste `a calculer pr´ecis´ement l’esp´erance
de la derni`ere position de
x
dans
tab
selon les pr´ec´edentes mesures. C’est cependant
technique et un peu hors de propos dans un TD d’introduction `a la complexit´e.
–
Le premier programme a une complexit´e en moyenne de n, alors que le second a
une complexit´e en moyenne de n/2. On peut aussi remarquer que le nombre de tests
effectu´es par le second algorithme est inf´erieur ou ´egal au nombre de tests effectu´es par
le premier. Le second algorithme est donc plus efficace que le premier.
Exercice 2.
On consid`ere les deux fragments de programmes suivants :
for (int i = 0; i < n; i++ )
for (int j = 0; j < n; j++ )
if ( i == j ) drawPixel(i, j, rouge);
for (int i = 0; i < n; i++ )
drawPixel(i, i, rouge);
Que font-ils ? Quelle est leur complexit´e ? Lequel est meilleur ?
Correction : Les deux programmes propos´es ont le mˆeme comportement : ils dessinent
chacun, point par point, la diagonale d’un carr´e de cˆot´e n. Pour la complexit´e, on compte
le nombre de fois que le test
if
est ex´ecut´e, ainsi que le nombre de pixels dessin´es. Dans le
premier cas le test est ins´er´e dans deux boucles
for
imbriqu´ees, chacune ayant npassages.
On effectue donc n
2
tests et on dessine npixels, soit une complexit´e en O(n
2
). Dans le
deuxi`eme cas, une seule boucle ayant npassages, donc la complexit´e est en O(n).
G´eom´etriquement, le premier programme parcourt le carr´e point par point, de gauche
`a droite, de haut en bas et si le point se situe sur la diagonale (coordonn´ees (i, i)), il est
affich´e en rouge. On voit que l’on parcourt donc les n2points du carr´e.
Le second programme ne visite que les points sur la diagonale (`a coordonn´ees (i, i)) et les
affiche directement.
Le second programme est ´evidement le meilleur. . .
Exercice 3.
On consid`ere deux algorithmes Aet Bde complexit´e respective 1000 log2n+ 50 et 4n.
(1) Tracer les deux courbes sur le mˆeme graphique, pour nentre 1 et 10000.
(2) Pour de petites valeurs de n, quel algorithme est le plus performant ?
(3) Pour de grandes valeurs de n, quel algorithme est le plus performant ?