Adloun

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.