Le même élagage, dix fois plus vite
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 14 — Exploration exhaustive et retour sur trace
Énoncé
Le test compatible des reines parcourt les colonnes déjà remplies : il coûte . On peut le rendre en maintenant trois tableaux de booléens — lignes occupées, diagonales montantes, diagonales descendantes. Le nombre de nœuds change-t-il ? Et le temps ?
Corrigé
Le nombre de nœuds ne change pas d'un seul : les deux versions coupent aux mêmes endroits, elles ne diffèrent que par le prix du test.
(* Une reine en (c, l) occupe la ligne l, la diagonale montante c + l et la
diagonale descendante c - l ; on décale cette dernière de n-1 pour indexer. *)
let reines n =
let ligne = Array.make n false in
let montante = Array.make (2*n) false and descendante = Array.make (2*n) false in
let total = ref 0 in
let rec explorer c =
if c = n then incr total
else
for l = 0 to n - 1 do
if not ligne.(l) && not montante.(c + l) && not descendante.(c - l + n - 1)
then begin
ligne.(l) <- true; montante.(c + l) <- true; descendante.(c - l + n - 1) <- true;
explorer (c + 1);
ligne.(l) <- false; montante.(c + l) <- false; descendante.(c - l + n - 1) <- false
end
done
in explorer 0; !total
Temps mesurés, les deux versions rendant les mêmes comptes de solutions :
| solutions | test en | test en | rapport | |
|---|---|---|---|---|
| 10 | 724 | s | s | |
| 11 | s | s | ||
| 12 | s | s | ||
| 13 | s | s | 13,5 |
Trois observations, et la troisième est celle qui compte.
D'abord, le rapport croît avec : le test coûteux est , donc son surcoût moyen grandit avec la profondeur de l'arbre.
Ensuite, le prix payé est trois lignes à défaire au lieu de zéro. La version du cours n'avait rien à défaire, car était réécrite au tour suivant ; ici, trois tableaux sont modifiés et doivent être restaurés. On a échangé de la vitesse contre le risque de l'exercice 14.3.
Enfin — et c'est la leçon — un facteur ne change rien à la nature du problème. Cette version calcule en deux secondes ; à elle mettra des heures. L'optimisation constante recule le mur ; seul un changement de méthode le supprime, et pour les reines il n'y en a pas.
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.