IFT2015 13 Arbres rouge-et-noir
Transcription
IFT2015 13 Arbres rouge-et-noir
Miklós Csűrös IFT2015 13 6 décembre 2016 Arbres rouge-et-noir 13.1 Rang et coloriage (en) Règles. 1. Pour chaque nœuda x excepté la racine, On associe une valeur entière non-négative à chaque nœud. On va l’appeler le «rang» (avant de trouver un meilleur nom), dénoté par rang(x). Le rang est croissant vers la racine, comme la hauteur, mais avec un équilibre permissif entre deux sous-arbres frères, parce que parfois le rang du père est le même que celui de l’enfant. Le but est de contrôler le déséquilibre (trop de rangs identiques mènent à une plus grande hauteur possible), mais pas excessivement (il faut ajuster la structure en O(log n) temps au pire à chaque opération). On va démontrer que les règles à côté accomplissent exactement ce but. r rang 3 2 2 12 1 3 1 1 0 1 4 7 8 11 2. Pour chaque nœud x avec un grand-parent rang(x) < rang parent(parent(x)) . 3. Pour chaque nœud externe (null) on a rang(x) = 0 rang(parent(x)) = 1. a Pour les buts de la discussion, on considère les nœuds externes comme ayant une identité distincte, et donc parent(x) donne le parent du nœud x même si x est externe. Dans le code on représente les nœuds externes par null, comme d’habitude. Au lieu de stocker les rangs explicitement, il suffit de stocker la différence entre parent et enfant, en coloriant les nœuds par rouge ou noir. ? si rang(parent(x)) = rang(x), alors x est colorié par rouge ? si x est la racine ou rang(parent(x)) = rang(x)+ 1, alors x est colorié par noir 9 6 rang(x) ≤ rang(parent(x)) ≤ rang(x) + 1. 15 19 0 Théorème 13.1. Dans un coloriage valide, (0) chaque nœud est soit noir soit rouge (i) chaque nœud externe (null) est noire (ii) le parent d’un nœud rouge est noir (iii) tout chemin d’un nœud x à un nœud externe dans son sous-arbre contient le même nombre de nœuds noirs Démonstration de Théorème 13.1. Propriété (0) ⇔ Règle 1, (i) ⇔ Règle 3, (ii) ⇔ Règle 2. En (iii), le nombre de nœuds noirs égale rang(x), en justifiant l’appellation hauteur noire. Lemme 13.2. Pour chaque nœud x, sa hauteur h(x) ≤ 2 · rang(x). Démonstration. Sur un chemin jusqu’à un nœud externe, il y a au moins autant de nœuds noirs que des rouges. Lemme 13.3. Le nombre de déscendants internes de chaque nœud x est ≥ 2rang(x) − 1. Démonstration. Par induction [dans la hauteur de x]. Le théorème est vrai pour un nœud externe x quand rang(x) = 0. Supposons que le théorème est vrai pour tout x avec une hauteur h(x) < k. Considérons un nœud x avec h(x) = k et ses deux enfants u, v avec h(u), h(v) < k. Par l’hypothèse d’induction, le nombre des descendants de x est ≥ 1+(2rang(u) −1)+(2rang(v) −1) = 2rang(u) +2rang(v) −1. Or, rang(x)−1 ≤ rang(u), rang(v), ou 2rang(u) +2rang(v) ≥ 2rang(x) . Le théorème reste donc vrai pour x avec h(x) = k, et, en conséquence pour tout x. 13.1 Théorème 13.4. La hauteur d’un arbre RN avec n nœuds internes est bornée comme lg(n + 1) ≤ h ≤ 2 lg(n + 1). Démonstration. La borne inférieure correspond à l’arbre binaire complet. La borne supérieure vient de 13.2 et 13.3 : 2rang(racine) − 1 ≤ n par 13.3 rang(racine) ≤ lg(n + 1) h/2 ≤ lg(n + 1) par 13.2 13.2 Arbre RN : temps de calcul des opérations On ajuste la structure lors d’une insertion ou suppression de noeud en parcourant un chemin vers la racine, en O(h) temps pour un arbre de hauteur h. Par Théorème 13.4, la hauteur d’un arbre RN est toujours h = Θ(log n), donc toutes les opérations s’exécutent en O(log n), même dans le pire cas. Promotion de x r+1 r+1 Rétrogradation de x r r+1 x r r x r r Ajustement de la structure. Pour maintenir l’équilibre, on utilise les rotations comme avant + promotion/rétrogradation (incrémenter ou décrementer le rang par 1). → promotion/rétrogradation change la couleur d’un nœud et ses enfants. → on ne peut promouvoir x que s’il est noir avec deux enfants rouges (pour ne pas violer Règle 1 et Propriété (ii) de Théorème 13.1) Insertion. On insère x avec rang(x) = 1 ⇒ sa couleur est rouge. Test : est-ce que le parent de x est rouge ? Si oui, on a un problème ; sinon, rien à faire (cas 0a). Solution : examiner le grand-parent y = parent(parent(x)) : il est forcément noir par Propriété (ii) de Théorème 13.1. Selon le coloriage des enfants de y (le parent et l’oncle de x), on fait une série de promotions (cas 0b : oncle rouge), suivie par une ou deux rotations (cas 1 ou 2 : oncle noir), en configurations zig-zag, zig-zig, etc. 1 1 0 1 2 0 1 y 0 2 0 ou 1 y x 0 ou 1 x Suppression. Pour la suppression, on utilise une technique similaire : procéder comme avec l’arbre binaire de recherche, puis retrogradations en ascendant vers la racine + O(1) rotations (trois au plus) à la fin. L’ajustement de la structure départ par l’examination du nœud y physiquement enlevé (donc, c’est le successeur ou prédecesseur si on a supprimé la clé d’un nœud avec deux enfants non-null). Le nœud y est remplacé par x qui est un des enfants de y. Selon la différence de rangs entre x et y (donc couleur de x), on fait une série de rétrogradations, et quelques rotations. 13.2 A r x r B C y D Rotation droite à y A r x B r une rotation simple r C y D r x r r+1 Promotion de y r x r Cas 0a : parent noir r x y r r+1 y r A r x A r B B r r r x D D C Rotation droite à y A r x B r C A y D r B une rotation double C y y C y D r r x rien àRotation fairedouble Cas 1 : parent rouge, oncle noir, zig-zig r r r x r r y r Promotion de y r x r r+1 y 13.3 A B C r-1 u D F r-2 A r-2 x B C une rotation double E v Deletion dans l’arbre RN 4 D E v F r-2 A r B r r x y C D Rotation double A r B r x C y D r B C r-1 u D E v F r-1 A r-2 x B C r-1 u D E F une rotation simple, continuer avec x en cas 1 (pas de récursion en 1a) A r Cas 0b : parent rouge, oncle rouge promotion du grandparent, continuer avec x ← y Cas 2 : parent rouge, oncle noir, zig-zag promotion du grandparent, continuer avec x ← y Cas 2 : parent rouge, oncle noir, zig-zag r r r une rotation simple une rotation double Cas 0 : nœud rouge x — il devient noir, et on arrête : neveu distant rouge Cas 1a : sœur noire, neveux noirs Pour la délétion, on utilise une technique Cas 1b : similaire sœur noire, r r-1 r de recherche, r procéder comme avec l’arbre binaire y y y z Retrogradation de y Rotation gauche à y 1 1 2 2 puis retrogradations en ascendant vers la racine + r-2 0 r-1 r-2 r-1 r-2 r-1 r-1 r-1 0 oux1 x z z O(1) rotations (trois au plus) à la fin. x z y v 1 1 x r-1 y y ou r-1 On r-2enlève un nœud y : remplacement (si r-2 r-2 r-2 r-2 r-2 par null r-1 ou u u v0 u v u v x 0 0 ou 1 A A B B A B E F r-2 x aucun enfant) ou par l’enfant non-null. Ce dernier peutF être de rang trop petit (nœud noir Cremplacé par C D E F C D E D E F A B C D nœud noir x). retrogradation du parent, continuer avec x ← y en cas 0, 1, ou 2 une rotation simple Plusieurs cas : Deletion rouge-noir Cas 1c :xsœur noire, neveu rouge Cas 2 : sœur rouge � Cas 0 : nœud rouge : rétrogradation —proche il devient noir, et rien plus à faire r r r r y avec une sœur noire u y z � Cas 1 : nœud noir Rotation double Rotation gauche à y � Cas 2 : nœud noir avec une sœur rouge r-2 r-1 r-1 r-1 r-2 r r r-1 x z y z x z y v En cas 1, il faut aussi vérifier la couleur des enfants de la sœur (les neveux) 15.4 Insertion rouge-noir rien à faire Cas 1 : parent rouge, oncle noir, zig-zig x IFT2015 — H09: ABR S ÉQUILIBR ÉSr. M IKL ÓS C S ŰR ÖS . r r+1 On insère x avec rang(x) = 1 ⇒ sa couleur est rouge. Test : est-ce que le parent de x est rouge ? Si oui, on a un problème ; sinon, rien à faire (cas 0a). Solution : soit y = parent(parent(x)) le grand-parent — il est noir. Si y a deux enfants rouge, alors promouvoir y et retourner au test avec x ← y (cas 0b). Si on a fini les promotions et il y a toujours le problème que x est rouge, son parent est rouge aussi, mais l’oncle de x est noir. On fait une ou deux rotations (cas 1 ou 2) selon la relation de x et parent(x) (au même côté ou non). Cas 0a : parent noir Cas 0b : parent rouge, oncle rouge 1 I NSERTION S UPPRESSION 13.3 Arbre 2-3-4 y x x z A B C A y B B A x x En fusionnant le nœuds rouges avec leurs parents noirs, on obtient un arbre 2-3-4 : c’est un arbre de recherche non-binaire où chaque nœud fusionné comprend A C i. soit 1 clé et 2 enfants (un seul nœud noir), B ii. soit 2 clés et 3 enfants (nœud noir avec un enfant rouge), y B iii. soit 3 clés et 4 enfants (nœud noir avec deux enfants rouges), C Par la propriété d’équilibre chez les arbres rougeet-noir, toutes les feuilles de l’arbre 2-3-4 sont au même niveau (une feuille est un nœud interne dont tous les enfants sont externes) B x x y A B 13.4 D x y A C D x A z A y B C C Insertion dans un arbre 2-3-4 On peut adapter les opérations de l’arbre rouge-et-noir à l’arbre 2-3-4. Par exemple : qu’est-ce qui se passe lors d’une insertion ? On crée un nœud rouge, on performe des promotions en ascendant vers la racine, avec une rotation possible à la fin. Ceci correspond à une séquence de découpages, suivi par une décalage dans le cas de l’arbre 2-3-4. 13.4 y rang r u Promotion v u x promotion correspond à découpage («éclatement») en ascendant rang r+1 y rang r v x y u y C v Découpage D u v E A x A x B C D E B Rotation y z z x y x rotation correspond décalage à z Décalage y C x D A z B y C D x A B y (nouvelle racine) promotion de la racine correspond à la création d’une nouvelle racine u y C Découpage v D E x A B 13.5 x A u B v C D E