INF1101 Cours 8 Arbres équilibrés INF1101 – Algorithmes et structures de données

Preview:

Citation preview

INF1101

Cours 8 Cours 8 Arbres équilibrésArbres équilibrés

INF1101 – Algorithmes et structures de INF1101 – Algorithmes et structures de donnéesdonnées

INF1101

Cours 7 – Arbres équilibrés

• Analyse des arbres binaires de recherche

• Arbres AVL

• Arbres rouge-noir

• Arbres AA

INF1101

Arbres binaires - analyse• Le prix d’une opération (recherche, insertion, retrait) est

proportionnel au nombre de noeuds visités• Donc, coût proportionnel à 1+profondeur• Meilleur cas: arbre équilibré (les feuilles à peu près toutes

à la même profondeur)– insertion et retrait aléatoire tendent à créer un arbre équilibré– profondeur = lg n

• Pire cas: liste chaînée– par exemple lors de l’insertion d’éléments ordonnés– profondeur = n

• Donc, le coût est O(lg n) dans le meilleur cas et O(n) dans le pire cas

INF1101

Arbres équilibrés – concepts de base• Situation idéale visée: s’assurer que le sous-

arbre de gauche et le sous-arbre de droite sont de même hauteur

• Ce principe s’appliquerait à tous les noeuds de manière récursive

• Si on appliquait ceci à chaque insertion ou retrait, ce serait très coûteux

• Il faut donc établir des conditions plus faibles, mais qui nous assurent des gains en performance

INF1101

Arbres AVL• Définition: arbre de recherche binaire tel que

pour chaque noeud, les hauteurs des ses sous-arbres gauche et droite sont différentes d’au plus 1 (on attribue la valeur -1 pour un sous-arbre vide)

• Avec cette condition, on est assuré de toujours avoir un arbre dont la profondeur est proportionnelle à lg N

INF1101

Arbres AVL - exemple

12

8

4 10

16

2

14

6

Cet arbre est un arbre AVL

INF1101

Arbres AVL – exemple

12

8

4 10

16

2

14

6

Après l’ajout de 1 ce n’est plus un arbre AVL

1

Ces noeuds violentla condition

INF1101

Arbres AVL - exemple

12

8

4 10

16

2

14

6 13

Après l’ajout de 13 ce n’est plus un arbre AVL

INF1101

Arbres AVL• Il faut, après chaque insertion ou retrait, rétablir

l’équilibre s’il a été rompu par l’opération• Observation importante: après une insertion,

seuls les noeuds qui sont sur le chemin du point d’insertion à la racine sont susceptibles d’être déséquilibrés

• Deux cas:– insertion dans le sous-arbre de gauche du fils gauche

ou dans le sous-arbre de droite du fils droit: Simple rotation

– insertion dans le sous-arbre de droite du fils gauche ou dans le sous-arbre de gauche du fils droit: Double rotation

INF1101

AVL – exemle de simple rotation

12

8

4 10

16

2

14

6

1

Hauteur = 2

Hauteur = 0

INF1101

AVL – exemple de simple rotation

12

8 16

144

2 6

1

10

INF1101

AVL – exemple de simple rotation

12

8

16

14

4

2

61

10

INF1101

AVL – exemple de simple rotation

12

8

16

14

4

2

61

10

INF1101

Arbres AVL – simple rotation (fils gauche)

template <class T>void BST<T>::rotateWithLeftChild(Node * & k2) const{

Node *k1 = k2->left;k2->left = k1->right;k1->right = k2;k2 = k1;

}

INF1101

AVL – exemple de double rotation

12

4

16

2

14

6

8

10

7

Noeud inséré

INF1101

AVL – exemple de double rotation

12

4

16

2

14

6

8

10

7

INF1101

AVL – exemple de double rotation

12

4

16

2

146

8

10

7

INF1101

AVL – exemple de double rotation

12

4

16

2

146

8

10

7

INF1101

AVL – exemple de double rotation

12

4

16

2

14

6

8

107

INF1101

AVL – implémentation• Algorithme récursif• Une fois le noeud inséré, en revenant sur notre

chemin, il faut vérifier, pour chaque noeud parcouru, les différences de profondeur des sous-arbres gauche et droite

• La rotation peut être requise à n’importe quel noeud qui se trouve dans le chemin de la racine au point d’insertion

• Le retrait est passablement plus compliqué que l’insertion (mais demeure O(lg N))

• Il y a d’autres types d’arbres équilibrés plus facile à implémenter et plus efficaces

INF1101

AVL – exemple détaillé

Pour chaque noeud on mettra

0 si ses deux sous-arbres ont la même profondeur +n si le sous-arbre gauche est plus profond avec une différence = n

-n si le sous-arbre droit est plus profond avec une différence = n

Séquence d’insertion:

2 10 12 4 16 8 6 14

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

2 0

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

2

10 0

-1

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

2

10

12 0

-1

-2

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

10

122

Rotation simple

00

0

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

10

122

4 0

-1 0

1

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

10

122

4 16 00

-1-1

0

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

10

122

4 16

8 0

-1

-2

0

-1

1

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

10

124

8 162

Rotation simple

0 0 0

-10

0

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

10

124

8 162

6 0

10

-1

0

-1

1

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

10

124

8 162

6 140 0

1

-2

10

-1

0

INF1101

AVL – exemple détaillé2 10 12 4 16 8 6 14

10

144

8 162

6

12

Rotation double

0

1

00

0

0

-1

1

INF1101

AVL – autre exempleVoici un exemple où la rotation se fait loin du point d’insertion

10

144

8 162

6

12

-1

1

0 0

0

1

-1

2

10 9 0

70

Noeud inséré

INF1101

AVL – autre exemple

10

14

4

8

16

2 6

12

-1

0

01

-1

10

9

070

Après rotation double

0

0

0

Voici un exemple où la rotation se fait loin du point d’insertion

INF1101

Arbres Rouge-Noir• L’arbre a les propriétés suivantes:

1. Chaque noeud est soit rouge soit noir2. La racine est noire3. Si un noeud est rouge, tous ses enfants doivent être

noirs4. À partir de n’importe quel noeud, tous les chemins de

la racine jusqu’à un pointeur NULL doivent avoir le même nombre de noeuds noirs

• Comme la racine est noire et il ne peut y avoir plus de deux noeuds rouges consécutifs, la longueur de tout chemin de la racine à une feuille ne peut être supérieure à 2 fois le nombre de noeuds noirs dans ce chemin

INF1101

Arbres Rouge-Noir - Exemple

30

85

80 90

60

5540

50 65

15

20

5

10

70

INF1101

Arbres Rouge-Noir - Exemple

30

85

80 90

60

5540

50 65

15

20

5

10

70

INF1101

Arbres Rouge-Noir – Contre-exemple

30

85

80 90

60

5540

50 65

15

5

10

70

83 95

2 noeuds noirs

4 noeuds noirs

INF1101

Arbres Rouge-Noir - insertion• Un noeud inséré est toujours une feuille• On peut pas le colorier en noir, puisque cela

violerait la condition 4• On colore le noeud en rouge• Si le père est noir, pas de problème• Si le père est rouge, on viole la condition 3. Dans

ce cas, on ajuste l’arbre, par le biais de changements de couleurs et de rotations

INF1101

Premier cas: le frère du noeud parent est noir (on utilise la convention qu’un noeud NULL est noir)

P

X

G

C

Noeud inséré

A B

S

D E

P

X G

CA B S

D E

Rotation simple

INF1101

Premier cas: le frère du noeud parent est noir (on utilise la convention qu’un noeud NULL est noir)

P

X

G

C

Noeud inséré

A

B

S

D E

X

P G

CA B S

D E

Rotation double

INF1101

30

85

80 90

60

5540

50 65

15

20

70

5

3

Noeud inséré

10

(NOIR)

(NOIR)

Rotation simple

Exemple

INF1101

30

85

80 90

60

5540

50 65

15

20

70

5

3

10

(NOIR)(NOIR)

Rotation simple

INF1101

30

85

80 90

60

5540

50 65

15

20

70

5

3

10

(NOIR)(NOIR)

Rotation simple

INF1101

30

85

80 90

60

5540

50 65

15

20

70

5

3 10

(NOIR)(NOIR)

Rotation simple

INF1101

30

85

80 90

60

5540

50 65

15

20

70

5

3 10

(NOIR)(NOIR)

Rotation simple

INF1101

30

85

80 90

60

5540

50 65

15

20

70

5

8

Noeud inséré

10

(NOIR)

(NOIR)

Rotation double

INF1101

30

85

80 90

60

5540

50 65

15

20

70

5

8

10

(NOIR)(NOIR)

Rotation double

INF1101

30

85

80 90

60

5540

50 65

15

20

70

5

8

10

(NOIR)(NOIR)

INF1101

30

85

80 90

60

5540

50 65

15

20

70

5

8

10

(NOIR)(NOIR)

INF1101

Si le frère du parent est rouge

P

X

G

C

Noeud inséré

A B

S

D E

P

X G

CA B S

D E

Ceci cause un problème. Lequel?

INF1101

Si le frère du parent est rouge

P

X

G

C

Noeud inséré

A B

S

D E

P

X G

CA B S

D E

Ceci cause un problème. Lequel?Si le parent de P est rouge, il faudra propager vers le haut les ajustements, ce qui nous fait perdre l’avantagesur AVL

INF1101

Arbres Rouge-Noir – top-down• Pour éviter de devoir propager vers le haut

l’algorithme de rotation, on peut utiliser une approche top-down

• Idée: garantir que, lorsqu’on arrive au point d’insertion, qu’il ne s’agisse pas d’un noeud rouge

• On pourra donc ajouter tout simplement un noeud rouge, sans risque de violer la propriété 3

INF1101

Arbres Rouge-Noir – top-down (suite)• En descendant dans l’arbre, lorsqu’on rencontre un noeud qui a deux

fils rouges, on colore ce noeud rouge et noir ses deux fils:

• Ainsi, le nombre de noeuds noirs dans un chemin demeure inchangé• Par contre, on peut se retrouver avec deux noeuds rouges

consécutifs, si le parent de X est rouge. Dans ce cas, il faudra appliquer une rotation

• Ceci fonctionnera parce qu’on est sur que le noeud frère du parent de X ne peut être que noir.

• Attention: la racine doit toujours demeurer noire

FDFG

X

FDFG

X

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

10

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

10

85

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

10

85

15

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

8510

Rotation double

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

8510

Ajustement durant le parcours

Attention: la racine ne changepas de couleur

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

8510

70

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

8510

70

20

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

7010

20 85

Rotation simple

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

7010

20 85

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

7010

20 85

Ajustement durant le parcours

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

7010

20 85

60

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

7010

20 85

60

30

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

7010

30 85

6020

Rotation double

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

7010

30 85

6020

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

7010

30 85

6020

Ajustement durant le parcours

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15

7010

30 85

6020

50

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

1570

10

30

856020

50

Rotation double

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

1570

10

30

856020

50

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

1570

10

30

856020

50

Ajustement durant le parcours

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

1570

10

30

856020

50 65

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15 70

10

30

856020

50 65 80

Remarque: ces noeuds n’ont pas étémodifiés parce qu’il ne sont pas dans lechemin parcouru

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15 70

10

30

856020

50 65 80 90

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15 70

10

30

856020

50 65 80 90

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15 70

10

30

856020

50 65 80 90

Ajustement durant le parcours

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15 70

10

30

856020

50 65 80 90

40

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15 70

10

30

856020

50 65 80 90

40

5

INF1101

Arbres Rouge-Noir – Exemple détaillé10 85 15 70 20 60 30 50 65 80 90 40 5 55

15 70

10

30

856020

50 65 80 90

40

5

55

INF1101

Arbres AA• Implémentation plus simple que les autres• Une condition supplémentaire: le fils de gauche

ne peut pas être rouge• Soit le niveau d’un noeud défini ainsi:

– 1 si c’est une feuille– niveau du parent si le noeud est rouge– (1 – niveau du parent) si le noeud est noir

• On construit un arbre équivalent avec cette définition de niveau et on obtient un algorithme plus simple à implémenter (voir livre)

INF1101

Question• Pourquoi les arbres de recherche binaire sont-ils

en général plus efficace qu’une recherche dichotomique dans un tableau trié?

• Peut-on imaginer des situations où il serait préférable d’utiliser une recherche binaire dans un tableau ordonné?