Vous êtes sur la page 1sur 4

2018-2019, Semestre d’automne

L3, Licence Sciences et Technologies ABR équilibré


Université Lyon 1
• Un ABR est en équilibre parfait si sa hauteur est
minimale
• Pour chaque nœud, le nombre d’éléments du
LIFAP6: Algorithmique, sous arbre gauche et du sous arbre droit
diffèrent de 1
Programmation et Complexité • Configuration obtenue en insérant l’élément
médian m, puis l’élément médian des éléments
Chaine Raphaëlle (responsable semestre automne) <= m puis l’élément médian des éléments > m …
E-mail : raphaelle.chaine@liris.cnrs.fr • Dur à maintenir, une simple insertion peut
http://liris.cnrs.fr/membres?idn=rchaine
entrainer toute une réorganisation de l’arbre!

247 289

247 289

Arbre initial A 5

3 7 • Pour éviter des réorganisations
douloureuses en temps de calcul, on
2 4 6
assouplit les conditions d’équilibrage,
Arbre initial – pour limiter le coût de la réorganisation
A 5
dans lequel … – tout en gardant des performances
on insère 1 3 7
logarithmiques pour la recherche, l’insertion et
2 4 6 la suppression!

Retour à A 4
l’équilibre …
2 6

1 3 5 7 291
290

290 291

Rééquilibrage après une insertion


AVL • Si il apparait un nœud au niveau duquel le
• Du nom des auteurs de la méthode : déséquilibre devient égal à 2 (mais dont les fils
Adelson-Velskij et Landis restent équilibrés)
• Garantir après chaque opération que Élément inséré
– pour chaque nœud, les hauteurs des sous-arbres
gauche et droit diffèrent au plus de 1 • 1er cas • 2ème cas
• Cet équilibre peut-être maintenu à travers
l’utilisation judicieuse de 4 opérations :
– Rotation gauche
– Rotation droite h h
– Rotation droite-gauche (ou rotation double à gauche)
– Rotation gauche-droite (ou rotation double à droite) h h h h

292 293

292 293

1
Rotation simple à droite Rotation double à droite
• A faire dans le 1er cas : déséquilibre « à • A faire dans le 2ème cas : déséquilibre « à
gauche toute » droite de la gauche»
Hauteurs h1=h+1 h2=h3=h • La rotation double à droite commence par
une rotation gauche sur le sous arbre G
puis une rotation droite sur N
2 0
h+3 N h+2 G

0 N
2
1 h+1
h+2 h
G
3 h+1 1
N
1 G
h+1 1 h 2 h 3 3
h 2
1 2

294 295

294 295

Rotation double à droite Rotation double à droite


• Détail supplémentaire à mettre en œuvre • A faire dans le 2ème cas : déséquilibre « à droite
dans le 2ème cas (déséquilibre « à droite de de la gauche» de
la gauche»)
Élément inséré
– Mise à jour des déséquilibres des nœuds
a) Sous-cas où les sous-arbres • sous-cas b • sous-cas c

N
2 1, 2 et 3 sont vides avant N N
1 G l’insertion (h=0)
b) Sous cas où le sous-arbre 2 G G
3
est déséquilibré sur sa D D
1 2
gauche
c) Sous cas où le sous-arbre 2
est déséquilibré sur sa droite
296 297

296 297

Rotation double à droite Rotation double à droite


• Cas 2b : déséquilibre à gauche de la droite du • Cas 2c : déséquilibre à droite de la droite du
sous-arbre gauche sous-arbre gauche
Hauteurs h1=h2=h4=h et h3=h-1 Hauteurs h1=h3=h4=h h2=h-1
• Combinaison d’une rotation gauche puis d’une • Combinaison d’une rotation gauche puis d’une
rotation droite rotation droite

2 2 0 0
h+3 N h+3 N h+2 D h+3 N 2 h+3 N 2 h+2 D

h+2 h+1 0 -1 h+2 h+1 1


h+2 G -1 h D 2 h G N h+2 G -1 h D 1 h G N 0
4 4 4 4
h+1 h-1 h h h-1 h h h+1 h h h-1 h h
h D 1 3 3 D -1 3 3
1 G 0 1 2 4 1 G 1 1 2 4
h h-1 h-1 h
h h h h-1
2 3 1 2 2 3 1 2

298 299

298 299

2
• Les symétriques de ces opérations existent dans • Ajouts successifs de 4, 3, 1, 6, 7, 5, 2
le cas d’un déséquilibre alourdissant un sous- dans l’arbre vide
arbre droit après une insertion
– Rotation gauche
– Rotation droite-gauche

• Dans les 4 cas (et leurs symétriques) la hauteur


du sous-arbre de racine n retrouve sa hauteur
d’avant l’insertion de l’élément

300 301

300 301

• Ajouts successifs de 4, 3, 1, 6, 7, 5, 2
dans l’arbre vide • Comment pister / stocker les déséquilibres?
0 1
[ insertion 1
-1 – 1ère solution : Conserver l’info de hauteur dans
4 4 ROTD(4)] 30 3 chaque nœud
-1
3 1 4 1 4 – 2ème solution : Ne conserver dans chaque nœud
6 que la différence de hauteur entre le sous-arbre
[ insertion 7 gauche et le sous-arbre droit
ROTG(4)]

-1
4 [Insertion 2 4 [Insertion 5 3
DROTD(3)] 1 DROTG(3)]
2 6 3 6 1 6
1 3 5 7 1 5 7 4 7

302 303

302 303

Rotation double à droite


Rotation droite procédure AVL_Rotation_Double_Droite
( donnée-résultat a : ABR, pN : pointeur sur Nœud )
Précondition : pN->diff=2 et pn->gauche->diff=-1 (cas 2 ou 3)
procédure AVL_Rotation_Droite variables :
(donnée-résultat a : ABR, pN : pointeur sur Nœud)
pG, pGD : pointeur sur Nœud, diff : -2..2
Précondition : pN->diff=2 et pn->gauche->diff=1 (cas 1) N
variables : début
pG : pointeur sur Nœud pG ← pN->gauche G
début pGD ← pN->gauche->droite
pG ← pN->gauche 2 D
h+3 N pG->droite ← pGD->gauche
pN->gauche ← pG->droite pGD->gauche ← pG
pG->droite ← pN 1 pN->gauche ← pGD->droite sous-cas b
h+2 G h
pN ← pG
3 pGD->droite ← pN sous-cas c
pN->diff ← 0; pn->droite->diff ← 0 diff ← pGD->diff ;
fin h+1 1 h 2 pN ← pGD
pN->gauche->diff ← max(0,-diff) ; pN->droite->diff ← min(0,-diff);
pN->diff ← 0
304 fin 305

304 305

3
procédure équilibrer( donnée-résultat a : ABR, pN : pointeur sur Nœud )
Précondition : pN->diff=2 ou -2
début
Insertion dans un AVL
si pN->diff=2 alors
si pN->gauche->diff=1 alors • Insertion aux feuilles : parcours d’un chemin menant de la
AVL_Rotation_Droite(a,pN) racine au nouvel élément
sinon
AVL_Rotation_Double_Droite(a,pN) • Parcours du chemin en sens inverse,
finsi – pour mettre à jour les différences de hauteur des nœuds ancêtres,
sinon – et effectuer une opération de rééquilibrage si nécessaire!
si pN->droite->diff=-1 alors
AVL_Rotation_Gauche(a,pN)
sinon • Parcours du chemin en sens inverse :
AVL_Rotation_Double_Gauche(a,pN) – facile si la procédure d’insertion est récursive,
finsi (il suffit de mettre les instructions relatives à la remontée après
finsi l’appel récursif)
fin – la remontée peut s’arrêter à partir du moment où le champ diff d’un
nœud n’est plus modifié

306 307

306 307

• Version itérative
Complexité – C’est uniquement sur le chemin racine / nouvelle feuille
qu’il peut y avoir des rotations
• Temps d’une rotation : constant – On considère sur ce chemin le nœud N le plus bas (le
dernier rencontré à la descente) dont le champ diff != 0
• Note : Insertion exécute AU PLUS UNE rotation – On peut démontrer que si rotation il doit y avoir après
car une rotation sur un nœud rétablit la hauteur l’insertion ca sera sur ce Noeud
initiale (avant insertion) du sous-arbre
correspondant A
Entre A et N l’adjonction
n’a pas pu causer de
• A arbre AVL à n nœuds problème.
N= nœud le + bas
• Temps total d’un ajout : O(h(A)) = O(log n) car t. que N->diff != 0
une seule branche de l’arbre est examinée N

308 feuille 309

308 309

Vous aimerez peut-être aussi