Beruflich Dokumente
Kultur Dokumente
echilibrati (AVL)
1
Arbori binari de cautare (BST)
Structuri de date ce implementeaza conceptul de dictionar
rad = radacina
SAS = SubArbore Stang
SAD = SubArbore Drept
N = 2h – 1
Operatii elementare:
Insert O(log2n)
Search/Find – max. h comparatii O(log2n)
Delete O(log2n)
Daca arborele este echilibrat!
3
Arbori binari de cautare (BST)
12
Operatii elementare:
Insert O(n)
Search/Find – max. h comparatii O(n)
Delete O(n)
4
Arbori binari de cautare (BST)
AVL - Adelson-Velsky and Landis
AVL echilibrati
Obiectiv: rescrierea operatiilor Insert si Delete astfel incat:
• sa ramana in O(log n)
Arbore echilibrat:
|h(SAS) – h(SAD)| <= 1
5
Arbori binari de cautare (BST)
AVL echilibrati
Se aplica rotatii pentru a conserva echilibrul
- un subarbore de adincime h
6
Arbori binari de cautare (BST)
AVL echilibrati
La inserarea unui nod X apar 4 situatii posibile care necesita aplicarea
unei rotatii
7
Arbori binari de cautare (BST)
AVL echilibrati
La inserarea unui nod X apar 4 situatii posibile care necesita aplicarea
unei rotatii
8
Arbori binari de cautare (BST)
AVL echilibrati: Rotatii simple - la dreapta
11
Arbori binari de cautare (BST)
AVL echilibrati: Rotatii duble - la dreapta
struct AVL {
Atom data;
char bf; //balance factor = h(stg)-h(drt)
AVL *stg, *drt;
};
15
Arbori binari de cautare (BST)
AVL echilibrati:
EqRequired variabila globala
InsertAVL(rad, x) MakeNodAVL(x)
p := get_space_AVL()
if rad = 0 then data(p) := x
rad := MakeNodAVL(x) stg(p) := 0
EqRequired := true drt(p) := 0
else
if x < data(rad) then bf(p) := 0
InsertAVL(stg(rad), x) return p
Echilibrare(rad, x, true)
else
if x > data(rad) then
InsertAVL(drt(rad), x)
Echilibrare(rad, x, false)
end-if
end-if
end-if
16
Arbori binari de cautare (BST)
AVL echilibrati:
La revenirea din recursie in functia InsertAVL se incearca echilibrarea fiecarui nod de
pe ramura ce uneste nodul inserat cu radacina, daca este nevoie
Functia Echilibrare
• actualizeaza factorii de echilibru pentru toate nodurile de pe ramura, pana la radacina
sau pana la intalnirea unui nod critic
• echilibreaza nodul critic, prin rotatii simple/duble, daca este nevoie (daca inserarea
nu l-a echilibrat)
17
Arbori binari de cautare (BST)
AVL echilibrati:
Nod critic = primul nod cu bf ≠ 0 in parcurgerea de la nodul inserat spre
radacina (echivalenta cu revenirea din recursie in functia de inserare)
In urma inserarii toate nodurile de pe ramura, aflate mai jos decat nodul
critic, vor capata factor de dezechilibru ±1.
Perturbatia nu se propaga mai sus de nodul critic deoarece:
• daca dezechilibrul nodului critic este de acelasi sens cu dezechilibrul creat prin inserare,
se aplica o rotatie in urma careia nodul va fi echilibrat si adancimea subarborelui care
porneste din nodul critic ramane egala cu adancimea dinainte de inserare;
• daca dezechilibrul nodului critic este de sens opus celui creat prin inserare, ele se
anuleaza, adancimea subarborelui ramanand deasemenea neschimbata.
18
Arbori binari de cautare (BST)
AVL echilibrati:
Echilibrare(a, x, stg) stg indica unde s-a facut inserarea valorii x
stg = true la stanga nodului a
if EqRequired = true then stg = false la dreapta nodului a
if stg = true then
switch bf(a)
case 1: //adancimea pe SAS era mai mare rotatie dreapta
EqRequired := false //resetare flag
if x < data(stg(a)) then
RSD(a) //rotatie simpla la dreapta
else
RDD(a) //rotatie dubla la dreapta
end-if
case 0: //nu exista dezechilibru inainte de inserare
bf(a) := 1 //dar s-a produs acum
case -1: //adancimea pe SAD era mai mare
bf(a) := 0 //inserarea a produs echilibru
EqRequired := false
else //inserarea s-a facut la dreapta DE COMPLETAT
………
end-if
end-if
19
Arbori binari de cautare (BST)
AVL echilibrati:
20
Arbori binari de cautare (BST)
AVL echilibrati:
RDD(a)
b := stg(a)
c := drt(b)
//se actualizeaza bf pentru starea finala:
if bf(c) = 0 then
//h(t2s)=h(t2d) inainte de refacerea legaturilor
bf(a) := bf(b) := 0 // inserarea va echilibra
else if bf(c) = -1 then
//h(t2s)<h(t2d), initial, inainte de refacerea legaturilor
O(1) bf(a) := 0 // deoarece h(T3)=h(t2d)
bf(b) := 1 // deoarece h(T1)> h(t2s)
else if bf(c) = 1 then
//h(t2s)>h(t2d), initial, inainte de refacerea legaturilor
bf(a) := -1 // deoarece h(t2d)< h(T3)
bf(b) := 0 // deoarece h(T1)=h(t2s)
//se efectueaza rotatia:
stg(a) := drt(c)
drt(b) := stg(c)
bf(c) := 0
drt(c) := a
stg(c) := b
a := c
21
Arbori binari de cautare (BST)
AVL echilibrati:
Echilibrare(a, x, stg) stg indica unde s-a facut inserarea valorii x
stg = true la stanga nodului a
if EqRequired = true then stg = false la dreapta nodului a
if stg = true then
switch bf(a)
case 1: //adancimea pe SAS era mai mare rotatie dreapta
EqRequired := false //resetare flag (a – nod critic)
if x < data(stg(a)) then
RSD(a) //rotatie simpla la dreapta
else
RDD(a) //rotatie dubla la dreapta
end-if
case 0: //nu exista dezechilibru inainte de inserare
bf(a) := 1 //dar s-a produs acum
case -1: //adancimea pe SAD era mai mare
bf(a) := 0 //inserarea a produs echilibru
EqRequired := false //resetare flag (a – nod critic)
else //inserarea s-a facut la dreapta DE COMPLETAT
………
end-if
end-if
22
Arbori binari de cautare (BST)
AVL echilibrati:
https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
23