• Aucun résultat trouvé

UE ALGO5 TD2 Séance 10 : Union-Find

N/A
N/A
Protected

Academic year: 2022

Partager "UE ALGO5 TD2 Séance 10 : Union-Find"

Copied!
3
0
0

Texte intégral

(1)

L3 Informatique Année 2021 2022

UE ALGO5 TD2 Séance 10 : Union-Find

Objectifs

À la n de cette séance, vous devriez être capable de :

choisir des structures de données adaptées aux spécications ;

calculer des complexités en moyenne, pondérées, du meilleur et pire cas.

Exercice 1.

Soit un ensembleE={1,. . .,n}. On souhaite implémenter une structure permettant de gérer des partitions de E.

Rappel :{P1,. . .,Pn}est une partition deE si : Pi6=∅

S

iPi=E

i6=jPiPj=∅.

On spécie un typeidpermettant d'identier les sous-ensembles, ainsi que les primitives suivantes : id : type abstrait

Initialiser

{Après l’appel à Initialiser, la structure contient la partition P0 où chaque élément de E est l’élément unique d’un ensemble de P0 :P0={{1},. . .,{n}}}

Find : entier→id

{Find(x) renvoie l’identifiant du sous-ensemble auquel appartient x. Find(x)=Find(y) ssi x et y appar- tiennent au même sous-ensemble. }

Union(données x,y : entiers)

{ Union(x,y) réalise l’union des deux sous-ensembles auxquels appartiennent x et y. Après cet appel, Find(x)=Find(y)}

On souhaite implémenter de manière ecace les primitives Union et Find. Pour cela, on utilise un tableauP denentiers représentant une forêt, dans laquelle chaque arbre contient les éléments d'un même sous-ensemble.

P(x)est déni comme étant le parent dex; un sous-ensemble est représenté par l'élément à la racine de l'arbre.

P : tableau sur [1..n] d’entiers sur 1..n

Q 1. Dessiner la structureP et les arbres correspondants à l'initialisation, puis après plusieurs appels àUnion.

Corrigé

Après initialisation,P est représenté par une forêt de n÷uds (sans enfants) :

1 2 3 4 5 6 7 8 9 10

P = 1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

Après appel àUnion, la structure dépend de l'implémentation choisie. Un exemple :

1 Union(2,5)

(2)

1 2 3 4 5 6 7 8 9 10

P = 1 5 3 4 5 6 7 8 9 10

1 3 4 5

2

6 7 8 9 10

1 Union(4,2) Union(6,1)

3 Union(8,5)

1 2 3 4 5 6 7 8 9 10

P = 1 5 3 2 5 1 7 5 9 10

1

6

3 5

2

4 8

7 9 10

Q 2. Réaliser l'opération d'initialisation, puis les primitivesUnionet Find. Quel est le coût de ces deux opéra- tions ?

Corrigé

L'identiant d'un ensemble de la partition correspond à l'élément à la racine de l'arbre représentant cet ensemble.

Initialiser créenn÷uds pointant sur eux-mêmes (doncnarbres comportant un seul n÷ud). On identie par la suite la raciner d'un arbre au fait queP[r]=r.

Initialiser:

2 pouride1 à n P[i]<−i

4

Find(x):

6 siP[x] = xalors retourner x

8 sinon

retourner Find(P[x])

10

Union(x,y):

12 { on relie la racine de l’arbre contenant x à y } px<−Find(x)

14 P[px]<−y

Dans le pire cas, on va créer un arbre réduit à une liste : les deux opérations sont enO(n) (coût de recherche de la racine).

Q 3. Proposer puis implémenter une méthode permettant d'améliorer le coût des deux opérations.

(3)

Corrigé

L'idée est d'essayer de minimiser la hauteur des arbres construits. On peut identier deux heuristiques : union by rank : on conserve, pour chaque arbre, la hauteur de l'arbre. Lorsqu'on réalise une union, on relie

la racine de l'arbre le moins haut à la racine de l'arbre le plus haut.

{ h[x] contient la hauteur de l’arbre de racine x }

2 Initialiser:

pouride1 à n

4 P[i]<−i

h[i]<−0

6

Union(x,y):

8 { on relie la racine de l’arbre contenant x à y } px<−Find(x)

10 py<−Find(y) sih[px] > h[py]alors

12 P[py]<−px sinon

14 P[px]<−py

{ cas particulier : arbres de hauteurs égales }

16 sih[px] = h[py]alors h[py]<−h[py] + 1

path compression : lors de chaque opérationFind(x), on relie le n÷udxà la racine de l'arbre Find(x):

2 siP[x] = xalors retourner x

4 sinon

P[x]<−Find(P[x])

6 retourner P[x]

Références

Documents relatifs

Modiez cette fonction pour acher le nombre d'opérations arithmétiques (addition, division, etc.) qu'elle eectue lors de chaque exécution..

instrumenter un programme pour évaluer expérimentalement son temps d'exécution ; faire des choix pertinents pour analyser les traces de cette instrumentation ;.. réaliser

décrire la spécication d'un programme sous forme d'un oracle (programme de vérication) ; réaliser l'APNÉE 2.

éventuellement, un jeu d'essai peut être généré (partiellement) de manière automatique : cf Apnée Prog5 ; sauf pour les tests de robustesse, il n'est pas utile ni très pertinent

On souhaite maintenant associer une priorité à chaque requête : lors de l'exécution de la primitive Extraire c'est une requête (quelconque) de priorité maximale (parmi les

On peut en eet dans ce cas utiliser pour cela un tableau de le d'attente, ou, plus facile à gérer, un tableau de pile TabPile indicé par priorité (bien remarquer qu'aucun ordre

Nous aurons également besoin d'une notion de liste d'arbres : ici nous allons également représenter une liste par un arbre binaire : le premier élément de la liste se trouve à la

Si elles ont des rangs inégaux, la racine de plus haut rang devient le parent de la racine de moindre rang, mais les rangs eux-mêmes ne changent pas.. En cas d’égalité entre les