Licence 3

Analyse de la complexité algorithmique

55 min15 exercicesSéquence 1.1Licence 3

Vidéo disponible dans la version Premium

Durée : 55 min

Analyse de la complexité algorithmique

1. Pourquoi mesurer la complexité ?

Pour comparer deux algorithmes résolvant le même problème, on ne mesure pas leur temps d'exécution en secondes (qui dépend de la machine, du langage, etc.) mais le nombre d'opérations élémentaires effectuées, en fonction de la taille nn de l'entrée. C'est la complexité temporelle. On définit de même la complexité spatiale (mémoire utilisée).

2. Notations de Landau : OO, Ω\Omega, Θ\Theta

Soient f,g:NR+f,g:\mathbb{N}\to\mathbb{R}_+. On dit :
- f(n)=O(g(n))f(n)=O(g(n))ff est dominée par gg ») s'il existe c>0c>0 et n0n_0 tels que f(n)cg(n)f(n)\leq c\,g(n) pour tout nn0n\geq n_0majoration asymptotique ;
- f(n)=Ω(g(n))f(n)=\Omega(g(n)) s'il existe c>0,n0c>0,n_0 tels que f(n)cg(n)f(n)\geq c\,g(n) pour nn0n\geq n_0minoration asymptotique ;
- f(n)=Θ(g(n))f(n)=\Theta(g(n)) si f(n)=O(g(n))f(n)=O(g(n)) et f(n)=Ω(g(n))f(n)=\Omega(g(n)) — l'ordre de grandeur exact.

Exemple : f(n)=3n2+5n+2f(n)=3n^2+5n+2. On a f(n)=O(n2)f(n)=O(n^2) (car pour n1n\geq1, 3n2+5n+210n23n^2+5n+2\leq10n^2) et f(n)=Ω(n2)f(n)=\Omega(n^2) (car f(n)3n2f(n)\geq3n^2), donc f(n)=Θ(n2)f(n)=\Theta(n^2) : l'algorithme est de complexité quadratique.

3. Classes de complexité usuelles

Par ordre croissant de coût (pour nn grand) : O(1)O(1) (constant), O(logn)O(\log n) (logarithmique), O(n)O(n) (linéaire), O(nlogn)O(n\log n) (quasi-linéaire), O(n2)O(n^2) (quadratique), O(nk)O(n^k) (polynomiale), O(2n)O(2^n) (exponentielle), O(n!)O(n!) (factorielle).

Exemple typique : la recherche dans un tableau trié par dichotomie est O(logn)O(\log n) ; le tri par insertion est O(n2)O(n^2) dans le pire cas ; le tri fusion est O(nlogn)O(n\log n).

4. Calcul de complexité : boucles et récursivité

Boucles simples : une boucle parcourant nn éléments une fois coûte O(n)O(n). Deux boucles imbriquées, chacune de taille nn, coûtent O(n2)O(n^2) (produit des tailles, dans le cas indépendant).

Récursivité — équation de récurrence. Pour un algorithme récursif qui divise le problème en aa sous-problèmes de taille n/bn/b chacun, avec un coût f(n)f(n) pour combiner les résultats, la complexité T(n)T(n) vérifie :

T(n)=aT(n/b)+f(n)T(n) = a\,T(n/b) + f(n)

Théorème maître (cas simplifié, f(n)=Θ(nd)f(n)=\Theta(n^d)) : en posant p=logbap=\log_b a :
- si d<pd<p : T(n)=Θ(np)T(n)=\Theta(n^p) ;
- si d=pd=p : T(n)=Θ(nplogn)T(n)=\Theta(n^p\log n) ;
- si d>pd>p : T(n)=Θ(nd)T(n)=\Theta(n^d).

Exemple — tri fusion : a=2a=2 sous-tableaux, b=2b=2 (taille n/2n/2 chacun), fusion en f(n)=Θ(n)f(n)=\Theta(n) (donc d=1d=1). On a p=log22=1=dp=\log_2 2=1=d, donc T(n)=Θ(nlogn)T(n)=\Theta(n\log n).

Exemple — recherche dichotomique : a=1a=1 sous-problème de taille n/2n/2, coût de combinaison f(n)=Θ(1)f(n)=\Theta(1) (donc d=0d=0). p=log21=0=dp=\log_2 1=0=d, donc T(n)=Θ(logn)T(n)=\Theta(\log n).

5. Récursivité naïve : Fibonacci

Le calcul naïf de Fib(n)\text{Fib}(n) par double récursion (T(n)=T(n1)+T(n2)+O(1)T(n)=T(n-1)+T(n-2)+O(1)) a une complexité Θ(φn)\Theta(\varphi^n)φ=(1+5)/2\varphi=(1+\sqrt5)/2 est le nombre d'or — exponentielle, car l'arbre des appels recalcule de nombreuses fois les mêmes sous-problèmes. La mémoïsation (stocker les résultats déjà calculés) ramène ce coût à O(n)O(n) : c'est le principe de la programmation dynamique.

6. Pire cas, meilleur cas, cas moyen

On distingue généralement :
- la complexité dans le pire cas : borne valable pour toute entrée de taille nn (la plus utilisée en pratique, car elle garantit une performance) ;
- la complexité dans le meilleur cas : la plus petite complexité possible parmi les entrées de taille nn ;
- la complexité en moyenne : espérance sur une distribution donnée des entrées.

Exemple — tri rapide (quicksort) : Θ(nlogn)\Theta(n\log n) en moyenne, mais Θ(n2)\Theta(n^2) dans le pire cas (pivot systématiquement mal choisi, par exemple sur un tableau déjà trié avec un pivot toujours pris en première position).

7. Récapitulatif


NotationSignification
|---|---|



f=O(g)f=O(g)ff majorée asymptotiquement par gg (à une constante près)
f=Ω(g)f=\Omega(g)ff minorée asymptotiquement par gg
f=Θ(g)f=\Theta(g)ff et gg du même ordre de grandeur
T(n)=aT(n/b)+Θ(nd)T(n)=aT(n/b)+\Theta(n^d)théorème maître : Θ(nmax(d,logba))\Theta(n^{\max(d,\log_ba)}) (avec facteur logn\log n si d=logbad=\log_ba)

Exercices

Que signifie f(n)=O(g(n))f(n)=O(g(n)) ?

Vrai ou faux : un algorithme de complexité O(nlogn)O(n\log n) est, pour nn grand, plus rapide qu'un algorithme de complexité O(n2)O(n^2).

Quelle est la complexité d'une boucle simple parcourant un tableau de taille nn une seule fois ?

Vrai ou faux : la recherche dichotomique dans un tableau trié de taille nn a une complexité O(logn)O(\log n).

Quelle est la complexité, dans le pire cas, du tri rapide (quicksort) ?

Suivez votre progression

Connectez-vous pour sauvegarder votre avancement et gagner des XP.

Se connecter