Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Numrul comparaiilor de chei efectuate n cadrul acestui procedeu este cel mult
egal cu nlimea arborelui.
Din acest motiv aceti arbori sunt cunoscui i sub denumirea de arbori binari de
cutare (Binary Search Trees).
5
8
3
5
(a)
(b)
Este simplu de observat c un arbore are nlimea minim dac fiecare nivel al su
conine numrul maxim de noduri, cu excepia posibil a ultimului nivel.
Prin aceasta se justific i afirmaia c o cutare ntr-un arbore binar ordonat necesit
aproximativ log2n comparaii de chei
o Se precizeaz ns, c aceast afirmaie este valabil n ipoteza c nodurile sau organizat ntr-o structur de arbore binar ordonat de nlime
minim.
Aceasta se ntmpl cnd subarborele drept (stng) al tuturor nodurilor este vid, caz
n care nlimea arborelui devine egal cu n, iar cutarea nu este mai eficient dect
cutarea ntr-o list liniar ( O (n/2)).
ntr-o manier similar celei n care au fost definite tipurile de date abstracte pe
parcursul acestui curs, i n cazul arborilor binari ordonai se poate defini un astfel
de tip.
Ca i pentru celelalte structuri studiate i n acest caz este greu de definit un set de
operatori general valabil.
Fie b o referin care indic rdcina unui arbore binar ordonat, ale crui noduri au
structura definit n [8.3.3.a] i
ELSE
IF x<b^.cheie THEN
b:=CautaRecursiv(x,b^.stang)
[8.3.3.c]
ELSE
IF x>b.cheie THEN
b:=CautaRecursiv(x,b^.drept)
ELSE
CautaRecursiv:=b
END; {CautaRecursiv}
------------------------------------------------------------8.3.4. Inseria nodurilor n ABO. Crearea arborilor binari ordonai
Procesul de creare al unui ABO const n inseria cte unui nod ntr-un arbore binar
ordonat care iniial este vid.
Se precizeaz c inseria noului nod trebuie realizat chiar dac arborele conine deja un
nod cu cheia egal cu cea nou.
La parcurgerea n inordine a acestui arbore, se observ c cele dou chei egale sunt
parcurse n ordinea n care au fost inserate.
n continuare se prezint o procedur recursiv pentru inseria unui nod ntr-un arbore
binar ordonat, astfel nct acesta s rmn ordonat.
Se presupune c:
(1) Toate cheile sunt diferite de zero,
(2) Cheile se citesc de la dispozitivul de intrare
(3) Secvena de chei se ncheie cu o cheie fictiv egal cu zero pe post
de terminator.
------------------------------------------------------------{Construcia unui arbore binar ordonat}
VAR radacina:RefTipNod;
c:TipCheie;
BEGIN
radacina:=NIL;
Read(c);
[8.3.4.b]
WHILE c<>0 DO
BEGIN
Insereaza(c,radacina);
Read(c)
END
END;
------------------------------------------------------------ n continuare se descrie o variant nerecursiv a procedurii Insereaz.
Cei doi pointeri indic mereu dou noduri "consecutive" ale arborelui:
q1^ este fiul su stng sau fiul drept, dup cum x, cheia care se caut, este
mai mic respectiv mai mare dect cheia nodului curent indicat de q2.
Pointerii avanseaz din nod n nod de-a lungul arborelui, pn cnd pointerul q1
devine NIL, moment n care se realizeaz inseria propriu-zis.
Spre deosebire de varianta recursiv n care traseul parcurs este memorat implicit de
ctre mecanismul de implementare al recursivitii cu ajutorul unei stive, n acest caz nu
este nevoie de stiv ntruct nu trebuie s se revin n arbore dect cu un singur nivel
(pentru a realiza nlnuirea), motiv pentru care sunt suficieni doi pointeri consecutivi
(fig.8.3.4.b (b)).
radacina
radacina
(a)
q2
q1
(b)
Procedura care realizeaz inseria ntr-un arbore binar ordonat n manier nerecursiv
apare n secvena [8.3.4.c].
-----------------------------------------------------------{Inseria n ABO (Varianta nerecursiv)}
PROCEDURE InsereazaNerecursiv(x:TipCheie; b:TipABO);
VAR q1,q2:RefTipNod;
d:integer;
BEGIN
q2:=b;
q1:=q2^.drept;
d:=1;
WHILE q1<>NIL DO
BEGIN
q2:=q1;
IF x<q1^.cheie THEN
BEGIN
q1:=q1^.stang;
d:=-1.
END
ELSE
BEGIN
q1:=q1^.drept;
[8.3.4.c]
d:=1
END
END; { terminare parcurgere}
new(q1); {inserie}
q1^.cheie:=x;
q1^.stang:=NIL;
q1^.drept:=NIL
IF d<0 THEN
{IF (x<q2^cheie) THEN ...}
q2^.stang:=q1
ELSE
q2^.drept:=q1
END; {InsereazaNerecursiv}
-------------------------------------------------------------
Este uor de vzut c aceast procedur funcioneaz corect numai dac arborele are cel
puin un nod.
Astfel iniial arborele va conine un nod fictiv a crui nlnuire pe dreapta indic primul
nod efectiv al arborelui.
5
8
3
5
n cazul cel mai defavorabil, arborele poate degenera n list liniar, lucru care se
ntmpl n cazul n care cheile sunt furnizate n vederea inseriei n secven ordonat
cresctor respectiv descresctor (fig.8.3.4.c.(a),(b)).
(a)
(b)
Este evident faptul c n astfel de situaii performana cutrii scade catastrofal fiind
practic egal cu cea a cutrii ntr-o list liniar ordonat.
Din fericire, probabilitatea ca s apar astfel de situaii este destul de redus, fenomen ce
va fi analizat mai trziu n cadrul acestui capitol.
Se disting dou cazuri, dup cum nodul care trebuie suprimat are:
(1) Cel mult un fiu
(2) Doi fii.
(1) Primul caz se rezolv conform figurii 8.3.5 (a,b,c) n care se prezint cele trei
variante posibile.
p
X
(a)
(b)
(c)
Cel mai mic element al unui arbore binar ordonat, este cel mai din stnga nod al
arborelui, nod la care se ajunge naintnd mereu spre stnga pornind de la
rdacin.
Primul nod care nu are nlnuire spre stanga (nu are fiu stng) este nodul cutat.
Suprimarea lui este imediat n baza procedeului precizat mai sus.
-----------------------------------------------------------{Operatorul SuprimaMin n ABO}
PROCEDURE SuprimaMin(VAR b:TipABO; VAR min:TipElement);
VAR temp:RefTipNod;
BEGIN
IF b<>NIL THEN
IF b^.stang<>NIL THEN
SuprimaMin(b^.stang, min)
ELSE
BEGIN
[8.3.5.b]
min:=b^.info; temp:=b;
b:=b^.drept;
{suprimare}
DISPOSE(temp)
END
END; {SuprimaMin}
-------------------------------------------------------------
(2) Cel de-al doilea caz, n care nodul cu cheia x are doi fii se rezolv astfel:
1. Se caut predecesorul nodului de suprimat x n ordonarea n inordine a
arborelui.
Procedura care realizeaz suprimarea unui nod ntr-o structur de arbore binar
ordonat apare n secvena [8.3.5.c].
[8.3.5.c]
ELSE
IF x<p^.cheie THEN
Suprimare(x,p^.stang)
ELSE
IF x>p^.cheie THEN
Suprimare(x,p^.drept)
ELSE
BEGIN
q:=p;
IF q^.drept=NIL THEN
p:=q^.stang
ELSE
IF q^.stang=NIL THEN
p:=q^.drept
ELSE
SuprimaPred(q^.stang);
{DISPOSE(q)}
END
END; {Suprimare}
-------------------------------------------------------------
Procedura SuprimaPred:
(1) Gsete pointerul r care indic nodul avnd cea mai mare cheie, dintre
cheile subarborelui stng, al arborelui care are drept rdcin nodul cu cheia x
(nodul de suprimat).
Suprim nodul indicat de r, acesta din urm avnd un singur fiu (sau niciunul).
Pentru a ilustra comportarea acestei proceduri n fig.8.3.5.c se prezint:
O structur de arbore binar ordonat (a)
Din care se suprim n mod succesiv nodurile avnd cheile 7, 8, 4, i 6
(fig.8.3.5.c (b-e)).
6
8
4
5
4
9
(b)
(a)
6
9
4
2
5
9
2
(e)
5
(c)
(d)
Exist i o alt soluie de a rezolva suprimarea n cazul n care nodul x are doi fii i
anume:
1. Se caut succesorul nodului x n ordonarea n inordine a cheilor arborelui.
Se demonstreaz c el exist i ca nu are fiu stng.
2. Pentru suprimare se procedeaz analog ca i n cazul anterior, cu deosebirea
c totul se realizeaz simetric (n oglind).
n acest caz de fapt se caut nodul cu cea mai mic cheie a subarborelui drept al
subarborelui care-l are pe x drept rdcin
Dup cum s-a precizat, efortul de cutare al unei chei variaz ntre O(log2 n) pentru
arborele binar perfect echilibrat (de nlime minim) i
degenerat ntr-o list liniar.
Cele dou situaii reprezint extremele situaiilor reale iar probabilitatea ca ele s apar
n este n general redus [Wi76].
Dac se presupune c toate nodurile sunt n mod egal cutate (au probabilitatea
de acces 1/n), atunci formal lungimea medie a drumului de cutare an apare n
[8.3.6.a] unde pi este lungimea drumului de la rdcin la nodul i (adncimea
nodului i).
------------------------------------------------------------an =
1
n
[8.3.6.a]
i =1
1
((n2 1)an1 + 2n 1)
2
n
[8.3.6.g]
-------------------------------------------------------------
Pe de alt parte, an poate fi exprimat ntr-o form nerecursiv utiliznd termenii funciei
armonice H [8.3.6.h] dup cum se prezint n relaia [8.3.6.i]
------------------------------------------------------------Hn =1+
1 1
1
+ + ... +
2 3
n
[8.3.6.h]
------------------------------------------------------------an = 2
n +1
Hn 3
n
[8.3.6.i]
-------------------------------------------------------------
------------------------------------------------------------H n = + ln( n ) +
1
+ ...
12 n 2
[8.3.6.j]
ntruct lungimea medie a drumului de cutare ntr-un arbore binar perfect echilibrat
este [8.3.6.l]:
------------------------------------------------------------a n/ = log 2 (n) 1
[8.3.6.l]
-------------------------------------------------------------
Neglijnd termenii constani care pentru valori mari ale lui n devin neglijabili i trecnd
la limit, obinem relaia final [8.3.6.m].
------------------------------------------------------------an 2 ln(n) 2 ln(n)
=
=
= 2 ln 2 1.386
[8.3.6.m]
/
lim
log 2 (n) ln(n)
n an
ln 2
-------------------------------------------------------------
Desigur, creterea acestui efort poate fi mult mai mare, dac arborele aleatoriu
este nefavorabil, spre exemplu degenerat ntr-o list, dar aceast situaie are o
probabilitate foarte mic de a se realiza.
Cele 39 % impun practic limita efortului adiional de calcul care poate fi cheltuit n mod
profitabil pentru reorganizarea structurii dup inserarea cheilor.
n acest sens un rol esenial l joac raportul dintre numrul de accese la noduri
(cutri) i numrul de inserii realizate n arbore.
Cu ct acest raport este mai mare cu att reorganizarea structurii este mai
justificat.
O structur aparte de arbore binar o reprezint structura de arbore binar parial ordonat.
Caracteristica esenial a unui astfel de arbore este aceea c cheia oricrui nod nu este
mai mare (mic) dect cheile fiilor si.
11
14
19
10
16
15
Deoarece un arbore binar parial ordonat este de fapt un arbore binar, se poate realiza o
reprezentare eficient a sa cu ajutorul unui tablou liniar aplicnd tehnica specificat la
paragraful 8.2.4.1.
La o analiz mai atent se observ c de fapt un ansamblu este din punct de vedere al
reprezentrii un arbore binar complet.
Spre exemplu arborele binar parial ordonat din figura 8.3.7.a apare reprezentat ca un
ansamblu n figura 8.3.7.b.
1
10
11
16
15
14
19
10
secvena [8.3.8.1.a].
-----------------------------------------------------------{Problema concordanei. Implementare bazat pe arbori binari
ordonai}
TYPE RefTipNod=^cuvant
cuvant=RECORD
cheie:integer;
[8.3.8.1.a]
contor:integer;
stang,drept:RefTipNod
END;
------------------------------------------------------------ Fie radacina o variabil pointer care indic rdcina arborelui binar ordonat.
Programul care rezolv problema concordanei apare n secvena [8.3.8.1.b].
------------------------------------------------------------PROGRAM Concordanta;
TYPE
RefTipNod=^cuvant;
cuvant=RECORD
cheie:integer;
contor:integer;
stang,drept:RefTipNod
END;
VAR radacina:RefTipNod; cuv:integer;
PROCEDURE Imprarbore(r:RefTipNod);
BEGIN
IF r<>NIL THEN
BEGIN
Imprarbore(r^.stang);
WRITELN(r^.cheie,r^.contor);
Imprarbore(r^.drept)
END
END; {Imprarbore}
Dac nu se gsete nici un nod cu cheia cuv atunci are loc inseria similar celei
utilizate n cadrul procedurii Insereaza1 definit la inseria n arbori binari ordonai
varianta 1 ( &8.3.4)
Din analiza cutrii n arbori binari ordonai prezentat n &8.3.6. rezult n mod
evident c o procedur de inserare care restaureaz structura de arbore astfel nct ea s
fie tot timpul perfect echilibrat nu este viabil, deoarece activitatea de restructurare
este foarte complex.
Una dintre aceste definiii ale echilibrrii arborilor binari ordonai este cea propus de
Adelson, Velskii i Landis n 1962 i care are urmtorul enun:
Un arbore binar ordonat este echilibrat dac i numai dac pentru oricare nod al
arborelui, nlimile celor doi subarbori difer cu cel mult 1.
Arborii care satisfac acest criteriu se numesc "arbori AVL" dup numele
inventatorilor.
n acest context se vor studia urmtorii operatori defini n cadrul structurii arbore
echilibrat:
Toi aceti operatori necesit un efort de calcul de ordinul O(log n), unde n este
numrul nodurilor structurii, chiar n cel mai defavorabil caz.
10
11
O analiz atent a situaiilor posibile care rezult n urma inseriei evideniaz faptul c
exist numai dou configuraii care necesit tratamente speciale.
Celelelate configuraii pot fi reduse la aceste dou situaii din considerente de simetrie.
Prima situaie se refer la inseria nodurilor 1 sau 3 n arborele reprezentat cu
linie continu n figura 8.5.3.a
Cea de-a doua situaie se refer la inseria nodurilor 5 sau 7 n arborele din
figura 8.5.3.a
Cele dou situaii sunt prezentate n figurile 8.5.3.b i 8.5.3.c, fiecare n cte trei
ipostaze (a), (b) i (c) care evolueaz de la simplu la complicat.
Cele dou situaii sunt denumite cazul "1 Stnga" respectiv cazul "2
Stnga".
n cazul 2 Stnga este vorba despre o rotaie dubl n care sunt implicate
trei noduri: A,B i C.
5
3
8
1
B
5
(a)
(b)
B
A
14
13
10
11
15
12
12
10
14
13
11
15
(c)
C
A
(a)
(b)
12
A
4
13
11
12
15
10
14
10
14
11
13
15
D
S
hd
hs
D
SS S
SD
SS
SD DS
D DD
S
A
SD
SS
D
SDS
SDD
B
A
C
S
SS
SDS SD
SDD DS
DDD
B
S
A
D
DS
DD
DSSD
DDD
B
DS
DSS
DD
DSD
B
A
SSS
DSSSD DSDDS
DD
i aici reechilibrarea se rezolv prin una sau dou rotaii ale nodurilor A i B, respectiv
ale nodurilor A, B i C.
Un algoritm pentru inserie i reechilibrare depinde n mod critic de maniera n care este
memorat informaia referitoare la situaia echilibrului arborelui.
O soluie este aceea prin care se atribuie fiecrui nod un factor explicit de echilibru.
Factorul de echilibru se refer la subarborele a crui rdcin o constituie nodul
n cauz.
Aceste proceduri care includ operaia de cutare a unui nod, datorit formulrii lor
recursive, asigur n manier implicit "revenirea de-a lungul drumului de cutare".
Informaia care trebuie transmis la revenirea din fiecare pas este cea referitoare la
modificarea nlimii subarborelui n care s-a fcut inseria.
(+1)
(0)
hs
(-1)
hd
S
D
1
D
2
(-1)
(-1)
(-1)
(+1)
D
Caz 1 Stanga
D
0
D
Caz 2 Stanga
(1) Dac acest nod are la rndul su nlimea subarborelui su stng mai mare
ca cea a celui drept, adic factorul de echilibru egal cu (-1), suntem n cazul 1
Stnga.
(2) Dac factorul de echilibru al acestui nod este egal cu (+1) suntem n cazul
2 Stnga (fig. 8.5.3.h).
(3) n aceast situaie nu poate apare un subarbore stng a crui rdcin are un
factor de echilibru nul [Wi76].
Procedura care realizeaz acest lucru apare n secvena[8.5.3.b]. Principiul de lucru este
cel ilustrat n figura 8.5.3.h.
-----------------------------------------------------------{Inseria unui nod ntr-un arbore echilibrat AVL}
PROCEDURE InsertEchilibrat(x:TipCheie; VAR p:TipRef;
VAR h:BOOLEAN);
VAR p1,p2:TipRef; {h=fals}
BEGIN
IF p=NIL THEN
BEGIN {cuvntul nu e arbore; se insereaz}
new(p); h:=TRUE;
p^.cheie:=x; p^.contor:=1;
p^.stang:=NIL; p^.drept:=NIL; p^.ech:=0
END
ELSE
IF x<p^.cheie THEN
BEGIN
InsertEchilibrat(x,p^.stang,h);
IF h THEN {ramura stng a crescut n
nlime}
CASE p^.ech OF
+1: BEGIN
p^.ech:=0; h:=FALSE
END;
[8.5.3.b]
0: p^.ech:=-1;
-1: BEGIN {reechilibrare}
p1:=p^.stang;
IF p1^.ech=-1 THEN
BEGIN {cazul 1 stnga}
p^.stang:=p1^.drept;
p1^.drept:=p;
p^.ech:=0; p:=p1
END
ELSE
BEGIN { cazul 2 stnga}
p2:=p1^.drept;
p1^.drept:=p2^.stang;
p2^.stang:=p1;
p^.stang:=p2^.drept;
p2^.drept:=p;
IF p2^.ech=-1 THEN
p^.ech:=+1
ELSE
p^.ech:=0;
IF p2^.ech:=+1 THEN
p1^.ech:=-1
ELSE
p1^.ech:=0;
p:=p2
END;
p^.ech:=0; h:=FALSE
END
END {CASE}
END
[8.5.3.b]
ELSE
IF x>p^.cheie THEN
BEGIN
InsertEchilibrat(x,p^.drept,h);
IF h THEN {ramura dreapta a crescut
n nlime}
CASE p^.ech OF
-1: BEGIN
p^.ech:=0; h:=FALSE
END;
0: p^.ech:=+1;
+1: BEGIN {reechilibrare}
p1:=p^.drept;
IF p1^.ech=+1 THEN
BEGIN {cazul 1 dreapta}
p^.drept:=p1^.stang;
p1^.stang:=p;
p^.ech:=0; p:=p1
END
ELSE
BEGIN {cazul 2 dreapta}
p2:=p1^.stang;
p1^.stang:=p2^.drept;
p2^.drept:=p1;
p^.drept:=p2^.stang;
p2^.stang:=p;
IF p2^.ech=+1 THEN
p^.ech:=-1
ELSE
p^.ech:=0;
IF p2^.ech=-1 THEN
p1^.ech:=+1
ELSE
p1^.ech:=0;
p:=p2
[8.5.3.b]
END;
p^.ech:=0; h:=FALSE
END
END {CASE}
END
ELSE
BEGIN
p^.contor:=p^.contor+1;
END
END; {InsertEchilibrat}
------------------------------------------------------------ Procedura InsertEchilibrat funcioneaz dup cum urmeaz:
+5
1S
1D
7
8
10
10
(a)
+6
+9
2S
(c)
2D
7
7
10
5
7
(b)
10
10
6
(d)
(e)
(f)
10
i n cazul arborilor echilibrai AVL, suprimarea este o operaie mai complicat dect
inseria.
n principiu ns, operaia de reechilibrare rmne aceeai, reducndu-se la una sau dou
rotaii la stnga sau la dreapta.
Tehnica care st la baza suprimrii nodurilor n arbori echilibrai AVL este similar
celei utilizate n cazul arborilor binari ordonai prezentat n &8.3.5.
Cazul evident este cel n care, nodul care se suprim este un nod terminal sau
are un singur descendent.
Dac nodul de suprimat are ns doi descendeni, el va fi nlocuit cu cel mai din
dreapta nod al subarborelul su stng.
Tehnica suprimrii nodurilor din arbori echilibrai AVL este materializat de procedura
SuprimEchilibrat secvena [8.5.4.a]
------------------------------------------------------------{Suprimarea unui nod ntr-un arbore echilibrat AVL}
PROCEDURE SuprimEchilibrat(x:TipCheie; VAR p:TipRef;
VAR h:BOOLEAN);
VAR q:TipRef; {h=fals}
PROCEDURE Echilibru1(VAR p:TipRef: VAR h:BOOLEAN);
VAR p1,p2:TipRef;
e1,e2:(-1,0,+1);
BEGIN {h=adevrat,ramura stnga a devenit mai mic}
CASE p^.ech OF
-1: p^.ech:=0;
0: BEGIN
p^.ech:=+1; h:=FALSE
END;
+1: BEGIN {reechilibrare}
[8.5.4.a]
p1:=p^.drept; e1:=p1^.ech;
IF e1>=0 THEN
BEGIN {cazul 1 dreapta}
p^.drept:=p1^.stang; p1^.stang:=p;
IF e1=0 THEN
BEGIN
p^.ech:=+1; p1^.ech:=-1;
h:=FALSE
END
ELSE
BEGIN
p^.ech:=0; p1^.ech:=0
END;
p:=p1
END
ELSE
END
END {CASE}
END; {Echilibru1}
[8.5.4.a]
p:=p2; p2^.ech:=0
END
END
END {CASE}
END; {Echilibru2}
------------------------------------------------------------
-7
-11
(a)
1S
11
10
13
9
-9
11
12
(b)
10
14
13
12
14
-8
(c)
(d)
8
1D
10
13
12
-5
(f)
6
2D
13
10
14
12
-4
-10
(h)
(i)
(j)
1D
10
13
12
14
12
(g)
10
6
14
12
14
13
10
10
(e)
13
13
6
14
12
13
13
14
12
6
14
14
12
Dndu-se arborele binar echilibrat (a), se suprim n mod succesiv nodurile avnd cheile
7,11,9,8,5,4 i 10, rezultnd arborii (b)...(j).
n cazul arborilor binari echilibrai, suprimarea unui nod se realizeaz n cel mai
defavorabil caz cu performaa O(log n).
Diferena esenial dintre inserie i suprimare n cazul arborilor echilibrai AVL este
urmtoarea:
n urma unei inserii, reechilibrarea se realizeaz prin una sau dou rotaii (a
dou sau trei noduri)
Suprimarea poate necesita n cel mai defavorabil caz, o rotaie simpl sau
dubl, a fiecrui nod situat pe drumul de cutare.