Prépa:Informatique/Diviser pour régner
De CowBloke Wiki
Autres actions
Fiche d'exemple : code OCaml et C avec coloration. Modifie-la ou supprime-la librement.
Principe
DéfinitionDiviser pour régner
On découpe un problème de taille en sous-problèmes de taille , on les résout récursivement, puis on combine les solutions.
Tri fusion (OCaml)
let rec scinder = function
| [] -> [], []
| [x] -> [x], []
| x :: y :: q -> let a, b = scinder q in x :: a, y :: b
let rec fusion l1 l2 = match l1, l2 with
| [], l | l, [] -> l
| x :: q1, y :: q2 ->
if x <= y then x :: fusion q1 l2 else y :: fusion l1 q2
let rec tri_fusion = function
| ([] | [_]) as l -> l
| l -> let a, b = scinder l in fusion (tri_fusion a) (tri_fusion b)
FormuleComplexité du tri fusion
Recherche dichotomique (C)
/* Renvoie un indice de x dans t (trié, de taille n), ou -1. */
int dichotomie(const int *t, int n, int x) {
int g = 0, d = n - 1;
while (g <= d) {
int m = g + (d - g) / 2; /* évite le dépassement de g + d */
if (t[m] == x) return m;
if (t[m] < x) g = m + 1; else d = m - 1;
}
return -1;
}
MéthodeProuver la terminaison et la correction
- Terminaison : le variant est un entier qui décroît strictement à chaque tour tant que .
- Correction : invariant « si est dans , il est dans ».
On peut aussi écrire du code dans une phrase : List.map (fun x -> x * x) l.