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 brute | après tri | |
|---|---|---|
| (la paire existe) | 36 comparaisons | 1 |
| (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.