Arbre rouge-noir (RBTree)
Qu'est-ce qu'un arbre rouge-noir ?
Les arbres rouge-noir ont été inventés par Rudolf Bayer en 1972 et étaient alors appelés arbres B binaires symétriques.
Il a été modifié pour devenir « l'arbre rouge-noir » d'aujourd'hui par Leo J. Guibas et Robert Sedgewick en 1978.
L'arbre rouge-noir est également un arbre de recherche binaire auto-équilibré, similaire à l'arbre AVL.Maintenez l'équilibre de l'arborescence binaire grâce à des opérations de rotation lors de l'ajout et de la suppression pour des performances de requête plus efficaces.。
Par rapport aux arbres AVL, les arbres rouge-noir sacrifient une partie de leur équilibre en échange de moins d'opérations de rotation lors des opérations d'insertion/suppression, et les performances globales sont meilleures que celles des arbres AVL.
Bien que RBTree soit complexe, son temps d’exécution dans le pire des cas est également très bon, et il est efficace en pratique :
ça peutRechercher, insérer et supprimer en un temps O (log n), où n est le nombre d'éléments dans l'arborescence.
Caractéristiques des arbres rouge-noir
L'arbre rouge-noir est l'arbre de recherche binaire équilibré le plus couramment utilisé dans les applications pratiques.Pas strictement équilibré, mais les performances d'utilisation moyennes sont très bonnes。
Dans un arbre rouge-noir, les nœuds sont étiquetés en rouge et noir.
Les principes des arbres rouge-noir ont les points suivants :
Caractéristique 1 : Les nœuds sont soit noirs, soit rouges
Caractéristique 2 : Le nœud racine doit être noir
Caractéristique 3 : Les nœuds feuilles (NIL) doivent être noirs
Caractéristique 4 : Les deux nœuds enfants de chacun les nœuds rouges sont tous deux noirs. (Il ne peut pas y avoir deux nœuds rouges consécutifs sur tous les chemins depuis chaque feuille jusqu'à la racine)
Caractéristique 5 :Tous les chemins d'un nœud à chacune de ses feuilles contiennent le même nombre de nœuds noirs。
L'attribut rouge indique que l'enfant d'un nœud rouge doit être noir. Cependant, les enfants des nœuds noirs RBTree peuvent être rouges ou noirs.
Description de l'attribut feuille, le nœud feuille peut être vide nul,Les nœuds feuilles d'AVL ne sont pas vides
Sur la base des principes ci-dessus, nousGénéralement, lors de l'insertion d'un nœud d'arbre rouge-noir, le nœud sera défini sur rouge.,
**Raison : **Se référer au dernier principe : le rouge est le moins susceptible de détruire le principe. S'il est noir, il est probable que les nœuds noirs de cette branche seront 1 de plus que les autres branches, détruisant l'équilibre.
Points mémoire :
Vous pouvez retenir plusieurs principes des arbres rouge-noir selon la classification entre parenthèses :
( Attribut Couleur ) Propriété 1 : Le nœud est soit noir, soit rouge
( Attribut Racine ) Propriété 2 : Le nœud racine doit être noir
( Attribut Feuille ) Propriété 3 : Le nœud feuille (NIL) doit être noir
( attribut rouge ) Propriété 4 : Les deux nœuds enfants de chaque nœud rouge sont tous deux noirs. (Il ne peut pas y avoir deux nœuds rouges consécutifs sur tous les chemins allant de chaque feuille à la racine)
( Attribut noir ) Propriété 5 : Tous les chemins allant de n'importe quel nœud à chacune de ses feuilles contiennent le même nombre de nœuds noirs.
Les attributs noirs peuvent être compris comme des caractéristiques équilibrées, si les caractéristiques d'équilibrage ne peuvent être respectées, une opération d'équilibrage doit être effectuée.
La RBT espace-temps
est en quelque sorte une sorte deOptimisation du type espace-temps, sur le nœud de avl, ajoutéDonnées d'attribut de couleur, ce qui équivaut à augmenter la consommation d’espace. En augmentant l'attribut de couleur, le nombre d'opérations d'équilibrage ultérieures est réduit.
noir parfaitement équilibré
L'arbre rouge-noir n'est pas un arbre de recherche binaire équilibré AVL.Comme le montre la figure, le sous-arbre gauche du nœud racine P est évidemment plus haut que le sous-arbre droit.
Selon la caractéristique 5 d'un arbre rouge-noir, tous les chemins depuis n'importe quel nœud vers chacune de ses feuilles contiennent le même nombre de nœuds noirs, ce qui signifie :
Le nombre de niveaux de nœuds noirs dans le sous-arbre gauche et le sous-arbre droit de rbt est égal.
Les conditions d'équilibre des arbres rouge-noir,Elle n'est pas contrainte par la hauteur totale, mais par la hauteur du nœud noir..
Par conséquent, cet équilibre d’arbres rouge-noir est appelénoir parfaitement équilibré。
Pour voir l'effet d'un noir parfaitement équilibré,
supprimez les nœuds rouges dans rbt et vous obtiendrez unArbre quadruple, du nœud racine à chaque feuille, la hauteur est la même, qui est la longueur du chemin noir de la racine de rbt aux feuilles.
Trois opérations du processus d'équilibre de restauration des arbres rouge-noir
Une fois que les cinq principes des arbres rouge-noir ne sont pas satisfaits, nous considérons que l'équilibre est rompu. Comment rétablir l'équilibre ? S'appuyer sur ses trois opérations :Changement de couleur, rotation à gauche, rotation à droite。
Décoloration
La couleur du nœud passe du rouge au noir ou du noir au rouge.
Gaucher
Avec un certain nœud comme pivot (pivot), son nœud parent (la racine du sous-arbre) est tourné dans son propre sous-arbre gauche (gaucher). Le sous-arbre gauche d'origine du pivot devient le sous-arbre droit du nœud racine d'origine. . Le sous-arbre gauche d'origine du pivot devient le sous-arbre droit du nœud racine d'origine. Le sous-arbre droit reste inchangé.
Rotation à droite :
Avec un certain nœud comme point d'appui (pivot), son nœud parent (la racine du sous-arbre) pivote dans son propre sous-arbre droit (rotation à droite). Le sous-arbre droit d'origine du pivot devient le sous-arbre gauche du nœud racine d'origine. Le sous-arbre gauche d'origine du pivot reste inchangé.
Les opérations de virage à gauche et de virage à droite des arbres rouge-noir sont similaires aux opérations de virage à gauche et de virage à droite des arbres AVL.
Insertion de nœuds d'arbre rouge-noir
Par défaut, les nœuds nouvellement insérés sont rouges:
Étant donné que le nœud parent a une probabilité plus élevée d'être noir, l'insertion d'un nouveau nœud en rouge peut éviter les conflits de couleurs.
scène 1:L'arbre rouge-noir est un arbre vide
Utilisez simplement le nœud inséré comme nœud racine.
De plus : Selon les propriétés de l'arbre rouge-noir, les deux nœuds racines sont noirs. toujours besoinDéfinissez le nœud inséré en noir。
Scénario 2 :La clé du nœud inséré existe déjà
Mettez à jour la valeur du nœud actuel avec la valeur du nœud inséré.
Scénario 3 :Le nœud parent du nœud inséré est noir
Puisque le nœud inséré est rouge, lorsque le nœud parent du nœud inséré est noir, cela n'affectera pas l'équilibre de l'arbre rouge-noir.Insertion directe sans auto-équilibrage。
Scénario 4 :Le nœud parent du nœud inséré est rouge
D'après la propriété 2 : le nœud racine est noir.
Si le nœud parent du nœud inséré est un nœud rouge, alorsLe nœud parent ne peut pas être le nœud racine, le nœud inséré a donc toujours un nœud grand-parent (relation sur trois générations).
D'après la propriété 4 : les deux nœuds enfants de chaque nœud rouge doivent être noirs. Il ne peut pas y avoir deux nœuds rouges connectés.
A ce moment, deux états apparaîtront :
le père et l'oncle sont rouges,
le père est rouge et l'oncle est noir.
Scène 4.1 : Père et oncle sont des nœuds rouges
Selon la propriété 4 : les nœuds rouges ne peuvent pas être connectés ==》Le nœud grand-parent doit être un nœud noir:
Le père est rouge, alors le nombre de niveaux d'arbre rouge-noir qui doivent être insérés dans le sous-arbre à ce moment est : noir, rouge et rouge.
parce queIl est impossible d'avoir deux nœuds rouges connectés en même temps et doit être changé.
Traitement de décoloration : == noir rouge rouge> rouge noir rouge
- Changez les nœuds F et V en noir
- Changer P en rouge
- Définir P comme nœud actuel pour le traitement ultérieur
On peut voir que P est défini sur rouge.
Si le nœud parent de P est noir, alors aucun traitement n'est requis ;
mais si le nœud parent de P est rouge, cela viole la nature de l'arbre rouge-noir, donc P a besoin à définir comme nœud actuel. Poursuivez l'opération d'insertion et effectuez le traitement d'auto-équilibrage jusqu'à ce que l'équilibre global soit atteint.
Scène 4.2 : L'oncle est noir, le père est rouge et est inséré dans le nœud gauche du père
Oncle est noir, ou n'existe pas (NIL)C'est aussi un nœud noir, etLe nœud parent d'un nœud est le nœud enfant gauche du nœud grand-parent.
Remarque : D'un point de vue pur insertion, le nœud oncle est soit rouge, soit noir (nœud NIL), sinon la propriété de l'arbre rouge-noir 5 sera détruite. A ce moment, le chemin aura un nœud noir de plus que les autres chemins. .
Scénario 4.2.1 Déséquilibre de type LL
Le nœud nouvellement inséré est le nœud enfant gauche de son nœud parent (LL cas rouge).Après l'insertion, il y a un déséquilibre de type LL.
Traitement d'auto-équilibrage :
- Changer de couleur :
réglez F sur noir et P sur rouge - Tournez à droite le nœud F
Scénario 4.2.2 Déséquilibre de type LR
Le nœud nouvellement inséré est le nœud enfant droit de son nœud parent (cas rouge LR). Après insertion, il y a un déséquilibre de type LR.
Traitement d'auto-équilibrage :
- Tourner à gauche F
- Définissez F comme nœud actuel et obtenez le boîtier rouge LL
- Processus selon la situation rouge LL (1. Décoloration 2. Nœud P droitier)
Scénario 4.3 : L'oncle est un nœud noir, le père est rouge et le nœud père est le nœud enfant droit du nœud grand-père
Scénario 4.3.1 : Déséquilibre de type RR
Le nœud nouvellement inséré est le nœud enfant droit de son nœud parent (cas rouge RR)
Traitement d'auto-équilibrage :
- Changement de couleur :
réglez F sur noir et P sur rouge - Effectuer une rotation à gauche sur le nœud P
Scénario 4.3.2 : Déséquilibre de type RL
Un nœud nouvellement inséré est le nœud enfant gauche de son nœud parent (cas rouge RL)
Traitement d'auto-équilibrage :
- Tourner à droite F
- Définissez F comme nœud actuel pour obtenir la situation rouge RR
- Processus selon la situation rouge RR (1. Décoloration 2. Nœud P gaucher)
Suppression du nœud d'arbre rouge-noir
L'opération de suppression de l'arbre rouge-noir comprend également deux parties de travail :
- Rechercher le nœud cible
- Auto-équilibrage après suppression
Lorsque le nœud cible n'existe pas, cette opération est ignorée ; lorsque le nœud cible existe, un traitement d'auto-équilibrage doit être effectué après suppression. Après avoir supprimé un nœud, vous devez toujours trouver un nœud pour remplacer le nœud supprimé. Sinon, le sous-arbre sera déconnecté du nœud parent. À moins que le nœud supprimé n'ait aucun nœud enfant, il n'est pas nécessaire de le remplacer.
Avis:R est le nœud de remplacement qui est sur le point d'être remplacé à la position du nœud supprimé. Avant suppression, il participe au sous-équilibrage de l'arbre à sa position d'origine. Après équilibrage, il est remplacé à la position du nœud supprimé. avant que la suppression ne soit terminée.。
Cas 1 : le nœud de remplacement est un nœud rouge
Lorsque le nœud de remplacement est déplacé vers la position du nœud supprimé, puisque le nœud de remplacement est rouge, la suppression n'affectera pas l'équilibre de l'arborescence rouge-noir. Il vous suffit de définir la couleur du nœud de remplacement sur la couleur du nœud supprimé à redémarrer.balance.
Traitement :La couleur passe à la couleur du nœud supprimé
Cas 2 : Le nœud de remplacement est un nœud noir
Lorsque le nœud de remplacement est noir, un traitement d'auto-équilibrage doit être effectué.Déterminez si le nœud de remplacement est le nœud enfant gauche ou le nœud enfant droit de son nœud parent pour effectuer différentes opérations de rotation afin de rééquilibrer l'arborescence.。
Cas 2.1 : Le nœud de remplacement est le nœud enfant gauche de son nœud parent
Cas 2.1.1 : Le nœud frère du nœud de remplacement est le nœud rouge
Si le nœud frère est un nœud rouge, selon la propriété 4, le nœud parent et le nœud enfant du nœud frère doivent être noirs. Alors
traitez-vous de :
- Réglez S sur noir
- Réglez P sur rouge
- Effectuez une rotation à gauche sur P pour obtenir le scénario 2.1.2.3
- Traitement du dossier 2.1.2.3
Cas 2.1.2 : Le nœud frère du nœud de remplacement est noir
Si le nœud frère est noir, la couleur du nœud parent et du nœud enfant ne peut pas être déterminée.
Cas 2.1.2.1 : le nœud enfant droit du nœud frère du nœud de remplacement est rouge et le nœud enfant gauche est de n'importe quelle couleur
Le nœud de remplacement est noir. Après suppression, le sous-arbre de gauche a un nœud noir de moins. Ensuite, un nœud noir doit être emprunté au sous-arbre de droite et doit être tourné vers la gauche.
Traitement :
- Définissez la couleur de S sur la couleur de P
- Réglez P sur noir
- Réglez SR sur noir
- La rotation à gauche de P
et la suppression de R n'ont aucun effet.
Cas 2.1.2.2 : Le nœud enfant droit du nœud frère du nœud de remplacement est noir et le nœud enfant gauche est rouge.
Si R est supprimé, un nœud rouge doit être emprunté au nœud de droite pour ne pas affecter le solde, pensez donc à convertir le cas 2.1.2.2 en cas 2.1.2.1.
Traitement :
- Réglez S sur rouge
- Réglez SL sur noir
- Tourner à droite S nous donne le scénario 2.1.2.1
- Effectuer le traitement du scénario 2.1.2.1
Cas 2.1.2.3 : Les nœuds enfants des nœuds frères du nœud de remplacement sont tous noirs.
Dans ce cas, aucun nœud rouge de frère ne vous est prêté, vous devez donc trouver un autre endroit pour obtenir le nœud rouge. Ensuite, en raison de la nature des arbres rouge-noir poussant de bas en haut, nous avons pensé que nous pouvions utiliser P comme un nouveau nœud, tout comme l'ajout de nœuds. Remplacez le nœud, mais R est en fait supprimé. Traitez simplement P comme un nœud de remplacement et répétez la situation ci-dessus de bas en haut.
- Réglez S sur rouge
- Utiliser P comme nouveau nœud de remplacement
- Réexécutez le
traitement du scénario de suppression du nœud :
Cas 2.2 : Le nœud de remplacement est le bon enfant de son nœud parent
Semblable au cas 2.1, ceci est géré en utilisant le nœud successeur comme nœud de remplacement.
Cas 2.2.1 : Le nœud frère du nœud de remplacement est rouge
Traitement :
- Réglez S sur noir
- Réglez P sur rouge
- Effectuez une rotation à droite sur P pour obtenir le scénario 2.2.2.3
- Effectuer le traitement du scénario 2.2.2.3
Cas 2.2.2 : Le nœud frère du nœud de remplacement est noir
Cas 2.2.2.1 : Le nœud enfant gauche du nœud frère du nœud de remplacement est un nœud rouge et le nœud enfant droit est de n'importe quelle couleur.
Traitement :
- Définissez la couleur de S sur la couleur de P
- Réglez P sur noir
- Réglez SL sur noir
- Tourner à droite P
Cas 2.2.2.2 : Le nœud enfant gauche du nœud frère du nœud de remplacement est noir et le nœud enfant droit est rouge
Traitement :
- Réglez S sur rouge
- Réglez SR sur noir
- Effectuez une rotation à gauche sur S pour obtenir le scénario 2.2.2.1
- Effectuer le traitement du scénario 2.2.2.1
Cas 2.2.2.3 : Les nœuds enfants des nœuds frères du nœud de remplacement sont tous noirs.
Traitement :
- Réglez S sur rouge
- Utiliser P comme nouveau nœud de remplacement
- Retraiter le scénario de suppression du nœud
Résumé des règles
- Condition de boucle : x != root && x.color = BLACK, x n'est pas le nœud racine et la couleur est noire
- Opération de finition : régler x sur noir
- x est le fils gauche ou le fils droit du père, et les opérations de traitement sont symétriques ; de même, vous n'avez qu'à vous souvenir des opérations du fils gauche et vous pouvez tirer des déductions
x est le fils gauche du père
- Le frère est rouge : changez le frère en noir et le nœud parent en rouge ; faites pivoter le nœud parent vers la gauche pour restaurer la hauteur noire du sous-arbre gauche, et le neveu gauche devient le nouveau frère
- Le frère est noir, et les neveux gauche et droit sont noirs : le frère devient rouge, x pointe vers le nœud parent, et l'ajustement continue
- Le frère est noir, le neveu droit est noir (le neveu gauche est rouge) : le neveu gauche devient noir, le frère devient rouge ; le frère tourne à droite, rétablissant la hauteur noire du sous-arbre droit, et le neveu gauche devient le nouveau frère
- Le frère est noir et le neveu droit est rouge : le frère devient la couleur du nœud parent, le nœud parent et le neveu droit deviennent noirs ; le nœud parent tourne vers la gauche, x pointe vers le nœud racine de l'arbre entier, terminant le boucle
Questions d'entretien RBT :
Question : Avec un arbre de recherche binaire, pourquoi devons-nous équilibrer l'arbre binaire ?
L'arbre de recherche binaire dégénère facilement en chaîne.
A ce moment, la complexité temporelle de la recherche dégénérera également de O (log n) à O (N). Un
arbre binaire équilibré AVL avec des restrictions sur la différence de hauteur entre la gauche et les bons sous-arbres sont introduits pour assurer une opération de recherche optimale. La mauvaise complexité temporelle est également O (log n)
Question : Avec des arbres binaires équilibrés, pourquoi avons-nous besoin d’arbres rouge-noir ?
La différence de hauteur entre les sous-arbres gauche et droit d'AVL ne peut pas dépasser 1. Chaque fois qu'une opération d'insertion/suppression est effectuée, une opération de rotation est presque nécessaire pour maintenir l'équilibre. Dans les scénarios où l'insertion/suppression est fréquente, les opérations de rotation fréquentes réduisent considérablement
la performances de l'AVL.
Les arbres rouges et noirs sacrifient un équilibre strict en échange d'une petite quantité de rotation lors de l'insertion/suppression.
Les performances globales sont meilleures que celles d'AVL
- Le déséquilibre lors de l'insertion de l'arbre rouge-noir peut être résolu par un maximum de deux rotations ; le déséquilibre lors de la suppression peut être résolu par un maximum de trois rotations.
Les règles rouge-noir de l'arbre rouge-noir garantissent que l' opération de recherche peut être terminée en un temps O (log n) dans le pire des cas.
Question : Vous souvenez-vous encore des principes des arbres rouge-noir ?
Vous pouvez suivre le classement entre parenthèses et retenir plusieurs principes des arbres rouge-noir :
- (Attribut de couleur) Le nœud est noir ou rouge
- (Attribut racine) Le nœud racine doit être noir
- (Attribut feuille) Les nœuds feuilles (NIL) doivent être noirs
- (Attribut rouge) Les deux nœuds enfants de chaque nœud rouge sont tous deux noirs. (Il ne peut pas y avoir deux nœuds rouges consécutifs sur tous les chemins depuis chaque feuille jusqu'à la racine)
- (Attribut noir) Tous les chemins d'un nœud à chacune de ses feuilles contiennent le même nombre de nœuds noirs.
Q : Quelles sont les opérations internes de l’arbre rouge-noir ?
Décoloration
Transformer un nœud rouge en noir, ou transformer un nœud noir en rouge, est la décoloration de ce nœud.
tourner
Semblable à l’opération de rotation des arbres binaires équilibrés.
La différence entre les arbres rouge-noir et les arbres AVL
- Les mécanismes d'ajustement de l'équilibre sont différents.
L'arbre rouge-noir détermine s'il est déséquilibré en fonction du nombre constant de nœuds noirs sur le chemin. S'il est déséquilibré, il est restauré par changement de couleur et rotation.
AVL détermine s'il est déséquilibré en fonction du facteur d'équilibre de l'arbre (la valeur absolue de la différence de hauteur entre les sous-arbres gauche et droit de tous les nœuds ne dépasse pas 1). S'il est déséquilibré, il est restauré par rotation.
- L'efficacité d'insertion des arbres rouge-noir est plus élevée
Les arbres rouge-noir utilisent un équilibre non strict pour réduire le nombre de rotations lors de l'ajout et de la suppression de nœuds. Tout déséquilibre sera résolu en trois rotations.
L'arbre rouge-noir ne recherche pas « l'équilibre complet », il ne nécessite que des exigences d'équilibre partiel, réduisant ainsi les exigences de rotation, améliorant ainsi les performances.
AVL est un arbre strictement équilibré (un arbre de recherche binaire hautement équilibré), donc lors de l'ajout ou de la suppression de nœuds, selon la situation, le nombre de rotations est supérieur à celui de l'arbre rouge-noir.
Par conséquent, l’efficacité d’insertion de l’arbre rouge-noir est plus élevée
3. Les performances statistiques des arbres rouge-noir sont supérieures à celles des arbres AVL.
Les arbres rouge-noir peuvent effectuer des opérations de requête, d'insertion et de suppression avec une complexité temporelle O(log n).
Les recherches, insertions et suppressions dans l'arborescence AVL sont O (log n) dans les cas moyens et les pires.
La complexité temporelle de l'algorithme de l'arbre rouge-noir est la même que celle de l'AVL, mais les performances statistiques sont supérieures à celles de l'arbre AVL.
4. Applicabilité : l'efficacité de la recherche AVL est élevée.
Si dans votre application, le nombre de requêtes est bien supérieur aux insertions et aux suppressions, choisissez l'arborescence AVL. Si le nombre de requêtes et d'insertions et de suppressions est presque le même, vous devez choisir l'arbre rouge-noir.
Autrement dit, il s'agit parfois uniquement d'un tri (créer-traverser-supprimer) sans recherche ou le nombre de recherches est très faible, et l'arborescence RB est plus rentable.
Arbre rouge-noir VS arbre AVL
Les arbres équilibrés courants incluent les arbres rouge-noir et les arbres équilibrés AVL.Pourquoi STL et Linux utilisent-ils tous deux des arbres rouge-noir pour implémenter des arbres équilibrés ? Il y a probablement plusieurs raisons :
-
En termes de détails d'implémentation, si l'insertion d'un nœud entraîne un déséquilibre de l'arbre, l'arbre AVL et l'arbre rouge-noir nécessitent au plus 2 opérations de rotation, c'est-à-dire que les deux sont O(1) ; cependant, la suppression d'un nœud entraîne L'arbre devient déséquilibré. Lors de l'équilibrage, dans le pire des cas, AVL doit maintenir l'équilibre de tous les nœuds sur le chemin allant du nœud supprimé à la racine, donc l'ampleur de la rotation requise est O (logN), tandis que RB-Tree ne nécessite que 3 rotations au maximum, nécessite uniquement une complexité O(1)
-
Du point de vue des exigences d'équilibre des deux arbres équilibrés, la structure d'AVL est plus équilibrée que celle de RB-Tree. L'insertion et la suppression de nœuds sont plus susceptibles de provoquer un déséquilibre de l'arbre. Par conséquent, lorsqu'une grande quantité de données a besoin pour être inséré ou supprimé, AVL doit La fréquence de rééquilibrage sera plus élevée. Par conséquent, RB-Tree est plus efficace dans les scénarios qui nécessitent l’insertion et la suppression d’un grand nombre de nœuds. Naturellement, étant donné qu'AVL est très équilibré, l'efficacité de la recherche d'AVL est plus élevée.
-
D'une manière générale, les performances statistiques de RB-tree sont supérieures à celles d'AVL.