informatique (MP2I/MPI) · Chapitre 23 · Exercice de TD
La borne est atteinte
Unir & trouver, arbres couvrants · niveau 2
É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.
Exercices semblables
- Ce que la structure refuse de faire corrigé
- Les deux naïves, chiffrées corrigé
- La faute qui sépare au lieu d'unir corrigé
- Le rang ment, et c'est voulu corrigé
- Combien d'arbres couvrants minimaux ? corrigé