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