On a un problème avec une solution "simple"
algosimple(
x) pour des
entrées
x de taille petite.
Pour
x de taille grande, on le décompose en plus petites entrées
x1,
...,
xr, de taille plus petite. Par exemple, on décompose le problème
en deux avec des tailles moitié. On fait alors tourner le programme
algo (
x) sur
ces entrées. Éventuellement, pour pouvoir décomposer le problème et le recomposer,
on a d'autres petites choses à faire
dont le coût est en
f(
x).
Diviser pour régner
Input:
x
Output:
algo( x )
si
x est petit ou simple alors
retourner alogsimple(x)
Décomposer
x en sous-entrées
x1, ...,
xt
pour
i = 1 à
t faire
recombiner les
yi en une solution
y pour
x
retourner
y
Si le coût du programme est
C(
x), on a donc
pour
x >
T1 ;
C(
x) pour
x <
T1 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
x >
T1,
.
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
C(
x) = 0 pour
x < 1 et
pour certains
a > 0,
b > 1 et
c réels et pour
. Une
borne supérieure pour
C(
x) lorsque
est
Démonstration
On écrit
x =
bn x0 avec
x0 inférieur à une constante
T0,
d'où
.
Par récurrence,
La dernière inégalité n'est valable que si
a est différent de
bk.
On a alors
avec
D(
x) fonction bornée
et
Donc
C(
x) est la forme
avec
C2 et
C3 bornés.
-
Si
a < bk, c'est un
O(xk).
-
Si
a > bk, c'est un
.
-
Si
a = bk,
Il existe des versions avec des relations du type
où le comportement asymptotique de
f est connu.
Dans les cas réels, la fonction
C 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
2
k).
On fait alors des hypothèses raisonnables sur la fonction de coût
pour pouvoir appliquer ce lemme ou une variante
(croissance,
...)
Exercice
Application