TD 4 : Union-Find
Union-Find
On dispose d'ensembles disjoints sur éléments, on veut :
- tester si 2 éléments appartiennent au même ensemble :
Find(x)=Find(y)? - fusionner les 2 ensembles disjoints contenant et :
Union(x,y).
Une première structure naïve
Question 1
Test si et appartiennent au même ensemble en temps (comparaison des indices d'ensemble).
Question 2
UNION : tous les éléments de l'ensemble de doivent mettre à jour leur indice z.indice = y.indice, en temps linéaire en fonction de .
Question 3
Complexité totale .
Vers une version efficace
Question 4

Question 5
La complexité de la séquence Union(1,2)...Union(1,n) est .
Question 6
On a .
Question 7
Soit la proposition : « Tout ensemble dont la racine est de rang possède au moins éléments ». On montre que cette propriété est un invariant de la structure, par récurrence sur le nombre d'opérations.
- Initialement (
MakeSet), chaque ensemble est un singleton de rang et possède élément. - Considérons une opération
Unionentre deux ensembles et de rangs vérifiant l'invariant.- Si , la racine de devient la racine de l'union et son rang reste ; l'union possède au moins éléments.
- Si , le rang de la nouvelle racine devient ; l'union possède au moins éléments. C'est l'unique cas où un rang augmente.
Dans tous les cas, l'invariant est préservé (les opérations Find ne modifient ni les rangs ni les ensembles).
Question 8
D'après la question 7, si une racine est de rang , alors son ensemble possède au moins éléments. Or , donc . Comme le rang croît strictement le long d'un chemin qui va vers la racine, la hauteur maximale d'un arbre est . Toute opération FIND et UNION prend donc un temps , et chaque opération MakeSet un temps . Ainsi, une séquence de opérations sur éléments a une complexité .
Notons qu'on peut encore améliorer la structure avec la compression de chemins, qui diminue la profondeur des arbres : combinée à l'union par rang, elle donne une complexité quasi linéaire , où est l'inverse de la fonction d'Ackermann.