Pr. EL HADIQ Zouhair
Informatique CPGE — MP / PSI · Première période
1 / 23Un même problème admet plusieurs algorithmes corrects menant à la même solution, mais avec des efficacités différentes. La complexité sert à choisir lequel.
Temporelle
Nombre d'opérations élémentaires en fonction de $n$ — estime le temps d'exécution.
Spatiale
Quantité de mémoire supplémentaire utilisée en fonction de $n$ (variables, tableaux, pile d'appels).
Instruction de base, de coût supposé constant :
liste[i]).La complexité s'exprime en fonction d'un entier $n$ qui mesure la taille de l'entrée. Il faut toujours préciser ce qu'est $n$.
| Entrée | Taille $n$ |
|---|---|
| Une liste / un tableau | $n = \operatorname{len}(\text{liste})$ (nombre d'éléments) |
| Un entier $N$ à traiter | $n = N$, ou $n = \log_2 N$ (nombre de chiffres / bits) |
| Une matrice $p \times q$ | $n = p\,q$ (nombre de cases) |
| Un graphe | $n$ = nombre de sommets (et $m$ = nombre d'arêtes) |
| Une chaîne de caractères | $n$ = longueur de la chaîne |
Pour une même taille $n = \operatorname{len}(\text{liste})$, le nombre d'opérations dépend du contenu. En CPGE : meilleur et pire des cas.
Recherche séquentielle : meilleur $O(1)$, pire $O(n)$.
Total : $T(n) = 1 + 2n + 1 = 2n + 2$.
Pourquoi $O(n)$ ? Quand $n$ grandit, le terme dominant est $2n$ ; les constantes ($+2$) et le facteur ($2$) sont négligeables devant la croissance. On écrit $T(n) = O(n)$ : croissance linéaire.
Avec $n = \operatorname{len}(\text{liste})$, le corps d'une boucle interne se multiplie par les tours de la boucle externe :
$n \times n = n^2$ opérations : complexité quadratique $O(n^2)$.
9 / 23| Notation | Nom | Exemple |
|---|---|---|
| $O(1)$ | Constante | Accès liste[i] |
| $O(\log n)$ | Logarithmique | Recherche dichotomique |
| $O(n)$ | Linéaire | Parcours de liste |
| $O(n \log n)$ | Quasi-linéaire | Tri fusion / rapide |
| $O(n^2)$ | Quadratique | Double boucle |
| $O(2^n)$ | Exponentielle | Parties d'un ensemble, force brute |
$$O(1) < O(\log n) < O(n) < O(n\log n) < O(n^2) < O(2^n) < O(n!)$$
Donner la classe de complexité (terme dominant) de chaque expression :
| $T(n)$ | Réponse $O(\,\cdot\,)$ |
|---|---|
| $7n + 100$ | $O(n)$ |
| $3n^2 + 50n + 9$ | $O(n^2)$ |
| $5\log_2 n + 2$ | $O(\log n)$ |
| $4n^3 + n^2\log n$ | $O(n^3)$ |
| $2^n + n^{10}$ | $O(2^n)$ |
| $n\log n + 3n$ | $O(n\log n)$ |
Étapes formelles. Soit $t$ = nombre d'éléments de l'intervalle $[g,d]$. Au départ $t_0 = n$. Chaque tour divise $t$ par 2 :
$$t_k = \frac{n}{2^k}$$
La boucle s'arrête quand $t_k < 1$, soit $\dfrac{n}{2^k} < 1 \Rightarrow k > \log_2 n$.
| Classe | Boucle type |
|---|---|
| $O(1)$ | return L[0] (aucune boucle dépendant de $n$) |
| $O(\log n)$ | while n>1: n = n//2 (on divise par 2) |
| $O(n)$ | for i in range(n): ... |
| $O(n^2)$ | deux boucles imbriquées sur $n$ |
| $O(n^k)$ | $k$ boucles imbriquées sur $n$ |
| $O(2^n)$ | parcourir tous les sous-ensembles de $n$ éléments |
Pour une récurrence linéaire à coefficients constants :
$$T(n) = a_1\,T(n-1) + a_2\,T(n-2) + \dots + a_k\,T(n-k)$$
1. Équation caractéristique :
$$r^k = a_1 r^{k-1} + \dots + a_k$$
2. Racines $r_1,\dots,r_k$.
3. Solution générale :
4. Les $C_i$ se calculent avec les conditions initiales.
Fibonacci : $r^2=r+1 \Rightarrow \varphi=\tfrac{1+\sqrt5}{2} \Rightarrow \Theta(\varphi^{\,n})$.
$T(n)=2T(n-1) \Rightarrow r=2 \Rightarrow \Theta(2^{\,n})$.
$T(n)=2T(n-1)-T(n-2) \Rightarrow (r-1)^2=0 \Rightarrow \Theta(n)$.
Nombre d'appels : $C(n)=C(n-1)+C(n-2)+1$, avec $C(0)=C(1)=1$ : la croissance est celle de la suite de Fibonacci.
Partie homogène $T(n)=T(n-1)+T(n-2)$. Équation caractéristique :
$$r^2 = r+1 \;\Longleftrightarrow\; r^2-r-1=0$$
Racines $r=\dfrac{1\pm\sqrt5}{2}$ : $\varphi=\dfrac{1+\sqrt5}{2}\approx 1{,}618$ (nombre d'or) et $\psi=\dfrac{1-\sqrt5}{2}\approx -0{,}618$.
$T(n)=A\,\varphi^{\,n}+B\,\psi^{\,n}$ ; comme $|\psi|<1$, $\psi^{\,n}\to 0$.
On pose le vecteur d'état :
$$\begin{pmatrix}F_{n+1}\\ F_n\end{pmatrix}=A\begin{pmatrix}F_n\\ F_{n-1}\end{pmatrix},\quad A=\begin{pmatrix}1&1\\ 1&0\end{pmatrix}$$
Par récurrence : $\begin{pmatrix}F_{n+1}\\ F_n\end{pmatrix}=A^{\,n}\begin{pmatrix}F_1\\ F_0\end{pmatrix}=A^{\,n}\begin{pmatrix}1\\ 0\end{pmatrix}$.
Valeurs propres : $\det(A-\lambda I)=\lambda^2-\lambda-1=0 \Rightarrow \lambda=\varphi,\ \psi$.
$A$ est diagonalisable : $A=PDP^{-1}$ avec $D=\operatorname{diag}(\varphi,\psi)$, donc $$A^{\,n}=P\,D^{\,n}P^{-1},\qquad D^{\,n}=\operatorname{diag}(\varphi^{\,n},\psi^{\,n}).$$
| Récurrence | Exemple | Complexité |
|---|---|---|
| $T(n)=O(1)$ (aucun appel récursif dépendant de $n$) | cas de base / accès direct | $O(1)$ |
| $T(n)=T(n/2)+O(1)$ | dichotomie récursive | $O(\log n)$ |
| $T(n)=T(n-1)+O(1)$ | factorielle | $O(n)$ |
| $T(n)=T(n-1)+O(n)$ | somme de paires | $O(n^2)$ |
| $T(n)=T(n-1)+O(n^{k-1})$ | imbrication d'ordre $k$ | $O(n^k)$ |
| $T(n)=T(n-1)+T(n-2)+O(1)$ | Fibonacci naïf | $O(\varphi^{\,n})$, $\varphi\approx1{,}618$ |
Découper en $a$ sous-problèmes de taille $n/b$, avec un coût de partition/recombinaison $O(n^d)$ :
$$T(n) = a\,T\!\left(\tfrac{n}{b}\right) + O(n^d)$$
| Comparaison | Complexité | Exemple |
|---|---|---|
| $d > \log_b a$ | $O(n^d)$ | — |
| $d = \log_b a$ | $O(n^d \log n)$ | tri fusion : $a{=}b{=}2,\ d{=}1 \Rightarrow O(n\log n)$ |
| $d < \log_b a$ | $O(n^{\log_b a})$ | — |
Cas équilibré usuel : $T(n)=2T(n/2)+O(n) \Rightarrow O(n\log n)$.
21 / 23