Calcul d'équations classiques
Lors de calculs récursif de complexité, on va de nombreuses fois avoir les mêmes équations à résoudre. Cette série d'exercices va vous montrer les plus classiques et leur usage dans les calculs de complexité. Quelques équations de récurrences sont à connaître car elles donnent de complexités très différentes.
Que vaut $C(n)$ si :
corrigé
corrigé
On réitère l'équation de récursion jusqu'à trouver une suite générale avec un paramètre décroissant pour le terme de droite :
La formule ci-dessus est vraie quelque soit $p$. On peut donc prendre la valeur qui nous arrange. Comme on connaît $C(1)$, si on prend $p$ tel que $n - p\cdot K = 1$, c'est à dire $p = \frac{n-1}{K}$, on a plus d'inconnue à droite de l'égalité :
Que vaut $C(n)$ si :
corrigé
corrigé
On fait de même que pour l'exercice précédent, on cherche une suite générale avec un paramètre décroissant pour le terme de droite :
Comme on connaît $C(1)$m on prend $p$ tel que $n - p\cdot K = 1$, c'est à dire : $p = \frac{n-1}{K}$ :
Que vaut $C(n)$ si :
corrigé
corrigé
Si $p=\log_2(n)$, on a $\frac{n}{2^p} = \frac{n}{2^{\log_2(n)}} = \frac{n}{n} =1$, donc :
Que vaut $C(n)$ si :
corrigé
corrigé
On a vu précédemment que la série $\sum\limits_{0\leq i < p}\frac{1}{2^i}$ était plus petite que 2, donc : $\mathcal{O}(n\sum\limits_{0\leq i < p}\frac{1}{2^i}) = \mathcal{O}(n)$, ce qui simplifie beaucoup notre équation :
On peut ici tranquillement prendre $p=\log_2(n)$ pour obtenir :
Que vaut $C(n)$ si :
corrigé
corrigé
Que vaut $C(n)$ si :
corrigé
corrigé
Terminons cette partie avec un piège classique dans lequel tombent (pratiquement tous) les débutants :
Quelle équation de complexité $C(n)$ vérifie l'algorithme suivant ?
algorithme f(n: entier) → entier:
si n < 2:
rendre 1
rendre f(n // 2) * f(n // 4)
Calculer sa complexité via un encadrement et en utilisant les équations précédentes
corrigé
corrigé
Le piège se trouve dans la troisième ligne de l'algorithme. Elle consiste en :
- le calcul de $f(n//2)$
- le calcul de $f(n//4)$
- la multiplication des deux valeurs obtenues
Cette ligne est donc de complexité $C(n//2) + C(n//4) + \mathcal{O}(1)$.
On a donc l'équation suivante à résoudre :
La complexité est croissante, on peut donc écrire :
L'équation de gauche se résolvant exactement de la même manière que celle de droite on obtient $\mathcal{O}(n) \leq C(n) \leq \mathcal{O}(n)$, donc : $C(n) = \mathcal{O}(n)$.