• Aucun résultat trouvé

Complexité en moyenne de quelques algorithmes

2.2 Complexité d’un programme

2.2.6 Complexité en moyenne de quelques algorithmes

Si E est un ensemble de n nombres on noteS(E) l’ensemble des n! tableaux x = (x1, . . . ,xn)

dont le support {x1, . . . ,xn} est E (les xisont donc distincts). On considère un algorithmeAxpre-

2.2. COMPLEXITÉ D’UN PROGRAMME 41

échanges dans le tableau x; par exemple un algorithme de tri. Soit Axla complexité deAx, la no-

tion d’opération élémentaire ayant été préalablement précisée. On s’intéresse dans cette section à la complexité moyenne deA , l’ensembleS(E) étant muni d’une distribution uniforme. Autre- ment dit, on calcule (ou on étudie le comportement asymptotique de) la valeur moyenne (ou l’espérance) tn=n!1Px∈S(E)Axdes Ax.

Si x = (x1, . . . ,xn) ∈S(E), soit xi0∈ [|1,n|] le rang de xi (si xi est le plus petit des xj, xi0= 1, si

xi est le deuxième plus petit des xj, xi0= 2, etc.). Vues les hypothèses faites sur l’algorithme Ax

(comparaisons et échanges), Axne dépend que des positions relatives des xi, de sorte que Ax=

Ax0 où x0= (x10, . . . ,xn0). Ainsi on peut se restreindre, sans perte de généralité, au cas où E = [|1,n|], auquel casS(E) =Snest l’ensemble des permutations de [|1,n|].

Exemple 2.11 Analyse en moyenne d’un algorithme de recherche de maximum

pour x = (x1, . . . ,xn) ∈S(E), l’algorithme2.2renvoie le maximum de ces n nombres.

Algorithme 2.2 Maximum des éléments d’un tableau de n nombres

1 soit maxi mum x =

2 soit m ← x1dans 3 pour i = 2 à n faire 4 si xi> m alors 5 m ← xi 6 (* m = max{x1, . . . ,xi} *) 7 renvoyer m

On s’intéresse ici au nombre des changements d’affectation de la variable m (ligne 5) (on peut imaginer des situations analogues où ces changements d’affectation seraient coûteux). Ainsi, Ax

est le nombre d’éxécutions de la ligne 5 dans le calcul de maxi mum x.

Proposition 2.6 Le nombre moyen d’affectations dans l’algorithme de recherche du maximum

d’un tableau de n nombres distincts est tn=Pni =21i ∼ ln n.

Preuve Pour k Ê 0, notons pnk la probabilité de l’évènement (Ax = k) : pkn =

¯ ¯ ¯S n k ¯ ¯ ¯ n! où Snk = {x ∈

Sn| Ax = k} et |.| = cardinal( .). On voit (ou on sait) que tn = E(Ax) =P∞k=0kpkn (étant entendu

que les pknsont nuls pour k Ê n, on peut ne faire varier k dans cette somme que de 0 à n − 1). La famille (Snk(m))m=1,...,noù Snk(m) = {x ∈ Snk| xn= m} est une partition de Snk.

Si x = (x1, . . . ,xn−1,n) ∈ Snk(n) alors le début de l’éxécution de la boucle du calcul de maxi mum x

(i = 2,...,n−1) coïncide avec l’éxécution de la boucle du calcul de maxi mum x0où x0= (x1, . . . ,xn−1)

et se termine, pour i = n, par une éxécution de la ligne 5. On en déduit que x0∈ Sn−1k−1. Plus précisé- ment, x 7→ x0est une bijection de Skn(n) sur Sn−1k−1et |Snk(n)| = |Sn−1k−1|.

On voit de même que si m < n, |Snk(m)| = |Sn−1k |. Finalement, |Snk| =Pn

m=1|Skn(m)| = |Sn−1k−1| + (n − 1)|Skn−1|; soit, en divisant par n! :

(1) pnk=1 np n−1 k−1+ n − 1 n p n−1 k

On peut alors vérifier que cette formule reste valable pour tout n > 0 et k Ê 0, à condition de convenir que pk1= δ0,k(symbole de KRONECKER) et pnk= 0 si k < 0.

On introduit la fonction génératrice de la suite (pn

k)kÊ0. C’est la fonction polynomiale Gn(x) =

P∞

k=0p n kx

k.

On déduit de la relation (1) que Gn(x) = x+n−1n Gn−1(x) puis tn= Gn0(1) = Gn−10 (1) +n1Gn−1(1) =

Gn−10 (1) +n1; d’où, par récurrence, tn=Pni =21i. 

Exemple 2.12 Analyse en moyenne du tri par insertion

Proposition 2.7 Le nombre moyen de comparaisons effectuées par le tri par insertion d’un ta-

bleau (ou d’une liste; voir p.35) de n nombres distincts est ∼n42.

Preuve On dit qu’un couple (i , j ) est une inversion d’un tableau x = (x1, . . . ,xn) si 1 É i < j É n et xi> xj.

Le tri par insertion de x se déroule en deux étapes

– insérer x1à sa place dans le tableau trié y.

Le nombre de comparaisons effectuées à la deuxième étape est égal à I = |{i = 2,...,n | x1> yi}| ou à I + 1 suivant que x1> ynou non. Or, comme {y2, . . . ,yn} = {x2, . . . ,xn}, I est aussi le nombre d’inver-

sions de x de la forme (1,i ). On en déduit par induction que BxÉ AxÉ Bx+n −1 où Axest le nombre

total de comparaisons effectuées par le tri par insertion de x et Bxest le nombre d’inversions de x.

En ajoutant ces inégalités puis en divisant par n! on obtient unÉ tnÉ un+ n −1 où unest le nombre

moyen d’inversions d’une permutation x ∈Sn. Il reste à prouver que unn

2

4 : si x0= (xn, . . . ,x2,x1)

est la permutation miroir d’une permutation x = (x1,x2, . . . ,xn), les inversions de x0sont les couples

(i , j ) (avec 1 É i < j É n) qui ne sont pas des inversions de x. La somme des nombres d’inversions de

x et de x0est donc |{(i ,j )|1 É i < j É n}| =n(n−1)2 . En groupant deux par deux les permutations de

Snon en déduit que un=n(n−1)4n

2

4. 

Exercice 2.1 En utilisant la proposition2.6montrer que le nombre moyen de comparaisons du tri par insertion estn(n+3)4 −Pn

i =11i.

Exemple 2.13 Analyse en moyenne du tri rapide

Proposition 2.8 Le nombre moyen de comparaisons effectuées par le tri rapide1d’un tableau de n nombres distincts est ∼ 2n ln n.

Preuve La preuve de la proposition2.4(voir p.38) avait permis d’établir la formule Ax= n − 1 + AY (x)+ AZ (x)pour un tableau x de n nombres, Y (x) et Z (x) désignant les deux sous tableaux issus

du partitionnement de x. On peut alors concevoir que la valeur moyenne tndes Axvérifie

(1) tn= n − 1 +1 n n X i =1 (ti −1+ tn−i)

Etablissons formellement et de manière élémentaire2cette équation de récurrence.

En notantSin l’ensemble des permutations x ∈Sn telles que x1= i , on a n!tn =Px∈SnAx =

Pn i =1 P x∈Si nAx; d’où, en posant u i n=Px∈Si nAY (x)et v i n=Px∈Si nAZ (x): (2) tn= n − 1 + 1 n! n X i =1 (uni + vni)

Fixons i ∈ [|1,n|]. Si x ∈Sin, le pivot du partitionnement de x est x1= i , donc Y (x) ∈S([|1,i − 1|]) et

Z (x) ∈S([|i ,n|]).

Pour y ∈S([|1,i − 1|]), on note Y−1(y) = {x ∈Sin|Y (x) = y}. Soit y0∈S([|1,i − 1|]) la suite obtenue à partir de y en permutant deux éléments a = yαet b = yβ: y = (...,a,...,b,...) et y0= (.. .,b,. .. ,a,. ..). A tout x élément de Y−1(y) on associe x0 en permutant a et b dans x. Comme le partitionne- ment de x ne fait intervenir que des comparaisons des xj avec i et que a et b sont tous deux <

à i , Y (x0) s’obtiendra à partir de Y (x) = y en permutant a et b donc Y (x0) = y0et x 7→ x0est une application de Y−1(y) dans Y−1(y0). En inversant les rôles de y et de y0, on voit que c’est même une bijection. Y−1(y) et Y−1(y0) ont donc le même nombre d’éléments. Plus généralement, si y et y0sont deux suites quelconques deS([|1,i − 1|]), on peut passer de y à y0par une suite conve- nable d’échanges de deux éléments (le groupe symétrique est engendré par les transpositions) donc

Y−1(y) et Y−1(y0) ont encore le même nombre d’éléments. Comme |Sin| = (n −1)! et |S([|1,i −1|])| =

(i − 1)!, le cardinal commun aux ensembles Y−1(y) quand y ∈S([|1,i − 1|]) est (n−1)!(i −1)!, d’où uni =

(n−1)! (i −1)!

P

y∈S([|1,i −1|])Ay= (n −1)!ti −1. De même, on montre que vni = (n −1)!tn−iet en reportant ces

valeurs dans (2) on trouve bien la relation (1). On a alors successivement : (1) ⇒ tn= n − 1 +n2Pn−1i =0ti⇒ ntn− (n − 1)tn−1= 2(n − 1) + 2tn−1⇒ ntn− (n + 1)tn−1= 2(n − 1) ⇒ tn n+1tn−1 n =n+14 −2n⇒ Pn k=1 tk k+1− Pn k=1 tk−1 k = Pn k=1 4 k+1− Pn k=1 2 k⇒ tn= 2(n + 1) Pn k=1 1 k− 4n ⇒ tn∼ 2n ln n.  TRI RAPIDE STOCHASTIQUE

Le tri rapide est particulièrement inefficace si, à chaque étape de la récursion, le pivot est proche du plus petit ou du plus grand nombre du tableau (voir le cas d’un tableau trié ou d’un tableau trié en ordre inverse). A priori, le mieux qui puisse arriver est que, à chaque étape, le pivot parti- tionne le tableau x de longueur n en deux sous tableaux de longueurs bn/2c et dn/2e. Dans ce cas,

1. Voir p.38.

2.2. COMPLEXITÉ D’UN PROGRAMME 43

si on note un= Ax, on a un= n − 1 + ubn/2c+ udn/2eet, d’après le th.2.3, un= O(n log n). La com-

plexité dans le meilleur des cas est donc asymptotiquement du même ordre que la complexité en moyenne. On peut donc s’attendre à ce que Ax ne soit pas trop éloigné du meilleur des cas.

Mais cela suppose que toutes les suites sont équiprobables. Si tel n’est pas le cas, on a intérêt à « forcer le hasard » en obligeant le pivot à être, avec la même probabilité un élément quelconque du tableau. Avant de commencer le partitionnement, on échange le premier élément du tableau avec un autre choisi au hasard. Dans le programme2.9on insère aprèslet r =la ligne1

´

echanger p (random__int (q - p + 1) + p);;

45

Chapitre 3

Notions de base

3.1 Mots et langages