On a un problème avec une solution "simple"
pour des
entrées
de taille petite.
Pour
de taille grande, on le décompose en plus petites entrées
,
...,
, de taille plus petite. Par exemple, on décompose le problème
en deux avec des tailles moitié. On fait alors tourner le programme
sur
ces entrées. Eventuellement, pour pouvoir décomposer le problème et le recomposer,
on a d'autres petites choses à faire
dont le coût est en
.
Diviser pour régner
Input:
Output:
si
est petit ou simple alors
retourner alogsimple(x)
Décomposer
en sous-entrées
, ...,
pour
à
faire
recombiner les
en une solution
pour
retourner
Si le coût du programme est
, on a donc
pour
;
pour
est le coût de l'algorithme simple.
Par exemple, si l'on a décomposé le problème en deux problèmes
de taille moitié, pour
,
.
Il reste à évaluer à partir de cette inégalité de récurrence
quel est le coût. Pour cela on s'inspire du lemme suivant.
Lemme
Soit
une fonction vérifiant
pour
et
pour certains
,
et
réels et pour
. Une
borne supérieure pour
lorsque
est
Démonstration
On écrit
avec
inférieur à une constante
,
d'où
.
Par récurrence,
|
|
|
|
|
|
La dernière inégalité n'est valable que si
est différent de
.
On a alors
avec
fonction bornée
et
Donc
est la forme
avec
et
bornés.
Si
, c'est un
.
Si
, c'est un
.
Si
,
|
|
|
|
Fin de la démonstration
Il existe des versions avec des relations du type
où le comportement asymptotique de
est connu.
Dans les cas réels, la fonction
n'est pas définie sur
,
on ne la connait souvent bien que sur une classe d'entiers (par
exemple dans le cas de dichotomie, sur les entiers de la forme
).
On fait alors des hypothèses raisonnables sur la fonction de coût
pour pouvoir appliquer ce lemme ou une variante
(croissance,
...)
Exercice
Application