Adloun

Ordonner avant de parcourir : deux nombres de somme donnée

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 14 — Exploration exhaustive et retour sur trace

Énoncé

Écrire, avec sa spécification complète, un algorithme trouvant dans un tableau deux éléments de somme , en . Prouver sa terminaison et sa correction.

Corrigé


(* Renvoie Some (a, b) avec a + b = c, a et b à des indices distincts de t,
   ou None s'il n'en existe pas.
   Précondition : aucune. Le tableau n'est pas modifié (on travaille sur une copie).
   Complexité : Theta(n log n) pour le tri, puis Theta(n). *)
let paire t c =
  let u = Array.copy t in
  Array.sort compare u;
  let g = ref 0 and d = ref (Array.length u - 1) and rep = ref None in
  (* INVARIANT : si une paire de somme c existe dans u, alors il en existe une
     dont les deux indices sont dans [g, d]. *)
  while !rep = None && !g < !d do
    let s = u.(!g) + u.(!d) in
    if s = c then rep := Some (u.(!g), u.(!d))
    else if s < c then incr g          (* u.(g) est trop petit pour TOUT le monde *)
    else decr d                        (* u.(d) est trop grand pour TOUT le monde *)
  done;
  !rep

Terminaison. Variant : . Chaque tour incrémente ou décrémente , donc le variant décroît strictement d'au moins et reste minoré par . La boucle fait au plus tours.

Correction. L'invariant tient à l'initialisation : est tout le tableau. Il est préservé. Supposons . Pour tout , on a : aucune paire contenant à l'intérieur de n'atteint . Écarter ne perd donc rien. Le cas est symétrique. À la sortie, ou bien on a trouvé, ou bien : l'intervalle ne contient plus de paire, donc il n'en existait aucune.

Le gain, mesuré sur t = [|31; 4; 17; 9; 25; 2; 48; 13; 36; 7|] :

force bruteaprès tri
(la paire existe)36 comparaisons1
(aucune paire)45 comparaisons 9

Le point de méthode. Le tri coûte une fois, et achète une monotonie : dans un tableau trié, savoir que élimine paires d'un coup. Sans le tri, une comparaison n'élimine qu'une paire. C'est le sens exact de la recommandation du programme — « ordonner les données avant de les parcourir ».

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.