900 likes | 1.23k Vues
Cours 8 Arbres équilibrés. INF1101 – Algorithmes et structures de données. Cours 7 – Arbres équilibrés. Analyse des arbres binaires de recherche Arbres AVL Arbres rouge-noir Arbres AA. Arbres binaires - analyse.
E N D
Cours 8 Arbres équilibrés INF1101 – Algorithmes et structures de données
Cours 7 – Arbres équilibrés • Analyse des arbres binaires de recherche • Arbres AVL • Arbres rouge-noir • Arbres AA
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
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
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
12 10 16 14 8 4 2 6 Arbres AVL - exemple Cet arbre est un arbre AVL
12 10 16 14 8 4 2 6 1 Arbres AVL – exemple Ces noeuds violent la condition Après l’ajout de 1 ce n’est plus un arbre AVL
12 10 16 14 13 8 4 2 6 Arbres AVL - exemple Après l’ajout de 13 ce n’est plus un arbre AVL
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
12 10 16 14 8 4 2 6 1 AVL – exemle de simple rotation Hauteur = 2 Hauteur = 0
12 16 14 10 8 4 2 6 1 AVL – exemple de simple rotation
12 16 14 10 8 4 2 6 1 AVL – exemple de simple rotation
12 16 14 10 8 4 2 6 1 AVL – exemple de simple rotation
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; }
10 8 AVL – exemple de double rotation 12 16 4 14 2 6 Noeud inséré 7
10 8 AVL – exemple de double rotation 12 16 4 14 2 6 7
10 8 AVL – exemple de double rotation 12 16 6 14 4 7 2
10 8 AVL – exemple de double rotation 12 16 6 14 4 7 2
10 8 AVL – exemple de double rotation 12 16 6 14 4 7 2
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
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
2 AVL – exemple détaillé 2 10 12 4 16 8 6 14 0
10 2 AVL – exemple détaillé 210 12 4 16 8 6 14 -1 0
10 12 AVL – exemple détaillé 2 10 12 4 16 8 6 14 -2 2 -1 0
10 12 2 AVL – exemple détaillé 2 10 12 4 16 8 6 14 0 0 0 Rotation simple
10 12 2 4 AVL – exemple détaillé 2 10 12 4 16 8 6 14 1 0 -1 0
10 12 16 2 4 AVL – exemple détaillé 2 10 12 4 16 8 6 14 0 -1 -1 0 0
10 12 16 4 8 AVL – exemple détaillé 2 10 12 4 168 6 14 1 -1 2 -2 -1 0 0
10 12 16 4 8 2 AVL – exemple détaillé 2 10 12 4 168 6 14 0 0 -1 0 0 0 Rotation simple
10 12 16 4 8 2 6 AVL – exemple détaillé 2 10 12 4 16 8 6 14 1 -1 -1 0 1 0 0
14 10 16 6 2 4 8 AVL – exemple détaillé 2 10 12 4 16 8 6 14 0 -2 12 -1 1 0 1 0 0
12 10 14 16 6 4 8 2 AVL – exemple détaillé 2 10 12 4 16 8 6 14 1 0 -1 0 1 0 0 0 Rotation double
16 12 14 6 1 9 4 8 2 AVL – autre exemple Voici un exemple où la rotation se fait loin du point d’insertion 2 10 0 -1 1 1 0 0 0 -1 0 7 0 Noeud inséré
16 12 14 6 9 4 8 2 1 AVL – autre exemple Voici un exemple où la rotation se fait loin du point d’insertion 0 0 -1 10 0 1 0 -1 0 0 0 7 0 Après rotation double
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
Arbres Rouge-Noir - Exemple 30 70 15 20 10 85 60 90 65 80 5 50 40 55
Arbres Rouge-Noir - Exemple 30 70 15 20 10 85 60 90 65 80 5 50 40 55
Arbres Rouge-Noir – Contre-exemple 30 70 15 10 85 60 2 noeuds noirs 90 65 80 5 50 83 95 40 55 4 noeuds noirs
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
Premier cas: le frère du noeud parent est noir (on utilise la convention qu’un noeud NULL est noir) Noeud inséré P G G X S P B S E C D A C X E D B A Rotation simple
Premier cas: le frère du noeud parent est noir (on utilise la convention qu’un noeud NULL est noir) X G G P S P B S E C D A X A E D C B Noeud inséré Rotation double
10 (NOIR) 5 3 Exemple 30 70 15 20 85 60 90 65 80 50 (NOIR) 40 55 Noeud inséré Rotation simple
10 (NOIR) 5 3 30 70 15 20 85 60 90 65 80 50 (NOIR) 40 55 Rotation simple
10 (NOIR) 5 3 30 70 15 20 85 60 90 65 80 50 (NOIR) 40 55 Rotation simple
10 (NOIR) 5 3 30 70 15 20 85 60 90 65 80 50 (NOIR) 40 55 Rotation simple
30 70 15 20 85 5 60 90 10 65 80 3 50 (NOIR) (NOIR) 40 55 Rotation simple
10 (NOIR) 30 70 15 20 85 60 90 65 80 5 50 8 (NOIR) 40 55 Noeud inséré Rotation double
10 (NOIR) 30 70 15 20 85 60 90 65 80 5 50 8 (NOIR) 40 55 Rotation double
10 (NOIR) 30 70 15 20 8 85 60 90 65 80 5 50 (NOIR) 40 55
30 70 15 20 8 85 60 90 10 65 80 5 50 (NOIR) (NOIR) 40 55