La borne est atteinte
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 23 — Unir & trouver, arbres couvrants
Énoncé
L'union par rang seule garantit une hauteur . Construire, pour , une suite d'unions qui atteint exactement cette hauteur, et vérifier.
Corrigé
C'est le tournoi : on unit d'abord les éléments deux à deux, puis les paires deux à deux, et ainsi de suite.
(* Suite d'unions atteignant la hauteur maximale. Precondition : n = 2^k. *)
let tournoi u n =
let pas = ref 1 in
while !pas < n do
let i = ref 0 in
while !i < n do
ignore (unir u !i (!i + !pas));
i := !i + 2 * !pas
done;
pas := 2 * !pas
done
Terminaison : pas double à chaque tour et la boucle s'arrête à ; il y a donc tours. Invariant : après le tour de rang , la forêt est faite de arbres de rang exactement, tous de même taille .
Pourquoi la hauteur monte à chaque tour : au tour , on unit deux arbres de même rang , et c'est le seul cas où l'union par rang laisse la hauteur croître. Le tournoi force donc l'égalité à chaque étage.
Mesure sur la forêt réellement construite, sans aucune compression :
| hauteur mesurée | ||
|---|---|---|
Et voilà pourquoi la compression n'est pas un luxe. La borne n'est pas pessimiste : elle est atteinte, par une suite d'unions parfaitement naturelle. Sans compression, un trouver coûte réellement sur cette entrée. C'est la compression qui, en aplatissant à l'usage, ramène le coût amorti à une constante.
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.