Diviser pour régner
TBD : mettre le master theorem ici.
TBD. Dire qu'on a vue ça dans les tris. TBD Reprendre le master theorem et le démontrer ici. TBD autres exemples TBD transformée de Fourier TBD exo https://wkerl.me/#teaching TBD médiane en temps linéaire en moyenne. en vrai. https://wkerl.me/cours/ouv_td.pdf https://www.normalesup.org/~simonet/teaching/caml-prepa/tp-caml-2001-02.pdf et https://fr.wikipedia.org/wiki/Recherche_des_deux_points_les_plus_rapprochés
Son énoncé nous permet de déterminer aisément la complexité de nombreux algorithmes récursifs :
Forme O du master theorem
Une complexité de la forme :
Est en :
- $C(n) = \mathcal{O}(n^d \cdot \ln(n))$ si $a=b^d$ (équivalent à $d = \log_b(a)$)
- $C(n) = \mathcal{O}(n^{\log_b(a)})$ si $a>b^d$
- $C(n) = \mathcal{O}(n^d)$ si si $a<b^d$
preuve
preuve
Comme $C(n) = a \cdot C(\frac{n}{b}) + \mathcal{O}(n^d)$, il existe $N_0$ tel que pour tout $n \geq N_0$, on a :
On en conclut que si $C'(n) = a \cdot C'(\frac{n}{b}) + n^d$ alors $C(n) \leq C'(n)$ pour tout $n$ et donc si $C'(n)$ est en $\mathcal{O}(g(n))$, alors $C(n)$ le sera aussi.
Comme $a^{\log_b(n)} = \exp(\ln(a) \cdot \frac{\ln(n)}{\ln(b)} ) = \exp(\ln(n) \cdot \frac{\ln(a)}{\ln(b)} ) = n^{\log_b(a)}$ on en conclut, en posant $C'(1) = K$, que :
Il y a alors plusieurs cas. Commençons par étudier le cas où $\frac{a}{b^d} = 1$ (équivalent à $d = \log_b(a)$). Dans ce cas, on a :
Si $\frac{a}{b^d} \neq 1$, on peut utiliser le fait que $\sum_{i=0}^kx^k = \frac{x^{k+1} -1}{x-1}$ (cette formule se démontre aisément par récurrence sur $k$ et est super utile dans plein de calculs de complexité, il est bon de la connaître) pour obtenir :
On en déduit facilement que :
- $\frac{a}{b^d} < 1$ (équivalent à $\log_b(a) < d$) implique $C'(n) = \mathcal{O}(n^d)$
- $\frac{a}{b^d} > 1$ (équivalent à $\log_b(a) > d$) implique $C'(n) = \mathcal{O}(n^{\log_b(a)})$
Le master theorem est la raison pour laquelle vous verrez parfois des complexités avec des exposants non entiers
Dans le cas du tri fusion on a $a = 2$, $b = 2$ et $d = 1$ donc $a=b^d$ :