Ce que la structure refuse de faire
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 23 — Unir & trouver, arbres couvrants
Énoncé
La structure ne répond qu'à une question. Pour chacune des trois demandes suivantes, dire si l'on sait y répondre sans changer le coût des deux opérations, et pourquoi.
- Combien y a-t-il de classes en ce moment ?
- Quels sont les éléments de la classe de ?
- Défaire la dernière union.
Corrigé
1. Oui, en , et gratuitement. On ajoute un champ classes initialisé à et décrémenté exactement lorsqu'une union a lieu :
let unir u x y =
let a = trouver u x and b = trouver u y in
if a = b then false (* deja unis : on ne compte pas *)
else begin ...; u.classes <- u.classes - 1; true end
L'invariant est : u.classes est le nombre de racines de la forêt. Il tient parce qu'une union effective supprime exactement une racine. Noter que unir doit rendre un booléen : sans lui, l'appelant ne saurait pas si le compteur a bougé. C'est ce que fait le true/false de la version du chapitre chap:unir, et Kruskal s'en sert.
2. Non, pas en mieux que . Les liens vont des fils vers la racine : depuis un élément on sait remonter, jamais descendre. Pour énumérer une classe il faut balayer les éléments et retenir ceux dont trouver rend le représentant voulu. Maintenir en plus la liste des éléments de chaque classe est possible, mais rend unir linéaire en la taille de la plus petite classe : on retombe sur la première mise en œuvre naïve.
3. Non, tant qu'on compresse. La compression de chemin réécrit des cases dont rien ne garde trace ; annuler l'union ne les remettrait pas en place. Le problème « Unir & trouver avec annulation » construit une variante qui sait annuler, et montre par la mesure ce que la compression y casse.
Ce que l'exercice illustre : la pauvreté du contrat n'est pas un oubli. Chacune des trois demandes ci-dessus, si on l'exigeait, ferait perdre ce qui fait la valeur de la structure.
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.