Skip to main content

Graphe - Abres

Union Find

On dispose d'ensembles disjoints sur nn éléments, on veut

  • Tester si 2 éléments x,yx,y appartiennent au même ensemble ? Find(x)=Find(y)
  • Fusionner 2 ensembles disjoints contenant xx et yy Union(x,y)

Une première structure naïve

Question 1

Test si xx et yy appartient au même ensemble en temps O(1)O(1)

Question 2

UNION : Tous les éléments zz de l'ensemble de xx doivent mettre à jour leur indice z.indice = y.indice en temps linéaire en fonction de nn

Question 3. Complexité totale O(k2)O(k^2)

Vers une version efficace

Question 4

unionexec

Question 5

La complexité de la séquence Union(1,2)...Union(1,n) est Θ(n2)\Theta (n^2)

Question 6

On a rang(p)>rang(q)rang(p)>rang(q)

Question 7

On va utiliser le principe de récurrence forte: Soit P(n)P(n) une propriété définie sur NN, si

  • P(0)P(0).
  • [knP(k)]P(n+1)[\forall k\leq n P(k)] \Rightarrow P(n + 1) (pour tout nNn \in N)

alors P(n)P(n) pour tout entier nNn ∈ N.

Soit P(r)P(r) la proposition: “Tout ensemble dont la racine est de rang r possède au moins 2r2^r éléments”. Supposons que P(0),...,P(r)P(0),...,P(r) soit vérifiés. Soient 2 ensembles S1S_1 et S2S_2 de rang r1rr_1 \leq r et r2rr_2 \leq r. Si r1r2<rr_1 \leq r_2 < r, le rang de l’union est inférieur à rr, hypothèse vérifiée. Si r1<r2=rr1<r2=r, le rang de l’union est rr. l’ensemble possède au moins 2r1+2r2r2^r1+2^r \geq 2^r. Si r1=r2=rr1=r2=r, le rang de l’union est r+1r+1, l’ensemble possède au moins 2r+2r2r+12^r+2^r \geq 2^{r+1}. On a P(r+1)P(r+1) vérifiée. Il s’agit de l’unique cas où le rang dépasse rr. Dans tous les cas, on a que P(0),...,P(r)P(0),...,P(r) implique P(r+1)P(r+1).

Question 8

Par récurrence, on sait que si une racine est de rang rr alors son ensemble possède au moins 2r2^r éléments (question 7). Or 2rn2^r \leq n donc rlog2(n)r \leq \log_2(n). Comme il y a croissance du rang dans un chemin qui va vers la racine, on a que la hauteur maximale de l’arbre est donc log2(n)\lceil \log_2(n) \rceil. Toute opération FIND et UNION prend un temps O(log(n))O(\log(n)). Chaque opération MakeSet prend un temps O(1)O(1). Ainsi la complexité est O(m+nlogn)O(m+n \log n).

Notons qu’on peut encore améliorer la structure avec une opération simple de compressions de chemins pour diminuer encore la profondeur de l’arbre.