0% ont trouvé ce document utile (0 vote)
126 vues4 pages

Arbres AVL : Équilibrage et Rotations

Ce document décrit les arbres binaires de recherche équilibrés (ABR) et la méthode AVL pour maintenir leur équilibre. La méthode AVL utilise des rotations simples et doubles pour rééquilibrer l'arbre après chaque insertion ou suppression et garantir des performances logarithmiques.

Transféré par

Cbh
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
126 vues4 pages

Arbres AVL : Équilibrage et Rotations

Ce document décrit les arbres binaires de recherche équilibrés (ABR) et la méthode AVL pour maintenir leur équilibre. La méthode AVL utilise des rotations simples et doubles pour rééquilibrer l'arbre après chaque insertion ou suppression et garantir des performances logarithmiques.

Transféré par

Cbh
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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 : [email protected] • 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