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

Documents pareils