Fiche 07 :
Notion de complexit´e une correction
Licence 3 informatique 2017 / 2018
Exercice 1 : Calcul de complexit´ e d’algorithmes it´ eratifs
Algorithme machin(T : tableau d’entier, n : entier) begin
for ifrom 0 ton−1 do x=T[i]
T[i] =T[n−1−i]
T[n−1−i] =x end for
end
Algorithme truc(M : matrice d’entier, n : entier) begin
for ifrom 1 ton−1 do forj from 0 to i−1 do
x=M[i][j]
M[i][j] =M[j][i]
M[j][i] =x end for end for end
1.a. L’algorithmemachininverse l’ordre des ´el´ements du tableau, le premier ´el´ement se trouvant `a la fin, et inversement pour le dernier ´el´ement.
L’algorithme truc calcule la transpos´ee de la matrice.
1.b. Pour l’algorithmemachin.
Pour chaque it´eration de la boucle for, 3 affectations, 6 acc`es m´emoires et 4 soustractions sont ex´ecut´ees. On peut consid´erer une complexit´e de 3 unit´es par it´eration. Il y anit´erations, donc la complexit´e temporelle estC1(n) = 3n. DoncC1(n) =O(n), la classe de complexit´e de l’algorithme est lin´eaire.
1
Pour l’algorithme truc.
Pour chaque it´eration de la boucleforit´erant surj, on peut de nouveau consid´erer une complexit´e de 3 unit´es. Il y a iit´erations, la complexit´e de cette boucle est donc 3iunit´es. La seconde boucle for it´erant suricomporte n it´erations. Ainsi la complexit´e de l’algorithme estC2(n) = Pn
i=13i.
En r´eduisant la somme, nous obtenons C2(n) = 3Pn
i=1i = 3n(n−1)2 . Ainsi, C2(n) = O(n2), la complexit´e de classe de l’algorithme est quadratique.
Exercice 2 : Calcul de complexit´ e d’algorithme r´ ecursif
Une version de l’algorithme quicksort :
Algorithme quicksort(T : tableau d’entier, a, b : entier) begin
if a < b then
pivot ←partition(T, a, b) quicksort(T, a, pivot - 1) quicksort(T, pivot + 1, b) end if
end
Algorithme partition(T : tableau d’entier, a, b : entier) begin
pivot ←T[b]
i←a−1
for j from atob−1do if T[j]<pivot then
i←i+ 1 swap(T[i], T[j]) end if
end for
if T[b]< T[i+ 1] then swap(T[i+ 1], T[b]) end if
return i+ 1 end
Complexit´e de l’algorithmepartition :
Posonsn=b−a, la taille du tableau trait´ee par l’algorithme. Avant et apr`es la bouclefor, seulement quelques instructions ´el´ementaires sont ex´ecut´ees. La boucleforcomporte 3 instructions qui sont r´ep´et´ees n−1 fois. La complexit´e de l’algorithme partition est donc Cpart(n) = 5 + 3n=O(n). La complexit´e est lin´eaire.
Complexit´e de l’algorithmequicksort :
2
Posonsn=b−a, la taille du tableau trait´ee par l’algorithme. Dans le pire des cas, la conditiona < best ex´ecut´ee. Ainsi la complexit´e de l’algorithme r´epond `a la relation de r´ecurrenceC(n) =Cpart(n) + 2C(n2).
Si on approxime la complexit´e departition parCpart(n) =n, on obtient : C(n) =n+ 2C(n
2) (1)
Pour simplifier les calculs, supposons que n = 2k, c’est-`a-dire que k = log2(n). Une remarque : si n n’est pas une puissance de 2, le raisonnement reste valide en supposant que k est l’entier sup´erieur `a log2(n), soitk=dlog2(n)e.
C(n) =n+ 2C(n2), or en utilisant la formule de r´ecurrence (1), C(n2) = n2 + 2C(n4).
Donc,C(n) =n+ 2(n2 + 2C(n4)) =n+n+ 4C(n4) En r´ep´etantkfois, le mˆeme calcul, on obtient : C(n) =n+n+. . .+n+ 2kC(1)
Or,C(1) = 1, 2k=net la somme contient ktermes.
D’o`u le r´esultat final C(n) =nlog2(n) +n=n(log2(n) + 1) =O(nlog(n)). La complexit´e du quicksort est quasi-lin´eaire.
3