Jump to content
Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

Prépa:Informatique/Diviser pour régner

De CowBloke Wiki
Version datée du 24 septembre 2026 à 19:51 par CowBloke (discussion | contributions) (Mise en place du wiki de notes)
(diff) ← Version précédente | Version actuelle (diff) | Version suivante → (diff)

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 n en a sous-problèmes de taille n/b, 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

C(n)=2C(n/2)+Θ(n)⟹C(n)=Θ(nlog⁡n)

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 d−g est un entier qui décroît strictement à chaque tour tant que g≤d.
  • Correction : invariant « si x est dans t, il est dans t[g..d] ».

On peut aussi écrire du code dans une phrase : List.map (fun x -> x * x) l.