Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
1
Cours 8 Arbres équilibrés
INF1101 – Algorithmes et structures de données INF1101
2
Cours 7 – Arbres équilibrés
Analyse des arbres binaires de recherche Arbres AVL Arbres rouge-noir Arbres AA INF1101
3
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
4
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
5
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
6
Arbres AVL - exemple 12 16 8 4 10 14 2 6 Cet arbre est un arbre AVL
INF1101
7
Arbres AVL – exemple Ces noeuds violent la condition 12 16 8 4 10 14 2
Après l’ajout de 1 ce n’est plus un arbre AVL INF1101
8
Arbres AVL - exemple 12 16 8 4 10 14 2 6 13 Après l’ajout de 13 ce n’est plus un arbre AVL INF1101
9
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
10
AVL – exemle de simple rotation
12 16 8 Hauteur = 2 4 10 14 2 6 Hauteur = 0 1 INF1101
11
AVL – exemple de simple rotation
12 16 8 4 10 14 2 6 1 INF1101
12
AVL – exemple de simple rotation
12 4 16 14 2 8 10 6 1 INF1101
13
AVL – exemple de simple rotation
12 4 16 14 2 8 10 6 1 INF1101
14
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
15
AVL – exemple de double rotation
12 8 16 10 4 14 2 6 Noeud inséré 7 INF1101
16
AVL – exemple de double rotation
12 8 16 10 4 14 2 6 7 INF1101
17
AVL – exemple de double rotation
12 8 16 10 6 14 4 7 2 INF1101
18
AVL – exemple de double rotation
12 8 16 10 6 14 4 7 2 INF1101
19
AVL – exemple de double rotation
12 6 16 14 8 4 10 2 7 INF1101
20
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
21
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: INF1101
22
AVL – exemple détaillé 2 INF1101
23
AVL – exemple détaillé 2 -1 10 INF1101
24
AVL – exemple détaillé 2 -2 10 -1 12 INF1101
25
AVL – exemple détaillé 2 10 12 4 16 8 6 14 10 2 12 Rotation simple
10 2 12 Rotation simple INF1101
26
AVL – exemple détaillé 10 1 2 12 -1 4 INF1101
27
AVL – exemple détaillé 10 2 12 -1 -1 4 16 INF1101
28
AVL – exemple détaillé 2 10 12 4 16 8 6 14 10 2 12 4 16 8 INF1101 1 -1
10 1 12 2 -1 -2 4 16 -1 8 INF1101
29
AVL – exemple détaillé 10 4 12 -1 2 8 16 Rotation simple INF1101
30
AVL – exemple détaillé 2 10 12 4 16 8 6 14 10 4 12 2 8 16 6 INF1101 1
10 1 4 12 -1 -1 2 8 16 1 6 INF1101
31
AVL – exemple détaillé 2 10 12 4 16 8 6 14 10 4 12 2 8 16 14 6 INF1101
10 4 -1 12 -2 2 8 16 1 1 6 14 INF1101
32
AVL – exemple détaillé 10 1 4 14 -1 2 8 12 16 1 6 Rotation double INF1101
33
AVL – autre exemple Voici un exemple où la rotation se fait loin du point d’insertion 2 10 4 14 -1 2 8 12 16 1 1 1 6 9 -1 7 Noeud inséré INF1101
34
AVL – autre exemple Voici un exemple où la rotation se fait loin du point d’insertion 8 4 -1 10 14 2 6 9 1 -1 12 16 1 7 Après rotation double INF1101
35
Arbres Rouge-Noir L’arbre a les propriétés suivantes:
Chaque noeud est soit rouge soit noir La racine est noire Si un noeud est rouge, tous ses enfants doivent être noirs À 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
36
Arbres Rouge-Noir - Exemple
30 70 15 10 20 60 85 5 50 65 80 90 40 55 INF1101
37
Arbres Rouge-Noir - Exemple
30 70 15 10 20 60 85 5 50 65 80 90 40 55 INF1101
38
Arbres Rouge-Noir – Contre-exemple
30 70 15 10 60 85 2 noeuds noirs 90 5 50 65 80 83 95 40 55 4 noeuds noirs INF1101
39
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
40
Premier cas: le frère du noeud parent est noir (on utilise la convention qu’un noeud NULL est noir)
Noeud inséré G P S X G P B S C D E A C X D E B A Rotation simple INF1101
41
Premier cas: le frère du noeud parent est noir (on utilise la convention qu’un noeud NULL est noir)
G X P G P S B S X D E A C A D E B C Noeud inséré Rotation double INF1101
42
Exemple 30 70 15 10 (NOIR) 20 60 85 5 3 50 65 80 90 (NOIR) 40 55 Noeud inséré Rotation simple INF1101
43
30 70 15 20 60 85 5 3 10 (NOIR) 90 50 65 80 (NOIR) 40 55 Rotation simple INF1101
44
30 70 15 20 60 85 5 3 10 (NOIR) 90 50 65 80 (NOIR) 40 55 Rotation simple INF1101
45
30 70 15 5 3 20 60 85 10 (NOIR) 90 50 65 80 (NOIR) 40 55 Rotation simple INF1101
46
30 70 15 20 5 60 85 3 10 50 65 80 90 (NOIR) (NOIR) 40 55 Rotation simple INF1101
47
30 70 15 10 (NOIR) 20 60 85 5 50 65 80 90 (NOIR) 8 40 55 Noeud inséré
Rotation double INF1101
48
30 70 15 20 60 85 10 (NOIR) 90 5 50 65 80 (NOIR) 8 40 55 Rotation double INF1101
49
30 70 15 8 20 60 85 10 (NOIR) 90 5 50 65 80 (NOIR) 40 55 INF1101
50
30 70 15 8 20 60 85 10 90 5 50 65 80 (NOIR) (NOIR) 40 55 INF1101
51
Si le frère du parent est rouge
Noeud inséré G P X G P S B S C D E A C X D E B A Ceci cause un problème. Lequel? INF1101
52
Si le frère du parent est rouge
Noeud inséré G P X G P S B S C D E A C X D E B A 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’avantage sur AVL INF1101
53
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
54
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 X X FG FD FG FD INF1101
55
Arbres Rouge-Noir – Exemple détaillé
10 INF1101
56
Arbres Rouge-Noir – Exemple détaillé
10 85 INF1101
57
Arbres Rouge-Noir – Exemple détaillé
10 85 15 INF1101
58
Arbres Rouge-Noir – Exemple détaillé
15 85 10 Rotation double INF1101
59
Arbres Rouge-Noir – Exemple détaillé
Attention: la racine ne change pas de couleur 15 85 10 Ajustement durant le parcours INF1101
60
Arbres Rouge-Noir – Exemple détaillé
15 85 10 70 INF1101
61
Arbres Rouge-Noir – Exemple détaillé
15 85 10 70 20 INF1101
62
Arbres Rouge-Noir – Exemple détaillé
15 70 10 20 85 Rotation simple INF1101
63
Arbres Rouge-Noir – Exemple détaillé
15 70 10 20 85 INF1101
64
Arbres Rouge-Noir – Exemple détaillé
15 70 10 20 85 Ajustement durant le parcours INF1101
65
Arbres Rouge-Noir – Exemple détaillé
15 70 10 20 85 60 INF1101
66
Arbres Rouge-Noir – Exemple détaillé
15 70 10 20 85 60 30 INF1101
67
Arbres Rouge-Noir – Exemple détaillé
15 70 10 30 85 20 60 Rotation double INF1101
68
Arbres Rouge-Noir – Exemple détaillé
15 70 10 30 85 20 60 INF1101
69
Arbres Rouge-Noir – Exemple détaillé
15 70 10 30 85 20 60 Ajustement durant le parcours INF1101
70
Arbres Rouge-Noir – Exemple détaillé
15 70 10 30 85 20 60 50 INF1101
71
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 50 Rotation double INF1101
72
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 50 INF1101
73
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 50 Ajustement durant le parcours INF1101
74
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 50 65 INF1101
75
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 50 65 80 Remarque: ces noeuds n’ont pas été modifiés parce qu’il ne sont pas dans le chemin parcouru INF1101
76
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 50 65 80 90 INF1101
77
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 50 65 80 90 INF1101
78
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 50 65 80 90 Ajustement durant le parcours INF1101
79
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 50 65 80 90 40 INF1101
80
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 5 50 65 80 90 40 INF1101
81
Arbres Rouge-Noir – Exemple détaillé
30 70 15 10 20 60 85 5 50 65 80 90 40 55 INF1101
82
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
83
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é? INF1101
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.