You are on page 1of 130

Structuri de date i algoritmi

_______________________________________________________________________________
V. TEHNICI DE CAUTARE
V.1. Introducere n tehnicile de cutare
O operaie fundamental intrinsec pentru un numr mare de probleme de calcul este
cutarea: recuperarea unei buci de informaii dintr-o mulime de informaii stocate anterior.
De obicei informaia este divizat in mai multe nregistrri fiecare !nregistrare are o cheie
care este folosit !n procesul de cutare. Obiectivul cutrii este de a gsi toate !nregistrrile care au
c"ei identice cu cea care este c"eia de cutare. Scopul cutrii este de a accesa informaiile din
!nregistrri pentru procesare.
#n cazul procesului de cutare avem diferite programe care sunt cunoscute pretutindeni i
utilizate frecvent deci merit s studiem o serie de metode mai detaliat. $om !ncepe cu studierea
unor metode elementare care sunt utilizate cu succes pentru tabele de dimensiuni mici i !n alte
situaii speciale i ilustreaz fundamental te"nicile e%ploatate de ctre metode mult mai avansate.
$om studia metodele care stoc"eaz !nregistrri !n liste care sunt cutate ori prin compararea
c"eilor sau prin inde%are valorii c"eii i vom studia metode fundamentale care construiesc structuri
definite de valoarea c"eii.
&utarea reprezint operaiunea care dureaz cel mai mult !n ma'oritatea programelor de
prelucrare iar !nlocuirea unei metode mai (proaste de cutare cu una mai (bun conduce deseori
la o cretere substanial !n viteza de prelucrare.
Deci scopul acestui capitol este s prezinte !ntr-o manier accesibil pentru programatori
c)teva te"nici de cutare cum ar fi* cutarea secvenial cutarea binar arbori binari de cutare
si tabele de dispersie +"as", precum o serie de te"nici de rezolvare a coliziunilor -.or /0112.
3n locul descrierii la nivel conceptual a soluiilor unor probleme de programare folosind
e%clusiv instrumente 4artificiale4 gen 5seudocod care s fie adaptate mai mult sau mai puin
claselor de algoritmi discutai prezentarea celor mai performante soluii teoretice este completat
de descrierea metodelor i mecanismul de implementare a lor folosind limba'ul de programare
Pascal.
V.1.1.CUTARE !ECVENTIA"
V.1.1.1. Descrierea #eneral a $etodei
&ea mai simpl metod de cutare este cutarea secvenial. O metod simpl de stocare a
informaiei este stocarea !nregistrrilor !ntr-o tabel. &)nd o nou !nregistrare este inserat acesta se
adaug !n poziia dorit c)nd trebuie efectuat o cutare tabela este parcurs secvenial.
&utarea secvenial este cea mai simpl metod de cutare a unei !nregistrri !ntr-o tabel
________________________________________________________________________________
/67
Structuri de date i algoritmi
_______________________________________________________________________________
neordonat !ntr-un mod secvenial p)n c)nd !nregistrarea dorit este gsit.
3n multe aplicaii este nevoie ca s e%tindem programul pentru ca s putem lucra cu
!nregistrri si c"ei mai complicate dar acesta nu va afecta fundamental algoritmul de cutare.
8lte operaii posibile !ntr-o tabel !n afar de operaia de cutare% sunt operaiile de
inserare i tergere. Datele pot fi inserate sau terse la nceputul tabelei la sfritul tabelei i !n
interiorul tabelei.
9n algoritm de inserare la sf)ritul tabelei implementat !n 5ascal este prezentat mai 'os*
PR&CEDURE #:S;<8<;=
'E(IN
)RITE+>#ntroducei elementul pe care dorii s-l inserai*>,=
READ"N+g,=
T-nr?/2*@g= A nr numrul de elemente din tablou B
END=
#n cazul operaiei de tergere la nceput primul element din tabel este ters iar celelalte
elemente se vor translata fiecare cu o poziie !n sus !n tabel. 9n algoritm general pentru cutare
secvenial este prezentat mai 'os.
8vem un vector neordonat T av)nd C8D +C8D E@ /, elemente. 8cest algoritm caut !n
vectorul T elementul particular av)nd valoarea D. Funcia returneaz inde%ul elementului vector
dac cutarea este cu succes altfel returneaz 7.
Secvena de instruciuni !n 5seudocod este*
G *@ /=
&HII#C5 G J@ C8D ;D;&9IK
D8&K I-G2 @ D
8I9:&#
L returneaz G= Acutare cu succesB
;D#I=
8MIF;M
G *@ G ? /=
SFD8&K
SF&HI
L returneaz 7= Acutare cu insuccesB
5rimul pas al algoritmului iniializeaz valoarea variabilei * cu a'utorul creia parcurgem
tabela. 3n pasul al doilea se face o cutare secvenial. Dac variabila * depete capacitatea
ma%im C8D atunci avem cutare fr succes +nu s-a gsit un element al tabelei cu valoarea D,
altfel avem cutare cu succes i variabila * va conine inde%ul !nregistrrii cutate.
#mplementarea !n 58S&8M a algoritmului de cutare secvenial este*
________________________________________________________________________________
/6/
Structuri de date i algoritmi
_______________________________________________________________________________
Exemplul 4.1.
+unction &89I8<; _S;&$;:I#8M8 + I ' D , * integer =
'e#in
G *@ / = A G - elementul cu care parcurgem tabela B
O. *@ ,alse
-hile + not O. , and + G J@ ' , do A ' - numrul de elemente din tabela I B
.e#in
i, I - G 2 @ D t"en A D N c"eia cutat B
.e#in
O. *@ true =
&89I8<;_S;&$;:I#8M8 *@ G =
end =
e/it
else
G *@ G ? / =
end=
&89I8<;_S;&$;:I#8M8 *@ 7 =
end =
5erformana unei metode de cutare se msoar prin numrarea comparaiilor c"eii p)n ce
este gsit o !nregistrare particular. Sunt dou cazuri importante i anume -8"o /0162*
Cazul general +8verage Mengt" of Searc" - ALOS,
Cazul cel mai nefavorabil +Oorst Mengt" of Searc" - WLOS, .
&utarea secvenial +implementare cu a'utorul unui vector de dimensiune n, necesit !n
cazul cel mai nefavorabil +cutare fr succes, n?/ operaii de comparaie iar !n cazul general
avem +n?/,PQ operaii de comparaie pentru o cutare cu succes. Formula de calcul a performanelor
metodei de cutare !n cazul general N ALOS este e%primat prin formula +-Ire /01R2,*

n
i
i i
nr p ALOS
/
+S./,
unde p
i
reprezint probabilitatea ca informaia a-i-a s fie cutat iar nr
i
reprezint numrul de
operaii necesar accesrii informaiei a-i-a. 5robabilitatea ca o dat s fie cutat poate fi e%primat
prin raportul*
cautari de total nr
i datei al cautari de nr
p
i
_ _ _
_ _ _ _ _

+S.Q,
5entru o cutare cu succes dac presupunem c probabilitatea de cutare a unei !nregistrri
particulare este aceeai cu probabilitatea de cutare a altor !nregistrri atunci numrul general de
comparaii este*
________________________________________________________________________________
/6Q
Structuri de date i algoritmi
_______________________________________________________________________________
( )
Q
/
Q
/
Q / /
/
+

+ +

n
n
n n
n
n
i
n
ALOS
n
i

+S.T,
3n cazul !n care probabilitatea de accesare a datelor din tabel nu este ec"iprobabil atunci
cea mai eficient metod de organizare a datelor este cea !n ordine descresctoare a probabilitilor
de cutare datele cele mai probabile a fi cutate fiind dispuse la !nceputul tabelei. S dovedim
aceast afirmaie*
- fie datele organizate !ntr-o tabel !n ordinea descresctoare a probabilitilor de cutare i
anume*
Data
1
Data
2
.. Data
i
.. Data
n
astfel !nc)t*
n i
p p p p > > >
Q /
+S.R,
5entru aceast organizare a datelor !n tabel avem performana*



+ + + + + +
n
i
n j i i
n
i
i i
p n p j p i p p i p nr p ALOS
/
Q /
/
/
Q /
unde
j i <
. S presupunem c e%ist o alt organizare a datelor unde acestea nu sunt organizate !n
tabel !n ordinea descresctoare a probabilitilor de cutare +S.T, i s msurm performana
8MOS a algoritmului de cutare. ;ste suficient s presupunem c e%ist o simpl permutare a
datelor i anume c avem permutate Data
i
cu Data
j
!n tabel. 3n aceast situaie performana
algoritmului de cutare este*



+ + + + + +
n
i
n i j i
n
i
i i
p n p j p i p p i p nr p ALOS
/
Q /
/
Q
Q /
S comparm cele dou performane*
( ) ( ) ( )( ) 7
Q /
< + + j i p p i j p j i p p j p i p j p i ALOS ALOS
j i j i i j j i deoarece
j i p p
j i
< > i
.
&oncluzia este evident organizarea datelor !ntr-o tabel pentru a avea cea mai bun
performan media a operaiei de cutare este conform cu +S.R, adic datele trebuie organizate !n
ordine descresctoare a probabilitii de cutare.
V.1.1.0. Pro.le$e re1ol2ate 3entru cutare sec2en4ial
Exemplul 4.2. 5roblema cutrii unei !nregistrri particulare !ntr-o tabel
Fiind dat un tablou cu o capacitate de ma%im C8D !nregistrri posibile +!nregistrri de tip
numr !ntreg , se cere implementarea !n limba'ul 5ascal a unui algoritm algoritmi care s realizeze
________________________________________________________________________________
/6T
Structuri de date i algoritmi
_______________________________________________________________________________
urmtoarele operaii* inserare cutare +secvenial, i tergere !n tablou.
Pro#ra$ cautare_in_tabel =
const
C8D@/77=
t53e
tablou @ arra5 -/..C8D2 of integer=
2ar
I * tablou =
d nr G g i ' * integer =
a * c"ar =
Procedure I;SI8<; =
.e#in
i, nr E C8D then .e#in
A nr N numrul elementelor din tabel B
A C8D N numrul ma%im de elemente B
-rite + > Depire capacitate > , =
dela5 + R777 , =
halt =
end =
end =
Procedure #:S;<8<; =
.e#in
-rite + > #ntroducei elementul de inserat* > , =
readln + g , = A g N elementul care se !nsereaz B
,or G *@ nr do-nto / do
I- G?/ 2 *@ I - G 2 =
I- / 2 *@ g =
-riteln + > Iabloul este* > , =
,or i *@ / to +nr ? /, do
-riteln + > I- > i > 2@ > I- i 2 , =
readln =
end =
Procedure SI;<U;<; =
.e#in
-rite + >#ntroducei poziia elementului de sters* > , =
readln + d , = A d N reprezint poziia elementului care va fi ters B
,or G *@ d?/ to nr do
I - G-/ 2 *@ I - G 2 =
-riteln + > Iabloul este * > , =
,or i *@ / to + nr-/ , do
-riteln + > I - > i > 2@ > I - i 2 , =
________________________________________________________________________________
/6R
Structuri de date i algoritmi
_______________________________________________________________________________
readln =
end =
Procedure &89I8<; =
2ar
oG * .oolean =
" * inte#er =
.e#in
-rite + > #ntroducei elementul cutat * > , =
readln + " , = A " N elementul cutat B
o* *@ ,alse =
,or i *@ / to nr do
.e#in
i, I- i 2 @ " then
.e#in
o* *@ true=
-riteln + > ;lementul cutat se afl pe poziia * > i , =
end =
end =
i, not o* then
-riteln + > ;lementul cutat nu e%ist !n tablou V > , =
read*e5 =
end =
'E(IN
clrscr =
-rite + > #ntroducei nr. de elemente dorite * > , =
readln + nr , =
I;SI8<; =
,or i *@ / to nr do
.e#in
-rite + > I- > i > 2 @ > , =
readln + I- i 2 , =
end =
re3eat
clrscr =
-riteln + > 8psai tasta dorit * > , =
Writeln + > 7 * 5entru !nserare !n tablou > , =
Writeln + > / * Xtergere !n tablou > , =
Writeln + > Q * &utare !n tablou > , =
Writeln + Y 5entru ieire din program apsai tasta ;sc Y , =
a *@ read*e5 =
case a o,
> 7 > * #:S;<8<; =
> / > * SI;<U;<;=
> Q > * &89I8<; =
________________________________________________________________________________
/6S
Structuri de date i algoritmi
_______________________________________________________________________________
end =
until a @ Z Q6 =
END.
Exemplul 4.2. roblema elementelor pozitive! negative si nenule
:umrai elementele pozitive negative i nenule ale unei liste !ntr-o funcie care dup
apelare returneaz un pointer la un vector cu trei componente ce stoc"eaz rezultatele parcurgerii
listei.

Pro#ra$ numara =
t53e
plista @ [ lista =
lista @record
b * integer =
paue * plista =
end 6
vec @ arra5 - /..T 2 o, b\te =
pv @ vec =
2ar
cp/ * plista =
i n * integer =
vect * vec =
pvec * pv =
+unction creare + n*integer , * plista =
2ar
prad * plista =
.e#in
i, n @ 7 then
creare *@ NI"
else
.e#in
n *@ n-/=
-rite + > Dati elementul " >, =
ne- +prad, =
readln +prad [.b, =
prad [.paue *@ creare +n, =
creare *@ prad =
end 6
end 6
+unction numr +p/ * plista, * pv =
2ar
plucru * pv =
________________________________________________________________________________
/6]
Structuri de date i algoritmi
_______________________________________________________________________________
.e#in
plucru *@ vect =
,or i *@ / to T do
plucru [- i 2 *@ 7 =
-hile p/ J E NI" do
.e#in
i, p/ [. b E 7 then
plucru [ - / 2 *@ plucru [- / 2 ? /
else
i, p/ [.b J 7 then
plucru [ - Q 2 *@ plucru [- Q 2 ? /
else
plucru [ - T 2 *@ plucru [- T 2 ? / =
p/ *@ p/ [.paue =
end 6
numr *@ plucru =
end 6
'E(IN
-rite +> #ntroduceti numrul de elemente ale listei * >, =
readln +n, =
cp/ *@ creare +n, =
pvec *@ numr +cp/, =
-riteln 6
END.
V.1.1.7. Pro.le$e 3ro3use
1. Dac toate c"eile de cutare sunt ec"iprobabile care este deviaia standard a numrului de
comparaii efectuate !ntr-o cutare secvenial cu succes !ntr-un tabel cu N !nregistrri ^
0. 5resupunem c dorii s cutai !ntr-un fiier voluminos nu dup criteriul egalitii ci pentru a
gsi /777 de !nregistrri cele mai apropiate unei c"ei date !n sensul c aceste /777 de
!nregistrri au cea mai mic valoare a lui d !i"!# pentru o funcie d de distan dat. &are
structur de date este cea mai adecvat pentru o asemenea cutare secvenial ^
7. Fiind date dou succesiuni J D
/
D
Q
_ D
n
E i J `
/
`
Q
_ `
n
E de numere reale care
permutare a
/
aa
Q
a_aa
n
a indiciilor va determina valoarea ma%im al lui +D
i
a `
ai
,^ Dar
valoarea minim ^
8. 9n programator dorete s testeze dac n condiii date s)nt sau nu simultan !ndeplinite. +De
e%emplu el poate dori s testeze dac simultan este adevrat ca % E 7 si \ J zaz dar nu este
evident care dintre condiii trebuie testat prima,. S presupunem c sunt necesare I
i
uniti de
________________________________________________________________________________
/66
Structuri de date i algoritmi
_______________________________________________________________________________
timp pentru testarea condiiei i i c aceast condiie se adeverete cu probabilitatea 5
i

independent de rezultatul celorlalte teste de condiii. 3n care ordine trebuie s se e%ecute testarea
condiiilor ^
9. Fiind dat un te%t cu ma%im 17 de caractere ce se termin cu caracterul b s se scrie un program
care s afieze te%tul !n ordine invers.
:. Dac D este un vector cu n componente reale scriei secvene de instruciuni pentru a obine
urmtoarele transformri + fr a folosi un vector suplimentar , *

a , + D
/
D
Q
_ D
n
, + D
n
D
/
D
Q
_ D
n-/
,
b , + D
/
D
Q
_ D
n
, + D
n
D
n-/
D
n-Q
_ D
Q
D
/
,
c , + D
/
D
Q
_ D
n
, + D
i/
D
iQ
_ D
in
,
astfel !nc)t D
i/
J D
iQ
J _ J D
in
iar / J @ i
G
J @ n = / J @ G J @ n .
d , 5e primele poziii s apar elementele negative in aceeai ordine ca !n irul iniial .
;. Se consider un te%t ce conine litere mari litere mici semnele de punctuaie* YY = Y.Y = Y*Y = YVY =
Y^c = Y-Y = Y_c = i se termin cu caracterul b. S se afieze numrul de apariii ale fiecrui
caracter precum i numrul de caractere diferite !nt)lnite !n te%t. Se presupune c Ybc nu este un
caracter al te%tului.
<. Fie ; un numr natural cu n cifre memorate !ntr-un vector cu n din domeniul 7..0. S se verifice
dac ; este un numr divizibil cu *
a, Q = b, S = c, R = d, T = e, 0 = f, 6 = g,// = ", 1 = i, QS = ', /QS =
G, /T = l, Q6 = m, T6 = n, ] = o, /S.
=. S se afieze toate numerele de n cifre care adunate cu rsturnatul lor dau un ptrat perfect .
1>. S se implementeze un algoritm care rearan'eaz toate elementele dintr-un tablou
unidimensional astfel !nc)t toate valorile negative vor precede pe cele pozitive . S se utilizeze
un numr minim de intersc"imbri .
11. S se implementeze un algoritm care pentru dou numere !ntregi cu n cifre memorate vectorial
s determine suma produsul c)tul i restul !mpririi primului numr la al doilea numr.
<ezultatele se vor obine sub forma vectorial .
V.1.0. CUTARE 'INAR
V.1.0.1.Descrierea #eneral a $etodei

________________________________________________________________________________
/61
Structuri de date i algoritmi
_______________________________________________________________________________
O alt metod relativ simpl de accesare a unei tabele este metoda cutrii .inare.
Organizarea datelor !n aceast tabel se bazeaz pe ordonarea linear$ a c"eilor +de e%emplu !n
ordine alfabetic sau ordine numeric cresctoare,. O metod potrivit pentru ordonarea datelor este
sortarea despre care vom vorbi !ntr-un alt capitol.
O cutare pentru o !nregistrare cu o anumit valoare a c"eii este asemntoare cu cutarea
unui nume !ntr-o agend de telefoane. ;ste localizat cu apro%imaie !nregistrarea din mi'locul
tabelei este comparat c"eia !nregistrrii din mi'loc cu c"eia !nregistrrii cutate. Dac c"eia
cutat este mai mare dec)t valoarea c"eii din mi'loc atunci procedura se repet !n 'umtatea de
interes a tabelei p)n c)nd !nregistrarea dorit este gsit sau intervalul de cutare este gol ceea ce
semnific lipsa c"eii cutate.
3n +i#ura 8.1 avem un e%emplu de cutare binar a c"eii % aflat !ntr-o tabel construit
prin inserarea c"eilor a s e a r c " i n g e % a m p l e +Ire -/01R2,. #ntervalul de c"ei este
!n'umtit la fiecare pas deci numai patru comparaii s)nt necesare !n acest caz.
#igura 1. E/e$3lu de cutare .inar.
Operaia de inserare +metoda inseriei binare , realizeaz !n fiecare din cei &-/ pai ai si
!nserarea celei de a i N a !nregistrri din tabloul iniial !n irul de'a sortat al precedentelor i -/
!nregistrri .
Determinarea poziiei de !nserare se face prin cutare binar folosindu-se faptul c
!nregistrrile precedente sunt de'a sortate i reduc)ndu-se astfel numrul mediu de comparaii
necesare de la iPQ la log
Q
i .
Operaia de ?ter#ere este identic cu cea din cutarea secvenial adic elementele din
tablou aflate !naintea elementului care va fi ters vor rm)ne pe loc poziiile lor nu se sc"imb
;lementele care se afl dup elementul care va fi ters vor fi translatate cu o poziie.
V.1.0.0. Descrierea al#orit$ului de cutare n Pseudocod
9n algoritm pentru o astfel de procedur de cutare este prezentat !n r)ndurile urmtoare.
8vem un vector @ cu N elemente ordonate cresctor acest algoritm face o cutare pentru
un element cu valoarea A. $ariabilele "&) BIDD"E i HI(H noteaz li$ita in,erioar
________________________________________________________________________________
/60
Structuri de date i algoritmi
_______________________________________________________________________________
$iClocul i li$ita su3erioar a intervalului de cutare. Funcia de cutare returneaz inde%ul
elementului cutat dac avem o cutare cu succes altfel returneaz valoarea 7.
MOO *@ /
d#Ud *@ :
&HII#C5 MOO J@ d#Ud ;D;&9IK
C#DDM; *@ -+MOO ?d#Ud , P Q 2
D8&K D J . -C#DDM;2
8I9:&# d#Ud *@ C#DDM;-/
8MIF;M D8&K D E . -C#DDM;2
ATUNCI MOO *@ C#DDM; ? /
A"T+E" A&$utare cu succes B
Lreturnea1 C#DDM;.
SFD8&K
SFD8&K
SF&HI
Lreturnea1 7. A'$utare f$r$ succes B
5asul / iniializeaz variabilele MOO i d#Ud pasul T calculeaz valoarea variabilei
C#DDM; care este mi'locul tabelei. 5asul R face comparaiile !ntre c"eia de cutat i valorile limit
i returneaz c"eia cutat dac este gsit. 5asul S returneaz valoarea 7 adic cutare fr succes.
&utarea binar poate fi fcut i !n mod recursiv. Ma un astfel de algoritm este important
ti$3ul de e/ecu4ie +timpul de cutare , i s3a4iul ,olosit. Descrierea algoritmului de cutare binar
+!n mod recursiv , !n 5seudocod este prezentat !n continuare .
8vem un subinterval a crei limite s)nt 5 si e i un vector .. 8cest algoritm recursiv caut
un element dat al crei valoare este stocat !n variabila D C#DDM; i MO& s)nt variabile de tip
!ntreg.
F9:&I#8 &89I8<;_f#:8<8 _< +5 e . D , ;SI;*
D8&K 5 E e
8I9:&#
MO& *@ 7=
8MIF;M
C#DDM; *@ -+ 5 ? e ,P Q 2=
D8&K D J . -C#DDM; 2
8I9:&#
MO& *@ &89I8<;_f#:8<8 _< +5C#DDM;-/.D ,=
8MIF;M
D8&K D E . -C#DDM; 2
8I9:&#
MO&*@&89I8<;_f#:8<8 _< +C#DDM;?/e.D ,=
8MIF;M
MO& *@ C#DDM;=
SFD8&K
SFD8&K

________________________________________________________________________________
/17
Structuri de date i algoritmi
_______________________________________________________________________________
SFD8&K
SF-&89I8<;_f#:8<8=

E/e$3lul 8.7. #mplementarea algoritmului de cutare binar !n 5ascal.
+unction &89I8<; _f#:8<8 + . MOOd#Ud C#DDM; D , * inte#er =
'e#in
MOO *@ / =
d#Ud *@ :=
re3eat
C#DDM; *@ +MOO ? d#Ud, P Q =
i, D J .-C#DDM;2 then
.e#in
d#Ud *@ C#DDM;-/
else i, D E .-C#DDM;2 then do
MOO *@ C#DDM; ? /
else .e#in
-riteln + Y &utare cu succes V Y, =
-riteln + Y5oziia * Y C#DDM; ,=
e/it =
end =
end =
until MOO DE d#Ud6
-riteln + Y &utare fr succes V Y, =
end =
V.1.0.7. Per,or$an4a al#orit$ului de cutare
Iimpul de cutare +e%ecuie, I+n, depinde de numrul de comparaii efectuate care depind
la r)ndul lor de poziia informaiei cutate D. 3n cel mai bun caz informaia cutat este poziionat
!n locaia
1
]
1

+
Q
/ n
+am notat cu - 2 funcia parte !ntreag,. 3n aceast situaie este necesar doar o
________________________________________________________________________________
/1/
Structuri de date i algoritmi
_______________________________________________________________________________
singur operaie de comparaie deci I+n, @ O+/,. &utarea binar nu folosete nici odat mai mult
de lg & ?/ comparaii pentru cutarea cu succes c)t i pentru cutarea fr succes +-8"o /0162,.
#n procesul de cutare binar recursiv c"eia cutat este gsit !n ma%imum log& comparaii
care este un c)tig deosebit faa de cele :PQ comparaii ale cutrii secveniale .
5entru a determina timpul de cutare !n cazul operaiei de cutare binar vom considera c
toate datele sunt ec"iprobabile. 5entru a simplifica analiza vom presupune c dimensionalitatea
datelor este de forma / Q
(
n . 8tunci ( ) / log
Q
+ n ( .
8ceast ipotez nu distruge generalitatea argumentaiei cci putem oric)nd completa o
structur de date cu elemente care nu sunt cutabile ca s o aducem la forma 2
(
N /. Oricum timpul
de e%ecuie al structurii de date originale va fi mai mic sau egal dec)t a structurii de date aduse la
forma / Q
(
n .
S notm cu S
i
numrul de elemente pentru care algoritmul de cutare binar efectueaz un
numr de i operaii +comparaii,. 8vem*
7
/
Q / S =
/
Q
Q Q S =
Q
T
Q R S
= _
( i S
i
i


Q
/
8plic)nd formula +S./, vom avea*
( ) ( ) ( )
( ) ( ) ( ) [ ] ( )
( )
( )
( ) n n
n n
n
n
n
(
( ( (
n
(
n
i i
n
i i
n
i
n
i
n
i
n
S
d p n )
( ( (
(
i
(
i
i i
(
i
i
(
i
(
i
i
(
i
i i i
(
i
(
i
(
i
i i
i i
Q Q
Q
Q
/
/
7
/
/
/ /
/
7
/
/ / /
/
log / / log
/
/
/ log
/ / log
/ / Q /
/
/ Q Q
/
Q Q Q
/
Q / Q
/
Q Q
/
Q
/
+

,
_

+
+
+ +
+ + +
,
_



,
_

5utem considera c avem* ( ) ( ) n O n )


Q
log at)t pentru cazul general c)t i pentru cel mai
nefarorabil caz.
#n caracterizarea acestui algoritm pe l)ng timpul de e%ecuie este important i spaiul
necesar pentru memorarea datelor. 5entru algoritmul de cutare binar analiza spaiului este mai
interesant dac presupunem c vectorul este transmis ca i parametru prin *aloare -Sed /0112.
8cesta !nseamn c pentru fiecare accesare a funciei CutareF'inarFR are loc o stocare local
diferit pentru vector +vectorul are mai multe copii,. Deci spaiul pentru un apel al rutinei este
prorional cu O+n,. Dup cum am vzut mai sus !n cazul general sau cel mai nefavorabil avem
nevoie de O+log
Q
n, operaii de cutare adic !n final avem nevoie de un spaiu de memorie
proporional cu O+n log
Q
n,.
$bservaia 4.1"
Ie"nica de cutare binar are i unele proprieti nedorite. #nserarea unei noi !nregistrri
impune ca o serie de !nregistrri e%istente !n tabel s fie mutate fizic pentru a pstra ordinea
cresctoare. O situaie similar este prezent i !n cazul procesului de tergere .
Ma aceast metod timpul necesar operaiei de tergere ocup o proporie mare din timpul de
cutare. &utarea binar este potrivit pentru aplicaii !n care sunt efectuate puine operaii de
inserare sau tergere.
________________________________________________________________________________
/1Q
Structuri de date i algoritmi
_______________________________________________________________________________
V.1.0.8. Pro.le$e re1ol2ate 3entru cutarea .inar
Exemplul 4.%. 5roblema cutrii elementelor comune a dou iruri de numere -Iud /00T2.
8ceast problem construiete vectorul elementelor comune a doi vectori +a .,. Se va
parcurge secvenial vectorul a i fiecare element care este gsit i !n vectorul . va fi memorat !ntr-
un vector nou c construit de ctre subprogram .
8cest program funcioneaz at)t pentru vectori ordonai cresctor c)t i pentru vectori
ordonai descresctor.
Pro#ra$ ele$enteFco$une 6
const
ma%_elem @ /7 =
t53e
cazuri @ + constant cresc desc neord , =
val_indice @ / .. ma%_elem =
vector @ arra5 -val_indice 2 o, inte#er =
2ar
a b c * vector =
na nb ic indice * val_indice =
tip * cazuri =
Procedure citete vector + 2ar % * vector = 2ar numr * val_indice = car * char , =
2ar
i * inte#er =
.e#in
i *@ 7 =
re3eat
i *@ i ? / =
-rite +Yc car Y-Y # *Q Y2 @ Y, = read +% - i 2, =
i, + i $od S , @ 7
then -riteln =
until + %- i 2 J 7 , or + i E @ ma%_elem , =
i, % - i 2 J 7
then numr * @ i N /
else
numr * @ i =
-riteln =
end
end =
Procedure afieaz + % * vector = numr * val_indice , =
2ar
i * val_indice =
________________________________________________________________________________
/1T
Structuri de date i algoritmi
_______________________________________________________________________________
.e#in
,or i * @ / to numr do
.e#in
Write + Y % - Y # * Q Y 2 @ Y % - # 2 , =
I, + i $od S , @ 7
then -riteln =
end
end =
,unction gasit + % * vector = numr * val_indice = elem : inte#er , * .oolean =
2ar
i * inte#er =
.e#in
i *@ / =
-hile + % - i 2 JE elem , and + i J numr , do
i *@ i ? / =
gasit *@ % - i 2 @ elem
end =
,unction tip_ord + % * vector = numr * val_indice , * cazuri =
2ar
ord_cresc odr_desc * .oolean =
i * inte#er =
.e#in
ord_cresc *@ true =
ord_desc *@ true =
i *@ 7 =
-hile +ord_cresc or ord_desc , and + # J numr N / , do
.e#in
i *@ i? / =
i, % - i 2 E % - i ? / 2
then ord_cresc *@ ,alse =
i, % - i 2 J % - i ? / 2
then ord_desc *@ ,alse =
End =
i, ord_cresc and ord_desc
then tip_ord *@ constant A ir constant B
else
i, ord cresc
then tip_ord *@cresc A ir cresctor B
else
i, ord_desc
then tip_ord *@ desc Air descresctor B
else tip_ord *@ neord + ir neordonat B
end=
________________________________________________________________________________
/1R
Structuri de date i algoritmi
_______________________________________________________________________________
+unction cautare_bin + % * vector = numr * val_indice = valoare * inte#er , * .oolean =
2ar
inferior superior mi'loc * inte#er =
.e#in
inferior *@ / =
superior *@ numr =
mi'loc *@ + inferior ? superior, div Q =
-hile + valoare JE % - mi'loc 2 , and + + superior Ninferior , E / , do
.e#in
i, + tip @ cresc , and + valoare J % - mi'loc 2 , or
+ tip @ desc , and + valoare E % - mi'loc 2 ,
then superior *@ mi'loc
else inferior *@ mi'loc =
mi'loc *@ + inferior ? superior , di2 Q =
end =
i, % - mi'loc 2 JE valoare
then
.e#in
i, % - superior 2 @ valoare
then mi'loc *@ superior =
i, % - inferior 2 @ valoare
then mi'loc *@ inferior
end=
cutare_bin *@ % - mi'loc 2 @ valoare
end =
Procedure construieste +% \ * vector = n% n\ * val_indice = var numr * val_indice , =
Procedure memoreaz =
.e#in
i, + not gasit +c numr % - indice 2,, or + numr @ 7 ,
then
.e#in
:umr *@ numr ? / =
c - numr 2 *@ % - indice 2
end
end=
.e#in
numr *@ 7 =
,or indice *@ / to n% do
case tip o,
constant * i, % - indice 2 @ \ - / 2
then memoreaz =
desc cresc * i, cutare _bin + \ n\ % - indice 2 ,
then memoreaz =
________________________________________________________________________________
/1S
Structuri de date i algoritmi
_______________________________________________________________________________
neord * i, g)sit + \ n\ % - indice 2 ,
then memoreaz
end=
end=
A program principal B
'E(IN
citete vector + a na Y a c ,=
citete vector + b nb Y b c ,=
tip *@ tip_ord + a na , =
i, tip @ neord =
then
.e#in
tip *@ tip_ord + b nb ,=
construiete + a b na nb ic ,
end
else
construiete + b a nb na ic ,=
-riteln =
i, ic JE 7
then
.e#in
-riteln + Y;lementele comune sunt * Y, =
-riteln =
afieaza + c ic ,=
end
else
-riteln + Y :u e%ist elemente comune Y,=
END.
Exemplul 4.4. &utare binar !ntr-un ir dat.
Se citete un ir cu un numr dat de componente numere reale i se introduce apoi de la
tastatur o valoare real. S se stabileasc dac valoarea dat se gsete sau nu !n ir.
Pro#ra$ cutareF.inar =
2ar
a * arra5 - /.. /777 2 o, real =
% * real =
i n margs margd 'um * inte#er =
este * .oolean =
'E(IN
-rite + > :r . elemente @ >, =
readln + n, =
-rite + > #ntroducei elementele cu spaii sau enter * >, =
________________________________________________________________________________
/1]
Structuri de date i algoritmi
_______________________________________________________________________________
,or i *@ / to n do read + a - i 2 , = readln =
-rite + > :umrul cutat @ > , =readln + % , =
i, + % @ a -/2 , or + % @ a -n2 then -riteln + > este > , =
else
.e#in
margs *@ / = margd *@ n =
A marginile st)nga P dreapta ale intervalului B
este *@ ,alse =
-hile + margd - margs E / , and not este do
.e#in
'um *@ trunc + +margs ? margd , P Q , =
A mi'locul intervalului B
i, a -'um2 @ % then este *@ true
else i, % E a -'umG then margs *@ 'um
else margd *@ 'um
end =
i, este @ true then -riteln + > este > ,
else -riteln + > nu este > ,
end =
readln =
END.
V.1.0.9.Pro.le$e 3ro3use
1. Dac o operaie de cutare ce folosete algoritmul de cutare secvenial necesit e%act ]T1 de
operaii c)t va dura operaia de cutare dac folosete algoritmul de cutare binar^
0. 5entru ce valori al lui : algoritmul de cutare binar este !n medie mai lent dec)t algoritmul de
cutare secvenial presupun)nd o cutare cu succes^
7. 5roblema Q sugereaz c ar fi mai bine s dispunem de o metod "ibrid adic s trecem de la
cutare binar la cutare secvenial !n momentul !n care intervalul rmas are o lungime mai mic
dec)t o anumit valoare 'udicios aleas. Scriei un algoritm eficient pentru o asemenea cutare i
determinai valoarea optim de comutare.
8. MistaOrdonata este un tablou de tip !ntreg cu /7 poziii. &um ar arta tabloul MistaOrdinara !n
cazul !n care ar conine urmtoare valori citite dintr-un fiier* /R Q6 0S /Q Q] S TT /S 0 00 i
elementele ar fi sortate !n ordine cresctoare^
________________________________________________________________________________
/16
Structuri de date i algoritmi
_______________________________________________________________________________
V.0. Ar.ori de cutare
V.0.1. Ar.ore .inar de cutare
V.0.1.1. Descrierea #eneral a ar.orelui .inar de cutare
#ntr-o structur de date de tip arbore de cutare informaiile sunt structurate pe nivele pe
primul nivel numit nivel 7 e%ist un singur element numit rdcin de care sunt legate mai multe
elemente numite fii care formeaz nivelul /= de acestea sunt legate elementele de pe nivelul Q
.a.m.d. +vezi figura V.1H.
9n arbore este compus din elementele numite noduri sau v&rfuri i legturile dintre acestea.
Dup cum am vzut cea mai des utilizat form de organizare a unui arbore binar este urmtoarea*
C'eia nodului fiu st&nga D C'eia nodului fiu st&nga D C'eia nodului fiu st&nga +S./,
9tiliz)nd formula de mai sus se obin arbori binari speciali utilizai pentru organizarea i
cutarea datelor numii arbori binari de cutare ()C.
9n nod situat pe un anumit nivel este nod tat pentru nodurile legate de el situate pe nivelul
urmtor acestea reprezent)nd fii si. 8rborii ca structuri de date dinamice au foarte multe aplicaii
!n informatic. Structurile arborescente sunt foarte des utilizate pentru memorarea i regsirea
rapid a unor informaii. #nformaiile sunt organizate dup un c)mp numit c"eie ales de
programator care servete la identificarea lor datelor stocate !n structura arborescent. De e%emplu
dac datele sunt datele relative la studenii unei faculti atunci c"eia poate fi aleas ca fiind
numele i prenumele studentului. &"eile trebuie alese !n aa fel !nc)t s nu apar c"ei duble. 3n
e%emplul nostru relativ la studenii unei faculti poate c ar fi mai bine s evitm posibilitatea
e%istenei unor c"ei duble acelai nume i prenume prin introducerea iniialei tatlui evit)nd astfel
c"eile duble.
9n arbore binar de cutare este un arbore ale crui noduri cuprind o singur c"eie de
identificare nodurile cu c"ei mai mici dec)t o valoare A a c"eii asociate unui anumit nod se gsesc
!n subarborele st)ng al acestui nod iar nodurile ale cror c"ei au valori mai mari dec)t A se gsesc
!n subarborele su drept.
&utarea unei informaii identificate printr-o valoare A a c"eii !ncepe de la rdcin i se
termin !n cel mai ru caz la unul din nodurile terminale cutarea presupun)nd testarea a cel mult
at)tea noduri c)te nivele are arborele binar de cutare. Dispunerea nodurilor arborelui pe nivele face
ca numrul operaiilor de testare la cutare s fie mult mai mic dec)t !n cazul listelor ordonate.
Cetoda cutrii binare prezentate !n capitolul anterior poate fi e%plicat cu uurin cu
________________________________________________________________________________
/11
Structuri de date i algoritmi
_______________________________________________________________________________
a'utorul arborilor de cutare. Figura urmtoare arat o reprezentare cu a'utorul arborilor binari al
algoritmului care corespunde cu algoritmul de cutare binar prezentat !n capitolul anterior pentru
:@/7.
#igura *.1. E/e$3lu de ar.ore .inar de cutare
V.0.1.0. I$3le$entarea unui nod al ar.orelui A'C
9n nod al unui arbore ()C are urmtoarea structur*
Fiu_st &"eia 8lte_info Fiu_dr
#igura *.2. !tructura nodului ()C.
unde*
Fiu_st * reprezint adresa fiului st)nga=
&"eia* reprezint c)mpul ales dup care este ordonat 8f& i care verific relaia +S./,=
8lte_info * alte informaii adiacente=
Fiu_dr * reprezint adresa fiului dreapta=
Structura nodului !n implementarea 5ascal este urmtoarea *
T53e
________________________________________________________________________________
/10
Structuri de date i algoritmi
_______________________________________________________________________________
8dresa @ [:od
:od @ REC&RD
Fiu_st * 8dresa=
&"eia * tipc+eia=
8lte_info * tipinfo=
Fiu_dr * 8dresa=
end
V.0.1.7. &3era4ii ntrIun ()C
Operaiile !n cazul arborilor binari de cutare sunt*
a. creare-iniializare=
b. inserare=
c. cutare=
d. tergere=
e. traversare*
Deoarece operaia de traversare a fost analizat i descris !n capitolul anterior la arbori
binari +seciunea R.S.Q, ne vom ocupa de celelalte operaii specifice arborilor binari de cutare.
a. $peraia de creare+inializare. Specificarea problemei de creareIini4iali1are av)nd ca date de
intrare ()C specificat prin adresa <OOI a nodului rdcin este urmtoarea*
D8I; root=
<;g9MI8I; root=
Descrierea algoritmului !n 5seudocod este*
8MUO<#IC9M &<;8<;_#:#h#8M#g8<; ;SI;* A Se creeaz un ()C vid B
<OOI *@ :#M=
SF8MUO<#IC
b. $peraia de inserare. Specificarea problemei de inserare av)nd ca date de intrare ()C cu
adresa nodului rdcin <OOI i datele de inserat c"eia_nou info_nou este urmtoarea*
D8I; <OOI c"eia_nou info_nou=
<;g9MI8I; <OOI=
________________________________________________________________________________
/07
Structuri de date i algoritmi
_______________________________________________________________________________
$om folosi subalgoritmul numit &reare_nod care va aloca dinamic spaiul de memorie
necesar noului nod de inserat i va completa c)mpurile nodului ()C.
$),. -.x" $om folosi !n cele ce urmeaz o referin de tip 5ascal pentru algoritmul !n 5seudocod i
anume*
adresa[.c%p
unde adresa reprezint variabila de tip adres a nodului iar c)mp reprezint numele c)mpului
nodului. Descrierea algoritmului !n 5seudocod este*
S9f8MUO<#IC9M &reare_nod +c" inf, ;SI;*
L8locare_spaiu +:O9,= A cererea de alocare spaiu pentru un nod B
:O9[.fiu_st *@ :#M= A sistemul returneaz adresa noului nod !n variabila adres :O9 B
:O9[.fiu_dr *@ :#M=
:O9[.c"eia *@ c"=
:O9[.info *@ inf=
SF-&reare_nod
8MUO<#IC9M #:S;<8<; ;SI;* A Se insereaz un nod nou ca nod terminal prima dat
se caut nodul tat B
&#I;XI; c"eia_nou info_nou=
D8&K <OOI @ :#M 8I9:&# A primul nod inserat B
&d;8CK &reare_nod +c"eia_nou info_nou,= A se aloc spaiu pentru noul nod de B
<OOI @ :O9= A inserat la adresa :O9 i se completeaz c)mpurile B
;D#I=
SFD8&K
tmp *@ <OOI=
&HII#C5 tmp JE :#M ;D;&9IK
Iata *@ tmp=
D8&K c"eia_nou J tmp[.c"eia
8I9:&# tmp *@ tmp[.fiu_st=
8MIF;M D8&K c"eia_nou E tmp[.c"eia
8I9:&# tmp *@ tmp[.fiu_dr=
8MIF;M
I#5K<;XI; +Y;<O8<; N &d;#; D9fMK,=
;D#I=
SFD8&K
SFD8&K
SF&HI
&d;8CK &reare_nod +c"eia_nou info_nou,=
D8&K c"eia_nou J tata[.c"eia
________________________________________________________________________________
/0/
Structuri de date i algoritmi
_______________________________________________________________________________
8I9:&#
tata[.fiu_st *@ :O9=
8MIF;M
tata[.fiu_dr *@ :O9=
SFD8&K
SF8MUO<#IC
c. $peraia de cutare. Specificarea problemei de cutare av)nd ca date de intrare ()C cu
adresa nodului rdcin <OOI i c"eia nodului cutat c"eia_caut este urmtoarea*
D8I; root c"eia_caut=
<;g9MI8I; adresa=
$bs. -.x." adresa returnat de algoritmul de cutare este adresa nodului cu c"eia c"eia_caut dac
acesta e%ist. Dac nodul cu c"eia c"eia_caut nu e%ist !n ()C atunci valoarea returnat va fi o
adres nul.
8MUO<#IC9M &89IK ;SI;*
&#I;XI; c"eia_caut=
tmp *@ <OOI=
&HII#C5 +tmp JE :#M, ;D;&9IK
D8&K c"eia_caut J tmp[.c"eia
8I9:&# tmp *@ tmp[.fiu_st=
8MIF;M
D8&K c"eia_caut E tmp[.c"eia
8I9:&# tmp *@ tmp[.fiu_dr=
8MIF;M Lreturneaz adresa tmp=
SFD8&K
SFD8&K
SF&HI
Lreturneaz adresa :#M=
SF8MUO<#IC
d. $peraia de tergere. Specificarea general a problemei de tergere este*

D8I; root c"eia_de_sters=
<;g9MI8I; root=
;%ist mai multe situaii posibile !n funcie de numrul de fii ai nodului de ters -Ire /01R2*
________________________________________________________________________________
/0Q
Structuri de date i algoritmi
_______________________________________________________________________________
Ca1ul 1: nodul de ters este un nod terminal deci fr fii. Operaia de tergere necesit
eliminarea legturii nod_tat i nod_de_ters i eliberarea spaiului ocupat de nodul de ters.
Exemplu" nodurile cu c"eia / R 6 /7 din ()C figura S./.

Ca1ul 0: nodul de ters este un singur fiu. Operaia de tergere necesit realizarea legturii
nod_tat i nod_de_fiu +st)nga sau dreapta, i eliberarea spaiului ocupat de nodul de ters.
Exemplu" nodurile cu c"eia T ] 0 din ()C figura S./.
Ca1ul 7: nodul de ters este doi fii. 3n aceast situaie nodul de ters trebuie !nlocuit i abia dup
aceea poate fi eliminat. :odul !nlocuitor poate fi nodul cu c"eia cea mai mare din punct de vedere
le%icografic din subarborele st)ng al nodului de ters sau nodul cu c"eia cea mai mic din
subarborele drept al nodului de ters.
Exemplu" nodurile cu c"eia Q S 1 din ()C figura S./. :odul !nlocuitor al nodului cu c"eia Q este
nodul cu c"eia / din subarborele st)ng sau nodul cu c"eia T din subarborele su drept. :odul
!nlocuitor al nodului cu c"eia S este nodul cu c"eia R din subarborele st)ng sau nodul cu c"eia ] din
subarborele su drept. :odul !nlocuitor al nodului cu c"eia 1 este nodul cu c"eia 6 din subarborele
st)ng sau nodul cu c"eia 0 din subarborele su drept.
$bs. -.x" 5entru a gsi nodul !nlocuitor al unui nod de ters !n &azul T acesta poate fi gsit astfel*
Dac nodul !nlocuitor este nodul cu c"eia cea mai mare din punct de vedere le%icografic din
subarborele st)ng al nodului de ters atunci se navig"eaz de la nodul de ters un pas la st)nga i
oric)i pai la dreapta p)n a'ungem la o legtur nul. Dac nodul !nlocuitor este nodul cu c"eia
cea mai mic din punct de vedere le%icografic din subarborele drept al nodului de ters atunci se
navig"eaz de la nodul de ters un pas la dreapta i oric)i pai la st)nga p)n a'ungem la o legtur
nul.
Descrierea general a algoritmului de tergere !n 5seudocod este*
8MUO<#IC9M XI;<U;<; ;SI;*
&#I;XI; c"eia_de_sters=
D8&K <OOI @ :#M 8I9:&#
I#5K<;XI; +Y;<O8<; N 8<fO<; $#Dc,=
;D#I=
SFD8&K
tmp *@ <OOI= A Se caut nodul de ters B
&HII#C5 +tmp JE :#M, i +c"eia_de_sters JE tmp[.c"eia, ;D;&9IK
Iata *@ tmp=
D8&K c"eia_nou J tmp[.c"eia
8I9:&# tmp *@ tmp[.fiu_st=
8MIF;M tmp *@ tmp[.fiu_dr=
SFD8&K
SF&HI
D8&8 tmp @ :#M 8I9:&#
I#5K<;XI; +Y;<O8<; N :OD9M :9 ;D#SIK 3: ()Cc,=
________________________________________________________________________________
/0T
Structuri de date i algoritmi
_______________________________________________________________________________
;D#I=
SFD8&K
D8&K tmp[.fiu_st @ :#M i tmp[.fiu_dr @ :#M 8I9:&#
&d;8CK &azul_/ +<OOI tata tmp,= A &azul / B
;D#I=
SFD8&K
D8&K tmp[.fiu_st @ :#M %or tmp[.fiu_dr @ :#M 8I9:&#
&d;8CK &azul_Q +<OOI tata tmp,= A &azul Q B
;D#I=
SFD8&K
&d;8CK &azul_T +<OOI tata tmp,= A &azul T B
SF8MUO<#IC
S9f8MUO<#IC9M &azul_/ +rad t adr, ;SI;*
D8&K t[.fiu_st @ adr 8I9:&#
t[.fiu_st *@ :#M=
8MIF;M
t[.fiu_dr *@ :#M=
L;liberare spaiu +adr,= A ;liberarea spaiului de la adresa adr B
SF-&azul_/
S9f8MUO<#IC9M &azul_Q +rad t adr, ;SI;*
D8&K t[.fiu_st @ adr 8I9:&# A :odul de ters este fiul st)nga al nodului tata B
D8&K adr[.fiu_st @ :#M 8I9:&#
t[.fiu_st *@ adr[.fiu_dr=
8MIF;M
t[.fiu_st *@ adr[.fiu_st=
8MIF;M A :odul de ters este fiul dreapta al nodului tata B
D8&K adr[.fiu_dr @ :#M 8I9:&#
t[.fiu_dr *@ adr[.fiu_st=
8MIF;M
t[.fiu_dr *@ adr[.fiu_dr=
L;liberare spaiu +adr,= A ;liberarea spaiului de la adresa adr B
SF-&azul_Q
S9f8MUO<#IC9M &azul_T +rad t adr, ;SI;*
tmp *@ adr[.fiu_st= A Se caut nodul !nlocuitor N un pas la st!ngaB
________________________________________________________________________________
/0R
Structuri de date i algoritmi
_______________________________________________________________________________
tata *@ tmp=
&HII#C5 tmp[.fiu_dr JE :#M ;D;&9IK A Oric)i pai la dreaptaB
tata *@ tmp=
tmp *@ tmp[.fiu_dr= A 8dresa tatlui nodului !nlocuitor este !n variabila tataB
SF&HI A 8dresa nodului !nlocuitor este !n variabila tmpB
adr[.c"eia *@ tmp[.c"eia= A 3nlocuim nodul de ters cu nodul !nlocuitorB
adr[.info *@ tmp[.info= A 3nlocuim nodul de ters cu nodul !nlocuitorB
tata[.fiu_dr *@ tmp[.fiu_st= A ;liminm legtura tata - nodul !nlocuitorB
L;liberare spaiu +tmp,= A ;liberarea spaiului nod !nlocuitor de la adresa tmp B
SF-&azul_T
V.0.1.8. Pro.le$e re1ol2ate
,-e%plul ..-/ 5roblema arborilor asociai e%presiilor aritmetice. Fiind date n e%presii aritmetice
sintactic corecte care cuprind paranteze operanzi notai cu literele mici din alfabet i operatori
binari sau unari din mulimea A? - a P B s se construiasc i s se afieze !n postordine arborele
binar asociat fiecrei e%presii -Dal /0112.
8rborele binar asociat e%presiei aritmetice - +a ? b,ac - d este prezentat !n figura urmtoare*




Se observ c rdcina cuprinde simbolul ultimei operaii subarborele st)ng iar nodul din
dreapta corespunde operandului drept= aceeai regul se aplic subarborilor. Operatorul 4-4 unar din
e%presie s-a transformat !n arborele binar !n 4i4 pentru a-l distinge de cel binar= nodul asociat
operatorului are numai subarbore drept + operaia este unar ,.
;%istena operatorilor 4?4 sau 4-4 unari modific numai diagrama de sinta% a e%presiei
aritmetice + vezi figura , celelalte rm)n)nd nesc"imbate.
________________________________________________________________________________
/0S
Structuri de date i algoritmi
_______________________________________________________________________________


Pro#ra$ ar.oriFasociatiFe/3resiilorFarit$etice 6
t53e
reper @[nod =
nod @ record
v * c"ar =
stg dr * reper =
end 6
2ar
rad * reper =
% * pointer =
i n * b\te =
car * c"ar =

3rocedure citire =
.e#in
i, not eoln then read+car,
end 6
3rocedure postordine + p * reper ,=
.e#in
i, p J E NI" then
.e#in
postordine +p [.stg, =
postordine +p [.dr, =
-rite+p [.v,=
end 6
end 6
3rocedure e%presie +var p * reper , = ,or-ard 6
3rocedure termen +var p * reper , = ,or-ard 6
3rocedure factor +var p * reper , =
A creeaza nodul terminal p[ sau subarborele de radacina p[ B
A asociat unei e%presii aritmetice cuprinsa !ntre +, B
.e#in
i, car @ >+> then
________________________________________________________________________________
/0]
Structuri de date i algoritmi
_______________________________________________________________________________
.e#in
citire =
e%presie +p, = A aici car @, B
end 6
else
.e#in
neW+p, =
p [.v *@ car =
p [.stg *@ NI" 6
p [.dr *@ NI" 6
end 6
citire 6
end 6

3rocedure termen =
2ar j * reper =
.e#in
factor + p , =
-hile car in - >a> >P> 2 do
.e#in
ne- + j , =
j [.v *@ car =
j [.stg *@ p =
citire = A operandul Q !ncepe dup car B
factor +j [. dr, = A creeaz si leag !n dr. nodului j [ B
p *@ j = A subarb. asociat operandului Q al lui car B
end 6
end 6
3rocedure e/3resie 6
2ar j * reper =
.e#in
i, car in - >?> >-> 2 then A e%presia !ncepe cu ? sau - B
i, car @ >-> then
.e#in A car @ - unar B
ne- + p , =
p [.v *@ >b> = A b@ - unar B
p [.stg *@ NI" 6
citire =
termen+p [.dr, =
end
else
.e#in A car @? unar B
citire =
termen + p ,=
end
________________________________________________________________________________
/06
Structuri de date i algoritmi
_______________________________________________________________________________
else termen + p , =
-hile car in - >?> >-> 2 do
.e#in
ne- + j , =
j [.v *@ car =
j [.stg *@ p =
citire =
termen + j [.dr, =
p *@ j=
end
end 6
'E(IN A programul principal B
$ar* +%, = Aretine v)rful zonei d;85 B
-rite +> n@>, = readln +n,=
,or i*@ / to n do
.e#in
read + car , =
e%presie + rad , =
postordine +rad ,=
-riteln 6
readln 6
release +%, = A elibereaz memoria ocupata dinamic B
end 6
END.
5entru n@Q vom obine rezultatul *
+a?b,a+c-d,
abc?cd-a
-a?b
abb?
V.0.0. Ar.ore .inar de cutare .alansat n nl4i$e
V.0.1.1. Descrierea #eneral a ar.orelui .alansat n nl4i$e
5rimul tip de arbore balansat este (rborele )inar de Cutare )alansat n .nlime +
()C)/. #ntr-un astfel de arbore !ncercm meninerea tuturor nodurilor frunz la aceeai distant
fa de rdcin .
________________________________________________________________________________
/01
Structuri de date i algoritmi
_______________________________________________________________________________
#n Figura V.0. este prezentat un arbore binar de cutare balansat n nlime iar !n Figura
V.7. este prezentat un arbore binar de.alansat -Ire /01R2.
Figura III.0. Figura III.7.
5entru a prevenii debalansarea arborelui asociem un indicator de balansare pentru toate
nodurile arborelui. #ndicatorul de balansare poate s conin trei valori notate astfel *
nod #reu stJn#a K L"H
nod #reu drea3ta K LRH
nod .alansat KL'H
0efiniia *.1. Nod #reu stJn#a L"H * 9n nod al unui ()C)/ se numete nod greu st)nga dac
!nlimea subarborelui su st)ng este mai mare cu / dec)t !nlimea subarborelui su drept.
0efiniia *.2. Nod #reu drea3ta LRH * 9n nod al unui ()C)/ se numete nod greu dreapta dac
!nlimea subarborelui su drept este mai mare cu / dec)t !nlimea subarborelui su st)ng.
0efiniia *.%. Nod .alansat L'H * 9n nod al unui ()C)/ se numete nod balansat dac !nlimea
subarborelui su st)ng este egal cu !nlimea subarborelui su drept.
0efiniia *.4. Nod critic LCH * 9n nod al unui ()C)/ se numete nod critic dac nu este nod greu
dreapta nod greu st)nga sau nod balansat.
3ntr-un ()C)/ fiecare nod trebuie se afle in una din aceste trei stri adic s fie nod greu
dreapta nod greu st)nga sau nod balansat.
0efiniia *.-. 9n arbore binar de cutare se numete arbore binar de cutare balansat !n !nlime
________________________________________________________________________________
/00
Structuri de date i algoritmi
_______________________________________________________________________________
()C)/ dac are doar noduri greu st)nga noduri greu dreapta sau noduri balansate.
Dac e%ist un nod care nu satisface nici una din aceste trei stri atunci arborele se numete
arbore binar debalansat.
0efiniia *.1. 9n arbore binar de cutare se numete arbore binar de cutare debalansat dac
conine cel puin un nod critic.
V.0.0.0. I$3le$entarea unui nod a ar.orelui ()C)/
9n nod al unui arbore ()C)/ are urmtoarea structur*
Fiu_st &"eia 8lte_info #f Fiu_dr
#igura *.4. !tructura nodului ()C)/.
unde*
Fiu_st * reprezint adresa fiului st)nga=
&"eia* reprezint c)mpul ales dup care este ordonat ()C)/=
8lte_info * alte informaii=
#f * indicatorul de balansare=
Fiu_dr * reprezint adresa fiului dreapta=
Structura nodului !n implementarea 5ascal este urmtoarea *
T53e
8dresa @ [:od
:od @ REC&RD
Fiu_st * 8dresa=
&"eia * tipc+eia=
8lte_info * tipinfo=
#f * c"ar=
Fiu_dr * 8dresa=
end
V.0.0.7. &3era4ii ntrIun ()C)/
Operaiile !n cazul arborilor binari de cutare balansai !n !nlime sunt aceleai ca i la
arborii binari de cutare i anume*
a. creare-iniializare=
b. inserare-balansare=
c. cutare=
________________________________________________________________________________
Q77
Structuri de date i algoritmi
_______________________________________________________________________________
d. tergere=
e. traversarea*
Operaiile creare-iniializare cutare i traversare sunt identice cu operaiile de la arborii
binari de cutare. Doar operaiile de inserare-balansare i tergere sunt specifice i vor fi detaliate !n
cele ce urmeaz.
a. $peraia de inserare. #n cazul operaiei de inserare al unui nod presupunem c inserarea se face
la nivelul unui nod terminal dup regula general de inserare de la arborii binari de cutare. :umai
la acele noduri se sc"imb indicatorul de balansare !n cazul unui astfel de !nserri care se afl pe un
drum cuprins !ntre rdcin arborelui i noul nod terminal inserat numit drum de inserare.
5osibilele sc"imbri pentru un nod aflat pe drumul de inserare sunt urmtoarele -Ire /01R2*
Cazul 1" :odul era nod greu dreapta sau nod greu st)nga i a devenit balansat.
Cazul 2" :odul era balansat i a devenit nod greu dreapta sau nod greu st)nga.
Cazul %" :odul era un nod greu iar noul nod este !nserat !n subarborele su greu cre)nd un
subarbore debalansat. 9n astfel de nod se numete nod critic.
3n cazul / !n urma operaiei de inserare indicatorul de balansare +#f, a nodurilor strmo
ale nodului de inserat aflate pe drumul de inserare rm)n nesc"imbate cu e%cepia noului tat.
8cest e%emplu este prezentat !n Figura $.S. 3n acest e%emplu nodul inserat este nodul cu c"eia T.
3n cazul Q dup cum se vede i !n Figura $.] indicatorii de balansare +#f, a nodurilor
strmo situate pe drumul de inserare se pot modifica. 3n acest e%emplu nodul de inserat este nodul
cu c"eia R.
3n &azul T !n urma unei operaii de inserare arborele devine debalansat i se creeaz noduri
critice. 3n Figura $.6 este prezentat un astfel de e%emplu aprut !n urma inserrii nodului cu c"eia
R* nodul cu c"eia S se transform !n nod critic iar arborele binar devine debalansat.
________________________________________________________________________________
Q7/
Structuri de date i algoritmi
_______________________________________________________________________________
+i#ura V.9.Ca1ul 1. +i#ura V.:. Ca1ul 0.
Figura V.;. Ca1ul 7.
Operaia de inserare poate duce la crearea unor noduri critice deci la debalansarea arborelui.
5entru a putea pstra caracteristica de 8f&f# este necesar efectuarea unei operaii specifice
numit rebalansare a arborelui care s duc la eliminarea nodurilor critice i la transformarea lor !n
noduri greu dreapta greu st)nga sau balansat.
Sunt dou cazuri de rebalansare care se divid fiecare !n dou subcazuri corespunztoare
direciei grele st)nga sau dreapta care a dus la apariia nodului critic -Ire /11R2.
Ca1ul 1: 2ebalansare prin rotaie simpl. 8cest caz apare c)nd operaia de inserare s-a fcut pe
direcia grea a nodului care a devenit critic. &ele dou sub cazuri sunt*
Ca1ul 1.a.: 2ebalansare prin rotaie simpl la dreapta. 8cest caz apare c)nd operaia de inserare s-
a fcut pe direcia grea st)ng a nodului care a devenit critic.
Ca1ul 1...: 2ebalansare prin rotaie simpl la st&nga. 8cest caz apare c)nd operaia de inserare
s-a fcut pe direcia grea dreapta a nodului care a devenit critic.

O reprezentare a cazului /.a este !n +i#ura V.<.% unde T1 T0 i T7 reprezint subarbori iar
NE) reprezint noul nod de inserat. ;%presia din partea de 'os a dreptung"iurilor reprezint
!nlimea subarborilor !nainte i dup inserare.
De e%emplu !n +i#ura V.<. +a./, presupunem c !n urma unei operaii de inserare nodul A%
din nod #reu stJn#a% a devenit critic. 8tunci arborele binar devine debalansat. 5roblema se rezolv
dac (rotim la dreapta arborele !n 'urul nodului nodul M% +i#ura V.<. +a.Q,.
________________________________________________________________________________
Q7Q
Structuri de date i algoritmi
_______________________________________________________________________________

#igura *.3. E/e$3lu de solu4ionare a de.alansrii ar.orelui .inar% 3rin rota4ie si$3l la
drea3ta n Curul nodului M.
#igura *.4. E/e$3lu de solu4ionare a de.alansrii ar.orelui .inar% 3rin rota4ie si$3l la
stJn#a n Curul nodului M.
De e%emplu !n +i#ura V.<. +b.Q, presupunem c !n urma unei operaii de inserare nodul A%
din nod #reu drea3ta% a devenit critic. 8tunci arborele binar devine debalansat. 5roblema se
rezolv dac (rotim la st)nga arborele !n 'urul nodului nodul M% +i#ura V.<. +b./,.
Ca1ul 0: 2ebalansare prin rotaie dubl. 8cest caz apare c)nd operaia de inserare s-a fcut pe
direcia opus direciei grele a nodului care a devenit critic. &ele dou subcazuri sunt*
Ca1ul 0.a.: 2ebalansare prin rotaie dubl la dreapta. 8cest caz apare c)nd operaia de inserare s-
a fcut pe direcia opus direciei grele st)ng a nodului care a devenit critic.
Ca1ul 0...: 2ebalansare prin rotaie dubl la st&nga. 8cest caz apare c)nd operaia de inserare s-a
fcut pe direcia opus direciei grele dreapta a nodului care a devenit critic.
&azul doi care este reprezentat !n +i#ura V.= i +i#ura V.1>.% este asemntor cu primul
caz cu e%cepia c nodul M devine nod greu !n direcia opus !n care nodul A era nod greu. ;ste
clar c nodul N trebuie balansat prioritar fa de inserare .
________________________________________________________________________________
Q7T
Structuri de date i algoritmi
_______________________________________________________________________________
#igura *.15. E/e$3lu de solu4ionare a de.alansrii ar.orelui .inar% 3rin rota4ie du.l la
stJn#a n Curul nodului N.

________________________________________________________________________________
Q7R
Structuri de date i algoritmi
_______________________________________________________________________________
#igura *.11. E/e$3lu de solu4ionare a de.alansrii ar.orelui .inar% 3rin rota4ie du.l la
drea3ta n Curul nodului N.
Specificarea problemei de inserare av)nd ca date de intrare <OOI c"eia_nou info_nou
este urmtoarea*
D8I; root c"eia_nou info_nou=
<;g9MI8I; root=
Descrierea algoritmului !n 5seudocod este*
8MUO<#IC9M #:S;<8<; ;SI;* A Se insereaz un nod nou i dac este cazul se
rebalanseaz arborele B
&#I;XI; c"eia_nou info_nou=
D8&K Leste primul nod inserat 8I9:&#
&d;8CK &reare_nod +c"eia_nou info_nou,=
;D#I=
SFD8&K
D8&K Lnu este c"eie dubl 8I9:&#
Lataeaz noul nod !n arbore=
8MIF;M
I#5K<;XI; Y;roare - &"eie dublac=
;D#I=
SFD8&K
Lcaut un nod debalansat.
Lcalculeaz #f +indicatorii de balansare,.
Lcaut un nod debalansat.
D8&K Lnu e%ist nod critic 8I9:&#
;D#I=
SFD8&K
D8&K Lnodul era balansat i a devenit greu sau nodul era greu i a devenit balansat
8I9:&# Lcalculeaz #f +indicatorii de balansare,=
;D#I=
SFD8&K
Lrebalanseaz arborele=
SF8MUO<#IC
b. $peraia de tergere. Specificarea general a problemei de tergere este*

D8I; root c"eia_de_sters=
<;g9MI8I; root=
________________________________________________________________________________
Q7S
Structuri de date i algoritmi
_______________________________________________________________________________
Descrierea general a algoritmului de tergere !n 5seudocod este*
OCaut nodul marcat pentru tergere cu c"eia c"eia_de_sters
DAC Lnodul cu c"eia c"eia_de_sters are doi fii
ATUNCI Lcaut succesorul +inordine, nodului cu c"eia c"eia_de_sters
L?ter#e succesorul +inordine , nodului cu c"eia c"eia_de_sters
Lschi$. nodul marcat pentru tergere cu succesorul +inordine ,
A"T+E" L?ter#e nodul marcat i sc"imb cu fiul +dac e%ist ,
!+DAC
LRe.alansea1 arborele pe drumul de cutare.
V.0.0.8. Pro.le$e re1ol2ate
Exemplul *.1" #mplementarea 58S&8M a operaiilor efectuate !ntr-un ()C)/* creare-iniializare
inserare cutare tergere traversare.
Pro#ra$ operaii 8f&f#=
t53e
adresa @ [nod =
nod @ record
lptr rptr * adresa = Alptr rptr* pointeri ctre subarborele st)ng respectiv dreptB
Ge\ * integer =
end 6
2ar
root tata nou temp nodp * adresa =
c bi/ * c"ar =
s * integer =
Procedure creare + 2ar cap * adresa , =
.e#in
cap *@ nil =
end 6
Procedure inserare + 2ar cap * adresa = c"eia * integer , =
2ar curent * adresa = A procedura care insereaz un nod nou B
.e#in
curent *@ cap =
tata *@ cap =
-hile curent JE nil do
i, curent[.Ge\ J c"eia then .e#in
tata *@ curent =
curent *@ curent[.rptr =
end
________________________________________________________________________________
Q7]
Structuri de date i algoritmi
_______________________________________________________________________________
else
i, curent[.Ge\ E c"eia then .e#in
tata *@ curent =
curent *@ curent[.lptr =
end
else .e#in
-riteln + > &"eie dubl V> , =
readln 6
e/it 6
end 6
ne- + nou , =
nou[.Ge\ *@ c"eia =
nou[.lptr *@ nil =
nou[.rptr *@ nil =
i, cap @ nil then .e#in
cap *@ nou =
e/it 6
end=
i, c"eia J tata[.Ge\ then tata[.lptr *@ nou
else tata[.rptr *@ nou =
balansinalt =
end6
Procedure caut +root * adresa = c" * integer , =
'e#in
A procedura care caut un anumit nod B
temp *@ root = tata *@ root =
-hile +c" JE temp[.Ge\ , and + temp JE nil , do
.e#in
tata *@ temp =
i, temp[.Ge\ J c" then temp *@ temp[.rptr
else temp *@ temp[.lptr =
end 6
end 6
Procedure sterg = A procedura de tergere a unui nod B
2ar fiu predec tatap * adresa =
.e#in
i, + temp[.lptr @ nil , and + temp[.rptr @ nil , then Anodul de ters nu
are nici un fiuB
i, temp[.Ge\ J tata[.Ge\ then
.e#in
tata[.lptr *@ nil =
dis3ose + temp , =
end
________________________________________________________________________________
Q76
Structuri de date i algoritmi
_______________________________________________________________________________
else .e#in
tata[.rptr *@ nil =
dis3ose + temp , =
end
else i, + temp[.lptr @ nil , /or + temp[.rptr @ nil , then
A nodul de ters are un singur fiu B
.e#in
i, temp[.lptr @ nil then fiu *@ temp[.rptr
else fiu *@ temp[.lptr =
i, temp[.Ge\ J tata[.Ge\ then tata[.lptr *@ fiu
else tata[.rptr *@ fiu =
dis3ose + temp , =
end
else .e#in
predec *@ temp[.lptr = tatap *@ predec =
-hile predec[.rptr JE nil do
.e#in
tatap *@ predec = predec *@ predec[.rptr =
end 6
temp[.Ge\ *@ predec[.Ge\ =
i, predec[.lptr JE nil then .e#in
tatap[.rptr *@ predec[.lptr =
dis3ose + predec , =
end 6
i, predec @ tatap then .e#in
temp[.lptr *@ nil =
dis3ose + predec , =
end 6
end 6
end 6
Procedure terge + rdcina * adresa = c"eias * integer , =
.e#in
cauta + rdcina c"eias , =
i, temp JE nil then .e#in
-rite + > Sterg elementul cu c"eia > c"eias > ... > , =
sterg =
-riteln + > O.V > , =
end
else .e#in
-riteln + > &"eie ine%istenta V > , = e/it 6
end 6
end 6
Procedure inordine + def * adresa , = A traversare inordine B
.e#in
________________________________________________________________________________
Q71
Structuri de date i algoritmi
_______________________________________________________________________________
i, def JE nil then
.e#in
inordine + def[.lptr , =
-rite + def[.Ge\ * T , =
inordine + def[.rptr , =
end 6
end 6
Procedure preordine + def * adresa , = A traversare preordine B
.e#in
i, def JE nil then
.e#in
-rite + def[.Ge\ * T , =
preordine + def[.lptr , =
preordine + def[.rptr , =
end 6
end 6
Procedure postordine + def * adresa , = A traversare postordine B
.e#in
i, def JE nil then
.e#in
postordine + def[.lptr , =
postordine+def[.rptr,=
-rite + def[.Ge\ * T , =
end 6
end 6
Procedure meniu =
.e#in
re3eat
clrscr =
-riteln + > Optiuni * &-&reare > , =
-riteln + > #-#nserare > , =
-riteln + > S-Xtergere > , =
-riteln + > I-Iraversare-:-#nordine > , =
-riteln + > I-Iraversare-5-5reordine > , =
-riteln + > I-Iraversare-O-5ostordine > , =
-riteln + > ;S&-#eire > , =
c *@ read*e5 =
case u3case + c , o,
> & > * .e#in
-riteln 6 -riteln + >a &<;8<; a> * /S , = -riteln =
-rite + >&reez rdcina...> , =
creare + root , = -riteln + > O.V > , =
read*e5 =
________________________________________________________________________________
Q70
Structuri de date i algoritmi
_______________________________________________________________________________
end =
> # > * .e#in
-riteln = Writeln+ > a #:S;<8<; a > * /S , = -riteln 6 -riteln 6
-rite + > &"eia * > , 6 readln+ s , = -riteln =
insere + root s , =
end 6
> S > * .e#in
-riteln = -riteln +> aXI;<U;<; a > * /S , = -riteln =
-rite + > &"eia elementului pt. sters* > , =
readln + s , = sterge + root s , =
end 6
> I > * .e#in
-riteln 6 -riteln + > a I<8$;<S8<; a > * /S , = -riteln =
-rite + > Optiunea* > , 6 readln+c, =
i, root[.Ge\ @ 7 then
.e#in
-riteln = -riteln + > 8rbore vid V > * /S , =
c *@ > > =
end 6 -riteln 6
case u3case + c , o,
> : > * .e#in
-rite + > #nordine* > , =
inordine + root , =
read*e5 6
end =
> 5 > * .e#in
-rite + > 5reordine* > , =
preordine + root , =
read*e5 =
end 6
> O > * .e#in
-rite + > 5ostordine* > , =
postordine + root , =
read*e5 6
end 6
else -riteln + > 8i apsat o tast gresit V > , =
end 6
end 6
end 6
until c @ Z Q6 =
end 6
'E(IN
meniu =
END.
________________________________________________________________________________
Q/7
Structuri de date i algoritmi
_______________________________________________________________________________
V.0.0.9. Per,or$an4ele al#orit$ilor n A'C'I
5erformana algoritmului ce corespunde operaiei de inserare !n arborele binar balansat !n
!nlime cu n noduri este de ordinul O+/.Sa log
Q
+n?/,, -.nu /06]2.
5erformana algoritmului ce corespunde operaiei de cutare este identic cu performana
algoritmului de cutare a arborilor binari de cutare adic este de ordinul O+log
Q
n,.
3n referina -Ire /01R2 se arat c performana algoritmului ce corespunde operaiei de
tergere este de ordinul O+log
Q
n,.
V.0.7. Ar.ore .inar de cutare .alansat n #reutate
V.0.7.1. Descrierea #eneral a ar.orelui .alansat n #reutate
8m vzut !n $./././ +S.R, faptul c organizarea datelor influeneaz semnificativ
performanele algoritmilor de cutare. &oncluzia modului de organizare a datelor conform cu +S.R,
este evident* dac datele nu sunt ec"iprobabil cutate atunci datele cele mai cutate sau cu
probabilitatea de cutare cea mai mare trebuie s se gseasc la !nceputul drumului de cutare. Ma
un arbore binar de cutare procesul de cutare !ncepe !ntotdeauna de la nodul rdcin. 8vem atunci
stabilit urmtorul el* dac datele organizate sub forma unei structuri de tip arbore binar de cutare
sunt ec"iprobabile au aceeai probabilitate de cutare atunci arborii binari de cutare balansai !n
!nlime sunt structura cea mai potrivit. Dac !ns datele organizate sub forma unui arbore binar
de cutare nu sunt ec"iprobabile avem nevoie de o alt structur arborescent binar de cutare
care s dispun !n arbore datele cele mai cutate c)t mai aproape de !nceputul drumului de cutare
adic de rdcin.
#ntroducem astfel o nou structur de date arborescent i anume arborele binar de
cutare balansat n greutate ()C)6! a crei regul de organizare poate fi formulat astfel* cele
mai des cutate noduri se afl c)t mai aproape de rdcin .
Dac probabilitatea de cutare a unei date particulare este necunoscut putem s folosim
formula +S.Q, ca un raport dintre numrul de accesri a unei asemenea date i numrul total de
accesri al structurii de date arborescente. 8ceast probabilitate de cutare poate fi meninut
dinamic dac avem gri' s incrementm la fiecare acces al unei date variabila corespunztoare
numrului de accesri al acelei date precum i numrul total de accesri a structurii de date
arborescente.
<ezult firesc c fiecare nod al unui astfel de ()C)6 are nevoie de un c%p supli%entar
de infor%a0ie i anume numrul de c)te ori a fost accesat acea informaie i pe care o vom numi
greutatea nodului respectiv.
________________________________________________________________________________
Q//
Structuri de date i algoritmi
_______________________________________________________________________________
&.s.: #n orice arbore +subarbore, nodul rdcin este cel mai greu nod.
8rborele prezentat !n figura de mai 'os este o structur de date de tip ()C)6. Se observ
c !n primul r)nd avem un 8f& deoarece le%icografic avem respectat regula de organizare a
arborilor binari de cutare. De asemenea se observ c nodurile cele mai grele se gsesc la
!nceputul drumului de cutare adic c)t mai aproape de nodul rdcin -Ire /11R2..
#igura *.12. E/e$3lu de ar.ore .inar de cutare T
1
.alansat n #reutate ()C)6.
<egula de plasare al unui nod !n arborele binar de cutare balansat !n greutate poate fi
e%primat !n mod recursiv dup urmtoarea regul -8"o /0162 *
/. :odul rdcin al oricrui arbore +subarbore, este nodul cu cea mai mare greutate din
mulimea de noduri care constituie arborele +subarborele,=
Q. Subarborele st)ng al oricrui arbore +subarborelui, este compus din noduri a cror
valoare le%ical este mai mic dec)t nodul rdcin=
T. Subarborele drept al oricrui arbore +subarborelui este compus din noduri a cror valoare
le%ical este mai mare dec)t nodul rdcin.
3n cazul arborelui binar de cutare balansat !n greutate la fiecare operaie de inserare sau la
o orice operaie de accesare a unui anumit nod greutatea nodului este incrementat cu /. Dac se
insereaz un nod nou !n arbore acesta va fi poziionat conform cu regulile generale de inserare de la
arborii binari de cutare ca i nod terminal greutatea nodului fiind iniializat cu /.
S considerm !n continuare acelai arbore binar de cutare dar care s nu mai fie balansat
!n greutate.
________________________________________________________________________________
Q/Q
Structuri de date i algoritmi
_______________________________________________________________________________
#igura *.1%. E/e$3lu de ar.ore .inar T
0
de cutare de.alansat n #reutate.
S comparm performanele algoritmilor de cutare !n cei doi arbori de cutare I/ +balansat
!n greutate, i IQ +debalansat !n greutate,*
T] . Q R
QS
R
T
QS
/
T
QS
Q
T
QS
R
Q
QS
T
Q
QS
S
/
QS
]
/
+ + + + + +
)
ALOS
S] . Q T
QS
/
T
QS
]
T
QS
S
T
QS
R
Q
QS
T
Q
QS
R
/
QS
Q
Q
+ + + + + +
)
ALOS
Se observ clar c arborele binar de cutare balansat !n greutate are performane de cutare
mai bune dec)t un arbore binar de cutare. &u c)t structura de date arborescent este mai mare ca
dimensiuni diferenele de performan se accentueaz !n favoarea ()C)6.
V.0.7.0. I$3le$entarea unui nod al ar.orelui A'C'(
9n nod al unui ()C)6 are urmtoarea structur*
Fiu_st &"eia 8lte_info Ureutate Fiu_dr
#igura *.14. !tructura nodului ()C)6.
unde*
Fiu_st * reprezint adresa fiului st)nga=
&"eia* reprezint c)mpul ales dup care este ordonat ()C)6=
________________________________________________________________________________
Q/T
Structuri de date i algoritmi
_______________________________________________________________________________
8lte_info* alte informaii=
Ureutate* greutatea nodului reprezentat prin numrul de accesri ale nodului=
Fiu_dr* reprezint adresa fiului dreapta=
Structura nodului !n implementarea 5ascal este urmtoarea *
T53e
8dresa @ [:od
:od @ REC&RD
Fiu_st * 8dresa=
&"eia * tipc+eia=
8lte_info * tipinfo=
Ureutate * b\te=
Fiu_dr * 8dresa=
end
V.0.7.7. &3era4ii ntrIun ()C)6
Operaiile !n cazul arborilor binari de cutare balansai !n greutate sunt aceleai ca i la
arborii binari de cutare i anume*
a. creare-iniializare=
b. inserare-balansare=
c. cutare=
d. tergere=
e. traversarea*
Operaiile creare-iniializare inserare i traversare sunt identice cu operaiile de la arborii
binari de cutare. Doar operaiile de cutare i tergere sunt specifice i vor fi detaliate !n cele ce
urmeaz. Operaia de cutare poate modifica greutatea unui nod i debalansa arborele.
c. $peraia de cutare.
falansarea unui 8f&fU este ilustrat !n Figura $./S -Ire /11R2..
________________________________________________________________________________
Q/R
Structuri de date i algoritmi
_______________________________________________________________________________
#igura *.1-. &3era4ia de .alansare a unui A'C'(. Pn ,i#ura V.19.a% 3resu3une$ c n
ur$a unei accesri a nodului QC&PI"R% #reutatea acestuia de2ine $ai $are decJt
#reutatea nodului QPARINTER% deci ar.orele de2ine de.alansat n #reutate. Pn ,i#ura
V.19..% se 3re1int strate#ia de .alansare.
$bs.*.2" $om presupunem e%istenta unei stive care este folosit pentru a memora drumul de
cutare de la nodul rdcin p)n la nodul cutat. 8ceast stiv va fi necesar pentru operaia de
tergere.
________________________________________________________________________________
Q/S
Structuri de date i algoritmi
_______________________________________________________________________________
Specificarea problemei de inserare av)nd ca date de intrare c"eia_caut info_nou este
urmtoarea*
D8I; root c"eia_caut info_nou=
<;g9MI8I; root=
Descrierea algoritmului !n 5seudocod este*
8MUO<#IC9M #:S;<8<; ;SI;* A Se insereaz un nod nou i dac este cazul se
rebalanseaz arborele B
&#I;XI; c"eia_caut info_nou=
OCaut nodul cu c"eia c"eia_caut i memoreaz drumul de cutare !n stiv=
D8&K Onodul cutat este gsit
8I9:&# Oincrementeaz greutatea cu /
Obalanseaz arborele +dac este nevoie ,
8MIF;M I#5K<;XI; cutare fr succes
SFD8&K
SF8MUO<#IC
#mplementarea algoritmului de cutare !n 5ascal este*
+unction cutare +rad * adresa = c"eia_caut * c"ar , * adresa =
.e#in
temp *@ rad =
tata *@ rad =
reset +st ind , = A reset +stind, iniializeaz stiva B
-hile + temp JE nil , and + temp[.Ge\ JE c"eia_caut, do
.e#in
i, c"eia_caut J temp[.Ge\ then
.e#in
tata *@ temp=
3ush +st ind tata ,= Aprocedura 3ush introduce !n stiva B
temp *@ temp[.lptr = Astrmoii nodului cutat B
end
else
.e#in
tata *@ temp =
3ush + st ind tata , =
temp *@ temp[.rptr =
end 6
end =
i, temp[.Ge\ @ c"eia_caut then
________________________________________________________________________________
Q/]
Structuri de date i algoritmi
_______________________________________________________________________________
.e#in
inc + temp[.Weig"t , =
-riteln + > &utare cu succes N #nformaia e%ist > , =
cautare *@ temp =
rebalansare + temp tata , = A rebalanseaz arborele dac este necesar B
e/it =
end
else
.e#in
cautare *@ nil =
-riteln + > &utare cu insucces N #nformaia nu e%ist > , =
end =
end =
d. $peraia de tergere.
3n cazul operaiei de tergere al unui nod avem R cazuri care trebuie e%aminate -Ire /11R2..
Ca1ul 1. :odul de ters este un nod frunz. #n acest caz tergerea este simpl tergem legtura care
leag nodul frunz de nodul printe.
Ca1ul 0. :odul este un nod neterminal care nu are subarbore drept i nodul de ters este un nod fiu
st)nga. 3n acest caz fiul st)ng al nodului printe va deveni egal cu fiul st)ng al nodului marcat
pentru tergere. 8ceeai rezolvare pentru cazul simetric.
Ca1ul 7. :odul este un nod neterminal care nu are subarbore st)ng i nodul de ters este un nod
fiu st)nga. 3n acest caz fiul st)ng al nodului printe va deveni egal cu fiul drept al nodului marcat
pentru tergere. 8ceeai rezolvare pentru cazul simetric.
Ca1ul 8. :odul este nod neterminal cu ambii subarbori nenuli. #n acest caz tergerea direct a
nodului ar duce la debalansarea arborelui. 5entru a nu debalansa arborele se va !nlocui nodul de
ters cu un nod urma i anume cu acela care are cea mai mare greutate. 3n urma aplicrii acestei
!nlocuiri ne vom regsi !ntr-una din regulile e%primate prin &azurile /QT sau R. <epetm regula
/Q T sau R p)n c)nd se poate terge nodul dorit
Specificarea general a problemei de tergere este*

D8I; root c"eia_de_sters=
<;g9MI8I; root=
Descrierea general a algoritmului recursiv de tergere !n 5seudocod este*
________________________________________________________________________________
Q/6
Structuri de date i algoritmi
_______________________________________________________________________________
S9f8MUO<#IC9M sterge +radacina c"eia_s, ;SI;*
D8&K Lnodul de sters cu c"eia_s este nod terminal sau are un subarbore vid
8I9:&# Lterge nodul A &azurile / Q T B
8MIF;M Lintersc"imb nodul de ters cu nodul urma cel mai greu
A &azul R B
SFD8&K
&d;8CK sterge +radacina c"eia_s,=
SF-sterge
V.0.7.8. Pro.le$e re1ol2ate
Exemplul *.2" #mplementarea 58S&8M a operaiilor efectuate !ntr-un ()C)6* creare-iniializare
inserare cutare tergere traversare.
program ()C)6=
const ma%@/77=
t53e adresa @ [nod=
nod @ record
lptr * adresa =
Ge\ * c"ar =
info * string-T72 =
rptr * adresa =
Weig"t * Word =
end =
str @ string-T72 =
stiva @ arra\-7..ma%2 of adresa =
top @ 7..ma% =
2ar
tata temp copil root rad * adresa =
c" * c"ar =
student * nod =
i n * integer =
st * stiva =
ind * top =
Procedure reset +st*stiva = 2ar indic*top , = Ainiializeaz stiva B
.e#in
indic *@ 7 =
end =
+unction fullstacG+indic*top, * boolean = A stiv plin ^B
.e#in
i, indic @ ma% then fullstacG *@ true
else fullstacG *@ ,alse =
________________________________________________________________________________
Q/1
Structuri de date i algoritmi
_______________________________________________________________________________
end =
+unction empt\stacG + indic*top , * boolean = A stiv goal ^B
.e#in
i, indic@7 then empt\stacG* @ true
else empt\stacG *@ ,alse =
end =
Procedure pus" +2ar st*stiva = 2ar indic*top = elem*adresa , =
A depune elemente !n stiv B
.e#in
i, not fullstacG +indic, then
.e#in
st-indic2 *@ elem =
indic *@ indic?/ =
end
else
.e#in -riteln +>stacG overfloW>, =
e/it =
end6
end=
+unction 3o3 +st*stiva=var indic*top, * adresa =
A scoate elementele din stiv B
.e#in
i, not empt\stacG +indic, then
.e#in
indic *@ indic-/ =
pop *@ st -indic2 =
end
else
.e#in -riteln +>stacG underfloW>, =
e/it =
end =
end =
Procedure creare +rad * adresa, = A creare rdcin vidB
.e#in
rad*@nil=
end6
Procedure inserare +2ar rad * adresa = c"eia * c"ar , = A inserarea elementelor B
2ar
curent nou * adresa =
.e#in
i, rad @ nil then .e#in A i!nserare !n cazul c)nd arborele este vid B
ne-+nou, =
________________________________________________________________________________
Q/0
Structuri de date i algoritmi
_______________________________________________________________________________
nou[.Ge\ *@ c"eia =
nou[.Weig"t *@ 7 =
nou[.lptr *@ nil =
nou[.rptr *@ nil =
rad *@ nou =
end
else .e#in A inserare !n cazul c)nd arborele nu este vid B
curent *@ rad = tata *@ curent =
-hile curent JE nil do
i, c"eia J curent[.Ge\ then A inserarea fiului st)ng al nodului curent B
.e#in
tata *@ curent =
curent *@ curent[.lptr =
end
else i, c"eia E curent[.Ge\ then A inserarea fiului drept al nodului curent B
.e#in
tata *@ curent =
curent *@ curent[.rptr =
end
else .e#in
-riteln + >c"eie dubl*eroare>, =
e/it =
end =
ne- +nou, = Ainserarea propriuzis i actualizarea c)mpurilor B
nou[.Ge\ *@ c"eia =
nou[.Weig"t *@ 7 =
nou[.lptr *@ nil =
nou[.rptr *@ nil =
i, tata[.Ge\ E c"eia then tata[.lptr *@ nou
else tata[.rptr *@ nou =
end =
end =
Procedure rebalansare +temp * adresa = var tata * adresa, = Arebalansarea arboreluiB
2ar
bunic t * adresa =
.e#in
i, temp[.Weig"t J@ tata[.Weig"t then e/it
else i, +tata @ root, then A intersc"imbarea nodului rdcin B
i, temp[.Ge\ J tata[.Ge\ then
.e#in
tata[.lptr *@ temp[.rptr =
temp[.rptr *@ tata =
root *@ temp =
e/it =
end
________________________________________________________________________________
QQ7
Structuri de date i algoritmi
_______________________________________________________________________________
else
.e#in
tata[.rptr *@ temp[.lptr =
temp[.lptr *@ tata =
root *@ temp =
e/it 6
end
else
t *@ pop +stind, =
bunic *@ pop +stind, =
i, tata[.Ge\ J bunic[.Ge\ then
i, temp[.Ge\Jtata[.Ge\ then
.e#in
bunic[.lptr *@ temp =
tata[.lptr *@ temp[.rptr =
temp[.rptr *@ tata =
end
else
.e#in
bunic[.lptr*@temp=
tata[.rptr*@temp[.lptr=
temp[.lptr*@tata=
end
else
i, temp[.Ge\Jtata[.Ge\ then
.e#in
bunic[.rptr*@temp=
tata[.lptr*@temp[.rptr=
temp[.rptr*@tata=
end
else
.e#in
bunic[.rptr*@temp=
tata[.rptr*@temp[.lptr=
temp[.lptr*@tata=
end6
pus" +stindbunic, =
tata*@bunic =
rebalansare +temptata, =
end 6
+unction cautare + rad * adresa = c"eiac * c"ar , * adresa =
.e#in
temp *@ rad = tata *@ rad = reset +stind, =
-hile +temp JE nil, and +temp[.Ge\ JE c"eiac, do
.e#in
________________________________________________________________________________
QQ/
Structuri de date i algoritmi
_______________________________________________________________________________
i, c"eiacJtemp[.Ge\ then .e#in A se caut !n subarborele st)ng B
tata*@temp=
pus"+stindtata,=
temp*@temp[.lptr=
end
else .e#in A se caut in subarborele drept B
tata*@temp=
pus"+stindtata,=
temp*@temp[.rptr=
end6
end6
i, temp[.Ge\@c"eiac then .e#in inc+temp[.Weig"t,= A c"eia este gsit B
-riteln+>;%ista>,=
cautare*@temp=
rebalansare+temptata,=
e/it6
end
else
.e#in
cautare*@nil=
-riteln+>:u e%ist>,=
end=
end=
Procedure sterg=
2ar fiu predec tatap * adresa =
.e#in
i, +temp[.lptr@nil, and +temp[.rptr@nil, then Atergerea unui nod terminalN&azul/B
if temp[.Ge\Jtata[.Ge\ t"en begin
tata[.lptr*@nil=
dispose+temp,=
end
else .e#in
tata[.rptr*@nil=
dispose+temp,=
end
else
i, +temp[.lptr @ nil, A&R +temp[.rptr @ nil, then A tergerea unui nod cu un B .e#in
A singur fiu N &azul Q T B
i, temp[.lptrJEnil then fiu*@temp[.lptr
else fiu*@temp[.rptr=
i, temp[.Ge\Jtata[.Ge\ then .e#in
tata[.lptr*@fiu=
dispose+temp,=
end
else .e#in
________________________________________________________________________________
QQQ
Structuri de date i algoritmi
_______________________________________________________________________________
tata[.rptr*@fiu=
dispose+temp,=
end6
end
else .e#in Atergerea unui nod cu doi fii N &azul RB
predec*@temp=
tatap*@predec=
predec*@temp[.lptr=
-hile predec[.rptrJEnil do .e#in
tatap*@predec=
predec*@predec[.rptr=
end6
temp[.Ge\*@predec[.Ge\=
temp[.info*@predec[.info=
i, predec[.lptrJEnil then tatap[.lptr*@predec[.lptr
else tatap[.lptr*@nil=
dispose+predec,=
end6
end=

Procedure stergere + 2ar rad * adresa = c"eias * c"ar ,=
.e#in
temp*@cautare+rootc"eias,=
i, tempJEnil t"en sterg
else .e#in
-riteln+>eroare-element ine%istent>,=
e/it6
end6
end6
Procedure preordine +2ar rad * adresa, = A traversarea !n preordine a arboreluiB
.e#in
i, radJEnil then
.e#in
-riteln +rad[.Ge\ > * > rad[.Weig"t, =
preordine +rad[.lptr, =
preordine +rad[.rptr, =
end =
end =
Procedure menu =
.e#in
-rite +>/-#nserare Q-&utare T-8fiare R-Xtergere >,=
-rite+>S-#eire>,=
end=
.e#in
________________________________________________________________________________
QQT
Structuri de date i algoritmi
_______________________________________________________________________________
menu=
creare+root,=
re3eat
c" *@ read*e5=
case c" o,
>/>*.e#in
-riteln6
-rite+>introducei c"eia*>,=
readln+student.Ge\,=
inserare+rootstudent.Ge\,=
end6
>Q>*.e#in
-riteln6
-rite+>introducei c"eia cutat*>,=
readln+student.Ge\,=
cautare+rootstudent.Ge\,=
end6
>T>*.e#in
-riteln+>traversare preordine*>,=
preordine+root,=
end6
>R>*.e#in
-riteln6
-rite+>introducei c"eia de sters*>,=
readln+student.Ge\,=
stergere+rootstudent.Ge\,=
end6
end6
until c"@>S>=
end.
V.0.8. Ar.ori de cutare 0I7.
V.0.8.1. Descrierea #eneral a ar.orelui de cutare 0I7
9n alt tip de arbore de cutare este arborele de cutare 2+% (C2+%. 9n arbore Q-T este
definit ca un arbore de cutare !n care nodurile non+frunz LneterminaleH au Q sau T fii i toate
________________________________________________________________________________
QQR
Structuri de date i algoritmi
_______________________________________________________________________________
nodurile frunz LterminaleH au aceeai distan fa de nodul rdcin.
$bservaie" 9n arbore care are un singur nod +nod frunz, este considerat a fi tot (C2+%. ;vident
arborii de cutare Q-T nu sunt arbori binari dei algoritmul de cutare este pe undeva asemntor
algoritmului de cutare binar.
+i#ura V.//. ne prezint un e%emplu de arbore Q-T av)nd inserate S date cu c"eile de
cutare / T ] 6 //. &elelalte noduri non-frunz sunt noduri pentru cutare.
+i#ura V.//. E/e$3lu de ar.ore de cutare 0I7.
3ntr-un (C2+% numai nodurile frunz conin date propriu-zise celelalte noduri +nodurile
non-frunz, sunt noduri au%iliare de cutare.
9n nod non-frunz va fi denumit nod auxiliar de cutare. 9n astfel de nod au%iliar de
cutare va conine dou valori corespunztoare limitei inferioare respectiv limitei superioare a
drumului de cutare -8"o /0162.
Mimita inferioar a unui nod au%iliar de cutare reprezint cea mai mare c"eie de cutare din
subarborele st)ng. Mimita superioar a unui nod au%iliar de cutare reprezint cea mai mare c"eie de
cutare din subarborele mi'lociu.
$bservaie" &)nd un nod non-frunz +neterminal, are doar doi fii atunci se consider c fiul lips
este fiul din dreapta.
3n cazul operaiilor de cutare c"eia de cutare este comparat cu cele dou valori limit ale
nodurilor au%iliare de cutare*
Dac c"eia de cutare este mai mic sau egal cu limita inferioar de cutare atunci
cutarea se face pe legtura fiu7st&nga.
Dac c"eia de cutare este strict mai mare dec)t limita inferioar de cutare dar mai mic
sau egal dec)t limita superioar de cutare atunci cutarea se face pe legtura fiu7mi8loc.
8ltfel dac c"eia de cutare este mai mare dec)t limita superioar de cutare i dac e%ist
legtura fiu7dreapta atunci cutarea se face pe legtura fiu7dreapta altfel cutarea se face
pe legtura fiu7mi8loc .
________________________________________________________________________________
QQS
Structuri de date i algoritmi
_______________________________________________________________________________
V.0.8.0. I$3le$entarea nodurilor AC0I7
Dup cum am vzut un (C2+% conine dou tipuri de noduri*
a. 9od auxiliar de cutare :non+frunz; *
fiu1s
t
a b tip fiu1%i
j
fiu1s
t
9nde*
fiu_st * reprezint adresa fiului st)nga=
a* limita inferioar a drumului de cutare=
b* limita superioar a drumului de cutare=
tip* tipul nodului nod au%iliar de cutare +non-frunz, tip @ / nod de date +frunz, tip @ /=
fiu_mi' * reprezint adresa fiului din mi'loc=
fiu_dr * reprezint adresa fiului dreapta=
b. 9od de date :frunz; *
tip c"eia 8lte_info
9nde*
tip* tipul nodului nod au%iliar de cutare +non-frunz, tip @ / nod de date +frunz, tip @ /=
c"eia* reprezint c)mpul de date ales dup care este ordonat (C2+%=
8lte_info* alte informaii=
Structura nodului implementat !n 5ascal este*
T53e
Iip_nod @+frunza non-frunza,=
adresa @ [.:od
:od @ record
case tag *Iip_nod o,
frunza* +c"eia * inte#er=
8lte_info * tip1info,=
________________________________________________________________________________
QQ]
Structuri de date i algoritmi
_______________________________________________________________________________
non-frunza* + Fiu_stg * adresa=
a * inte#er=
b * inte#er=
fiu_mi' * adresa=
fiu_dr * adresa=

end
V.0.8.7. &3era4ii ntrIun (C2+%
Operaiile !n cazul arborilor de cutare Q-T sunt urmtoarele*
a. creare-iniializare=
b. inserare=
c. cutare=
d. tergere=
e. traversarea*
Operaia de creare-iniializare este identic cu operaiile de la arborii binari de cutare.
<estul operaiilor sunt specifice arborelui de cutare Q-T i vor fi detaliate !n cele ce urmeaz.
b. $peraia de inserare.
;%ist patru cazuri de analizat pentru operaia de inserare -Ire /11R2.. 8cestea sunt*
Ca1ul 1. Arborele este 2id. 3n acest caz alocm spaiu pentru noul nod frunz de inserat i acesta va
deveni noul nod rdcin.
;%emplu* 3n figura $.%% a se insereaz nodul cu c"eia R.
Ca1ul 0. 8rborele conine un singur nod +acesta coincide cu nodul rdcin,. 3n acest caz se creeaz
un nou nod non-frunz care va deveni noul nod rdcin vec"iul nod rdcin i noul nod de
inserat vor deveni fii nodului au%iliar de cutare.
;%emplu* 3n figura $.%% b se insereaz nodul cu c"eia 0 !n (C2+% din figura $.%%.a.
________________________________________________________________________________
QQ6
Structuri de date i algoritmi
_______________________________________________________________________________
&elelalte dou cazuri apar !n situaia !n care (C2+% conine mai mult de un nod. <egula !n
aceast situaie este urmtoarea* prima dat se determin locul unde ar urma s fie inserat noul nod
dup care este determinat nodul tat% av)nd gri' ca s memorm drumul de cutare.
Ca1ul 7. Nodul tat are e%act doi fii. #nserm noul nod la !n poziia determinat de comparaia
c"eilor de cutare.
Dac valoarea c"eii de inserat este mai mic dec)t valoarea c"eii nodului fiu st)nga atunci noul nod
de inserat va deveni fiul st)ng al nodului tat= dac valoarea c"eii nodului de inserat este mai mare
dec)t c"eia nodului fiu mi'loc atunci noul nod de inserat va deveni nodul fiu dreapta al nodului
tat= altfel noul nod de inserat va deveni nodul fiu mi'loc al nodului tat. 8ceast !nserare este
prezentat !n +i#ura III.11. .
;%emplu* 3n figura $.%% b se insereaz nodul cu c"eia 0 !n (C2+% din figura $.%%.a.
Ca1ul 8. :odul tat are trei fii. #n acest caz noul nod de inserat ar deveni al patrulea fiu al nodului
tat. $om crea un nou nod non-frunz nod frate cu nodul tat. 5oziia nodului nod frate este
determinat de poziia i dispunerea nodurilor fiu. &ele patru noduri fii vor fi separate astfel* cei doi
frai din st)nga i cei doi frai din dreapta vor fi ataai nodului tat iniial i nodului unc"i nou
creat.
;%emplu* 3n figura $.%% se insereaz nodul cu c"eia 0 !n (C2+% din figura $.%%.a.
#igura *.xx. Ca1ul 1 de inserare LaH ?i ca1ul 0 de inserare L.H.
________________________________________________________________________________
QQ1
Structuri de date i algoritmi
_______________________________________________________________________________
#igura *.xx. Ca1ul 7 de inserare. Pn AC0I7 din stJn#a se inserea1 un nou nod cu cheia ;.
#igura *.xx. Ca1ul 8 de inserare. Pn AC0I7 din stJn#a se inserea1 un nou nod cu cheia ;.
Specificarea problemei de inserare av)nd ca date de intrare <OOI c"eia_nou info_nou
este urmtoarea*
D8I; root c"eia_nou info_nou=
<;g9MI8I; root=
________________________________________________________________________________
QQ0
Structuri de date i algoritmi
_______________________________________________________________________________
Descrierea algoritmului de inserare !n 5seudocod este*
8MUO<#IC9M #:S;<8<; ;SI;* A Se insereaz un nod nou B
&#I;XI; c"eia_nou info_nou=
D8&K <OOI @ :#M 8I9:&# A &azul / de inserare B
&d;8CK &reare_nod_frunza +c"eia_nou info_nou,=
;D#I=
SFD8&K
D8&K <OOI[.tip @ / 8I9:&# A &azul Q de inserare B
&d;8CK &reare_nod_frunza +c"eia_nou info_nou,= Aadresa noului nod @ nou B
&d;8CK &reare_nod_nonfrunza +nou c"eia_nou info_nou,= Aadresa noului nod @
tataB
D8&K <OOI[.c"eia J c"eia_nou 8I9:&#
tata[.a *@ <OOI[.c"eia=
tata[.b *@ c"eia_nou=
tata[.fiu_st *@ <OOI=
tata[.fiu_mi' *@ nou=
tata[.fiu_dr *@ :#M=
8MIF;M
D8&K <OOI[.c"eia E c"eia_nou 8I9:&#
tata[.a *@ c"eia_nou=
tata[.b *@ <OOI[.c"eia=
tata[.fiu_st *@ nou=
tata[.fiu_mi' *@ <OOI=
tata[.fiu_dr *@ :#M=
8MIF;M
I#5K<;XI; + ;<O8<; N c"eie dubl ,
SFD8&K
SFD8&K
<OOI *@ tata =
;D#I=
SFD8&K
Imp *@ <OOI = A &azul T sau R de inserare B
&HII#C5 tmp[.tip JE 7 ;D;&9IK A &utm nodul tatB
D8&K c"eia_nou J tmp[.a 8I9:&#
5us"+stiva top tmp,=
tmp *@ tmp[.fiu_st=
8MIF;M
5us"+stiva top tmp,=
tmp *@ tmp[.fiu_mi'l=
SF&HI A 8dresa nodului tat este !n v)rful stiveiB
tata *@ pop+stiva top,=
Dac tata[.fiu_dr *@ :#M
&d;8CK &azul_T_inserare +<OOI tata c"eia_nou info_nou,=
________________________________________________________________________________
QT7
Structuri de date i algoritmi
_______________________________________________________________________________
8MIF;M
&d;8CK &azul_R_inserare +<OOI tata stiva top c"eia_nou info_nou,=
SF8MUO<#IC
Subalgoritmul &azul_T_inserare este simplu de rezolvat. Se aloc spaiu pentru noul nod de
inserat se compar c"eia nodului de inserat c"eia_nou cu limita inferioar tata[.a i limita
superioar tata[.b a nodului printe inser)ndu-se !n una din poziiile fiu_st fiu_mi' fiu_dr. Se
actualizeaz corespunztor c)mpurile nodului de inserat i c)mpurile nodului tat.
Subalgorimul &azul_R_inserare poate fi sc"iat astfel !n 5seudocod astfel*
S9f8MUO<#IC9M &azul_R_inserare +rad t st virf c"_n info_n, ;SI;*
L &reeaz un nou nod non-frunz unc"i frate pentru nodul tat=
L Distribuie cei R fii !ntre nodul tat i noul nod unc"i=
L 8ctualizeaz limita inferioar a limita superioar b i legturile fiu_dr fiu_mi' fiu_st=
D8&K Lnodul printe nu are strmoi 8I9:&#
Lcreeaz un nou nod rdcin=
Lleag nodul printe de noul nod rdcin ca fiu st)nga=
Lleag noul nod unc"i de noul nod rdcin ca fiu dreapta=
Lactualizeaz c)mpurile noului nod rdcin
;D#I
8MIF;M Le%trage din stiva nodul tat al nodului tat= Anodul bunicB
Ldetermin poziia de inserare al nodului unc"i=
D8&K Lnodul bunic are numai doi fii 8I9:&#
Linsereaz nodul unc"i al nodului tat=
Lactualizeaz c)mpurile nodului unc"i=
;D#I
8MIF;M &d;8CK &azul_R_inserare +rad bunic st virf c"_n info_n,=
SFD8&K
SFD8&K
SF-&azul_/
c. $peraia de cutare.
Specificarea problemei de cutare av)nd ca date de intrare <OOI i c"eia_caut este
urmtoarea*
D8I; root c"eia_caut=
<;g9MI8I; root=
________________________________________________________________________________
QT/
Structuri de date i algoritmi
_______________________________________________________________________________
Descrierea algoritmului de inserare !n 5seudocod este*
8MUO<#IC9M &K9I8<; ;SI;*
&#I;XI; c"eia_caut=
tmp *@ <OOI = A 5)n c)nd se a'unge la un nod terminal B
&HII#C5 tmp[.tip JE 7 ;D;&9IK
D8&K c"eia_caut J tmp[.a 8I9:&#
tmp *@ tmp[.fiu_st=
8MIF;M
D8&K + tmp[.a J c"eia_caut , i + c"eia_caut J tmp[.b , 8I9:&#
tmp *@ tmp[.fiu_mi'l=
8MIF;M D8&K tmp[.fiu_dr JE :#M 8I9:&#
tmp *@ tmp[.fiu_dr=
8MF;M
I#5K<;XI; + Y;<O8<; N c"eia cutat nu e%istc ,
Lreturneaz :#M=
SFD8&K
SFD8&K
SFD8&K
SF&HI A 8dresa nodului tat este !n v)rful stiveiB
Dac tmp[.c"eia @ c"eia_caut 8I9:&#
Lreturneaz adresa nodului gsit=
8MIF;M
Lreturneaz :#M=
SFD8&K
SF8MUO<#IC
d. $peraia de tergere.
Specificarea problemei de tergere av)nd ca date de intrare <OOI i c"eia_terg este
urmtoarea*
D8I; root c"eia_terg=
<;g9MI8I; root=
8lgoritmul de tergere presupune !ntr-o prim faz gsirea nodului de ters i a nodului tat
al nodului de ters dac acesta e%ist. Dac am gsit nodul de ters atunci va trebui s analizm !n
care din cazurile de mai 'os ne situm*
Dac arborele conine un singur nod frunz atunci algoritmul de tergere este trivial*
o Se actualizeaz adresa nodului rdcin care devine :#M=
o Se elibereaz spaiul de memorie ocupat de nodul de ters.
________________________________________________________________________________
QTQ
Structuri de date i algoritmi
_______________________________________________________________________________
Dac nodul tat al nodului de ters are T fii algoritmul de tergere este urmtorul*
o Se actualizeaz c)mpurile nodului tat=
o Se elibereaz spaiul de memorie ocupat de nodul de ters.
Dac nodul tat al nodului de ters are Q fii algoritmul de tergere este urmtorul*
o :odul frate rmas al nodului de ters se leag de un nod unc"i=
o Dac nodul unc"i avea Q fii !n urma alipirii nodului va avea T fii=
o Dac nodul unc"i avea T fii !n urma alipirii nodului va avea R fii deci va trebui s
facem*
$om crea un nou nod non-frunz nod frate cu nodul tat. 5oziia nodului nod
frate este determinat de poziia i dispunerea nodurilor fiu=
&ele patru noduri fii vor fi separate astfel* cei doi frai din st)nga i cei doi
frai din dreapta vor fi ataai nodului tat iniial i nodului unc"i nou creat.
Descrierea detaliat a algoritmului de tergere poate fi gsit !n referina bibliografic -8"o
/0162.
e. $peraia de traversare.
Spre deosebire de arborii binari de cutare la arborii de cutare Q-T datele propriu-zise se
gsesc pe acelai nivel sub forma de noduri terminale. De aceea traversarea 8&Q-T este mai
special necesit)nd un test suplimentar corespunztor deciziei dac avem de-a face cu un nod
terminal sau nu.
Ma fel ca la arborii de cutare seciunea R.S.Q cele trei modaliti de traversare difer prin
momentul !n care se viziteaz nodul rdcina i anume !n cazul*
preordine* se viziteaz !nt)i rdcina apoi subarborele st)ng subarborele din mi'loc i
dup aceea subarborele drept dac e%ist=
inordine* se viziteaz subarborele st)ng se viziteaz rdcina subarborele din mi'loc i
subarborele drept dac e%ist sau se viziteaz subarborele st)ng subarborele din mi'loc
se viziteaz rdcina i subarborele drept dac e%ist=
postordine* se viziteaz subarborele st)ng subarborele din mi'loc subarborele drept
dac e%ist i rdcina.
Descrierea algoritmilor de traversare !n limba'ul 5ascal este*
Procedure inordine_Q_T + def * adresa , = A traversare inordine B
.e#in
i, def JE NI" then
.e#in
inordine_Q_T + def[.fiu_st , =
________________________________________________________________________________
QTT
Structuri de date i algoritmi
_______________________________________________________________________________
i, def[.tip E > then
-rite + def[.c"eia * T , =
inordine_Q_T + def[.fiu_mi' , =
inordine_Q_T + def[.fiu_dr , =
end 6
end 6
Procedure preordine_Q_T + def * adresa , = A traversare preordine B
.e#in
i, def JE NI" then
.e#in
i, def[.tip E > then
-rite + def[.c"eia * T , =
preordine_Q_T + def[.fiu_st , =
preordine_Q_T + def[.fiu_mi' , =
preordine_Q_T + def[.fiu_dr , =
end 6
end 6
Procedure postordine_Q_T + def * adresa , = A traversare postordine B
.e#in
i, def JE NI" then
.e#in
postordine_Q_T + def[.fiu_st , =
postordine_Q_T +def[.fiu_mi',=
postordine_Q_T + def[.fiu_dr , =
i, def[.tip E > then
-rite + def[.c"eia * T , =
end 6
end 6
V.0.8.8. Per,or$an4ele al#orit$ilor n AC0I7
Dac un (C2+% are !nlimea + atunci numrul de noduri frunz este cuprins !ntre Q
+
i T
+
-Sed /0072. 8ceasta !nseamn c !nlimea unui (C2+% cu n noduri este cel mult log
Q
n adic
algoritmul de cutare este direct proporional cu O+log
Q
n,.
V.0.8.8. Pro.le$e re1ol2ate
________________________________________________________________________________
QTR
Structuri de date i algoritmi
_______________________________________________________________________________
Exemplul *.x" #mplementarea 58S&8M a operaiilor efectuate !ntr-un (C2+%* creare-iniializare
inserare cutare.
Pro#ra$ 8rbori_Q_T=
Const ma%@/77=
T53e
str/R @ string -/R2 =
tip_nod @ +terminalneterminal,=
adresa @[nod =
nod @ record
case tag * tip_nod of
neterminal * +lGe\ * integer =
lptr * adresa =
mGe\ * integer =
mptr * adresa =
rptr * adresa = , =
terminal * +Ge\ * integer , =
end 6
top @ 7..ma%=
stiva @ arra\ -/..ma%2 of adresa=
VAR "eadtata*adresa=
SI8&.*stiva=
D#<*arra\ -/..ma%2 of c"ar=
topdir valoare nr *integer=
ind * top =
pnou * adresa =
succes * boolean =
c *c"ar =
Procedure reset_stacG = A iniializare stiv B
.e#in
ind *@ 7 =
end 6
+unction empt\_stacG + ind*top , * boolean = A stiv goal B
.e#in
i, ind @ 7 t"en
empt\_stacG *@ true
else
empt\_stacG *@ ,alse =
end 6
________________________________________________________________________________
QTS
Structuri de date i algoritmi
_______________________________________________________________________________
+unction full_stacG + ind * top , * boolean = A stiv plin B
.e#in
i, ind @ ma% then
full_stacG *@ true
else
full_stacG *@ ,alse
end 6
Procedure pus" + var st * stiva = var ind * top = var element * adresa , =
A introducere !n stiv B
.e#in
i, not full_stacG + ind , then
.e#in
st - ind 2 *@ element=
ind *@ ind?/=
end
else
.e#in
-riteln + > stacG oWerfloW > , =
e/it 6
end
end 6
+unction pop + var st * stiva = var ind*top, * adresa = A scoatere din stiv B
.e#in
i, not empt\_stacG + ind , then
.e#in
ind *@ ind-/ =
pop *@ st - ind 2 =
end
else
-riteln + > stacG underfloW > , =
e/it 6
end 6
+unction inform + b*adresa , * integer = A funcia returneaz valoarea c"eii B
.e#in
i, b[.tag @ terminal t"en inform *@ b[.Ge\
else i, b[.rptr JE nil t"en inform *@ inform + b[.rptr ,
else inform *@ inform +b[.mptr, =
end 6

Procedure #nserare_arbore + nr*integer , =
Procedure #nsert_caz/ + %*integer , = A rdcina @ nil B
2ar j * adresa=
________________________________________________________________________________
QT]
Structuri de date i algoritmi
_______________________________________________________________________________
.e#in
ne- +j ,= A aloc memorie noului nod B
j[.tag *@ terminal =
j[.Ge\ *@ % =
"ead *@ j =
succes *@ true =
end 6
Procedure #nsert_cazQ + %*integer , = A arborele conine un singur nod B
2ar jrtemp * adresa =
.e#in
temp *@ "ead =
ne- + j , = j[.tag *@ neterminal =
i, temp[.Ge\ J % then .e#in
j[.lGe\ *@ temp[.Ge\ = j[.lptr *@ temp =
neW+r, = r[.tag *@ terminal = r[.Ge\ *@ % =
j[.mptr *@ r = j[.mGe\ *@ % =
end
else .e#in
ne-+r, = r[.tag *@ terminal = r[.Ge\ *@ % =
j[.lGe\ *@ % = j[.lptr *@ r =
j[.mGe\ *@ temp[.Ge\ = j[.mptr *@ temp =
end 6
j[.rptr *@ nil =
"ead *@ j =
succes *@ true =
end6
Procedure #nsert_cazT = A nodul tat are doi copiiB
2ar jtemp/tempQ * adresa=
.e#in
i, +nr JE p[.lGe\ , and + nrJEp[.mGe\ , then
.e#in
ne- + j , =
j[.tag *@ terminal =
j[.Ge\ *@ nr =
temp/ *@ p[.lptr =
tempQ*@p[.mptr=
i, nr J temp/[.Ge\
then .e#in
p[.lGe\ *@ nr =
p[.lptr *@ j =
p[.mGe\ *@ temp/[.Ge\ =
p[.mptr *@ temp/ =
p[.rptr *@ tempQ =
end
else i, +temp/[.Ge\ Jnr, and +nr J tempQ[.Ge\,
________________________________________________________________________________
QT6
Structuri de date i algoritmi
_______________________________________________________________________________
then .e#in
p[.mGe\ *@ nr =
p[.mptr *@ j =
p[.rptr *@ tempQ =
end
else p[.rptr *@ j =
succes *@ true =
end 6
end 6
Procedure &aut_tata =
.e#in
p *@ "ead =
5us" +stacGindp, =
-hile p[.lptr[.tag @ neterminal do .e#in
i, nr J@ p[.lGe\ then .e#in
p *@ p[.lptr =
5us" +stacGindp, =
end
else i, nr J@ p[.mGe\ then .e#in
p *@ p[.mptr =
5us" +stacGindp, =
end
else i, p[.rptr JE nil then .e#in
p *@ p[.rptr=
5us" +stacGindp,=
end
else .e#in
p *@ p[.mptr =
5us" +stacGindp,=
end 6
end
end6

Procedure #nsert_cazR +nodnou*adresa,= Anodul tat are T copii B
2ar tatafratetemp/tempQtempTneW"ead*adresa=
.e#in
tata *@ 5O5+stacGind,=
temp/ *@ tata[.lptr =
tempQ *@ tata[.mptr =
tempT *@ tata[.rptr =
i, + tempT @ nil ,
then
.e#in
i, nr J@ inform+temp/,
________________________________________________________________________________
QT1
Structuri de date i algoritmi
_______________________________________________________________________________
then
.e#in
tata[.lGe\ *@ nr =
tata[.lptr *@ nodnou =
tata[.mGe\ *@ inform+temp/,=
tata[.mptr *@ temp/=
tata[.rptr *@ tempQ=
end
else i, nr J@ inform +tempQ,
then .e#in
tata[.mGe\ *@ nr=
tata[.mptr *@ nodnou =
tata[.rptr *@ tempQ =
end
else .e#in
tata[.rptr *@ nodnou =
end 6
end
else
.e#in
ne- +frate, = frate[.tag*@neterminal=
i, nr J inform +temp/,
then
.e#in
tata[.lGe\ *@ nr=
tata[.lptr *@ nodnou=
tata[.mGe\ *@ inform+temp/,=
tata[.mptr *@ temp/=
tata[.rptr *@ nil=
frate[.lGe\ *@ inform+tempQ,=
frate[.lptr *@ tempQ=
frate[.mGe\ *@ inform+tempT,=
frate[.mptr *@ tempT=
frate[.rptr *@ nil=
end
else i, nr J inform+tempQ,
then
.e#in
tata[.mGe\ *@ nr=
tata[.mptr *@ nodnou=
tata[.rptr *@ nil=
frate[.lGe\ *@ inform+tempQ,=
frate[.lptr *@ tempQ=
frate[.mGe\ *@ inform+tempT,=
frate[.mptr *@ tempT=
frate[.rptr *@ nil=
________________________________________________________________________________
QT0
Structuri de date i algoritmi
_______________________________________________________________________________
end
else i, nr J inform+tempT,
then
.e#in
tata[.rptr *@ nil=
frate[.lGe\ *@ nr =
frate[.lptr *@ nodnou =
frate[.mGe\ *@ inform+tempT, =
frate[.mptr *@ tempT =
frate[.rptr *@ nil =
end
else .e#in
tata[.rptr *@ nil =
frate[.lGe\ *@ inform+tempT, =
frate[.lptr *@ tempT =
frate[.mGe\*@ nr =
frate[.mptr *@ nodnou =
frate[.rptr *@ nil =
end 6
i, tata@"ead then .e#in
ne- +neW"ead, =
neW"ead[.tag *@ neterminal =
neW"ead[.lGe\ *@ inform+tata, =
neW"ead[.lptr *@ tata =
neW"ead[.mGe\ *@ inform+frate, =
neW"ead[.mptr *@ frate =
neW"ead[.rptr *@ nil =
"ead *@ neW"ead =
end
else #nsert_cazR+frate, =
end 6
end 6
.e#in
i, "ead @ nil then #nsert_caz/+nr,
else i, "ead[.tag @ terminal then .e#in
i, "ead[.Ge\ JE nr then #nsert_cazQ+nr,
end
else .e#in
caut_tata =
i, p[.rptr @ nil t"en #nsert_cazT
else .e#in
i, + nr JE p[.lGe\, and +nrJEp[.mGe\, and
+nrJEp[.rptr[.Ge\, then
.e#in
________________________________________________________________________________
QR7
Structuri de date i algoritmi
_______________________________________________________________________________
ne-+nou, = nou[.tag *@ terminal =
nou[.Ge\ *@ nr =
#nsert_cazR+nou, =
succes *@ true =
end 6
end 6
end 6
i, succes then .e#in
-riteln + > O. V > , =
#ndicator =
end
else -riteln+ > ;roare V &"eie dubla V > , =
end6
Procedure #nserare =
.e#in
-riteln =
-rite+ > #ntroduce informaia* > , =
readln +valoare, =
succes *@ false =
resetFstac* =
#nserare_arbore+valoare, =
end 6
+unction caut+p*adresa=%*integer, * adresa = ,or-ard =
Procedure &utare =
2ar numar*integer=
adr * adresa =
.e#in
-rite+>&"eia de cutare* >,=
readln+numar,=
adr*@caut+"eadnumr,=
i, adr@nil
then .e#in
-riteln+>;lement ine%istent V>,=
readln6
end
else .e#in
-riteln+>&utare cu succes V>,=
-riteln+>:umrul* >adr[.Ge\,=
readln6
end6
________________________________________________________________________________
QR/
Structuri de date i algoritmi
_______________________________________________________________________________
end6
+unction caut+p*adresa=%*integer,*adresa=
.e#in
i, p[.tag @terminal
then i, p[.Ge\@%
then caut*@p
else caut*@nil
else i, % J@ p[.lGe\
then caut*@caut+p[.lptr%,
else i, +% E p[.lGe\, and +% J@ p[.mGe\,
then caut*@caut+p[.mptr%,
else i, p[.rptrJEnil
then caut*@caut+p[.rptr%,
else caut*@nil=
end6
.e#in
clrscr=
-riteln+>/ - inserare Q - cutare esc - iesire>,=
"ead*@nil=
re3eat
c*@read*e5=
case c o,
>/>*.e#in
#nserare=
end6
>Q> *.e#in
&utare=
end6
end6
until c@ZQ6=
end.
V.0.8.9. Pro.le$e 3ro3use
/. S se considere un arbore binar care cuprinde strmoii unei persoane a crei nume figureaz !n
rdcin arborelui. :odul care figureaz !n st)nga cuprinde numele tatlui iar cel din dreapta pe cel
al mamei. Fiind dat numele unei persoane oarecare din familie s se afieze numele bunicilor dac
acetia figureaz in arbore.
________________________________________________________________________________
QRQ
Structuri de date i algoritmi
_______________________________________________________________________________
Q. <eprezentai grafic arborele binar construit printr-o serie de inserri pentru urmtorul ir de c"ei*
1 /6 /7 /S S Q /] /0 /T / R //.
T. Dup ce n elemente au fost !nserate !ntr-un arbore !ntr-o ordine aleatoare care este numrul
mediu de comparaii necesare pentru a gsii al % N lea cel mai mare numr ^
R. Demonstrai ca un (C2+% de !nlime + conine un numr de noduri terminale cuprins !ntre
+ +
i T Q
.
S. Formulai un algoritm specific care terge i rebalanseaz un arbore binar balansat !n greutate .
]. Formulai un algoritm care s modifice un nod particular !ntr-un ()C)6. 8pelul algoritmului s
fie de forma*
S&d#CfK + &d;#; U<;9I8I;_:O9K ,
unde &d;#; este c"eia nodului care se modific i U<;9I8I;_:O9K este noua greutatea a
nodului.
Observaie * U<;9I8I; _:O9K poate s aib o valoare care poate cauza plasarea nodului la un
nivel superior sau inferior !n arbore.
V.7. +unc4ii de cutare hash
V.7.1. Introducere
________________________________________________________________________________
QRT
Structuri de date i algoritmi
_______________________________________________________________________________
&ea mai bun metod de cutare studiat p)n acuma este cutarea binar care are timpul
de cutare proporional cu O+log
Q
n,. Ie"nicile de cutare discutate p)n acum se bazeaz e%clusiv
pe co%pararea c+eilor.
O alt abordare posibil ar fi calculul direct al locaiei sau adresei unei date cutate. ;vident
c !ntr-un astfel de scenariu avem nevoie de o funcie special care s transforme informaia
corespunztoare c"eii de cutare !ntr-o adres unde s regsim informaia cutat. ;%presia de
calcul este !n mod natural dependent de mulimea c'eilor de cutare i de spaiul de memorie
cerut de structura de date care va stoca informaiile dorite. De e%emplu dac utilizm o alocare
static cu a'utorul unui tabel pentru a !nregistra date referitoare la cei n studeni a unei specializri
atunci fiecare student poate fi identificat printr-un numr av)nd valoare !ntre / si n. Dac
cunoatem locaia a-i-a a studentului cutat atunci scrierea student-i2 va reprezenta accesul direct
la datele studentului cutat. O astfel de relaie c+eie2adres$ e%ist rareori !n aplicaii reale deoarece
!n general c"eile de cutare sunt alese fr a se ine seama de o astfel de consecinele implementrii
!ntr-un limba' de programare a relaiei c+eie2adres$.
Din punct de vedere matematic aceasta problem de transformare a c"eii !ntr-o adresa este
definit ca o funcie! numit funcie 'as' 3 care face maparea spaiului de c'ei ! !ntr-un spaiu
de adrese A. Funcia "as" trebuie s genereze o adres pe baza unui calcul simplu aritmetic sau
logic efectuat asupra c"eii !n totalitate sau asupra unei pri din c"eie.
Datorit faptului c dimensiunea spaiului de c"ei este de obicei mai mare dec)t
dimensiunea spaiului de adrese se poate !nt)mpla ca mai multor c"ei de cutare s le corespund
prin intermediul funciei "as" o aceeai adres. ;ste evident implicaia pentru funcia de "as" de a
nu avea proprietatea de in'ectivitate adic*
( ) ( )
Q / Q / Q /
( 3 ( 3 ( ( ! ( ! ( +S.%,
8cest fenomen se numete coliziune !ntre !nregistrrile memorate !n structura de date.
5entru a rezolva aceast problem este nevoie s analizm te'nici de rezolvare a coliziunilor s
construim algoritmi corespunztori care s ne permit manipularea informaiilor stocate !n structura
de date.
Funciile "as" se grupeaz !n dou mari clase*
+unc4ii hash inde3endenteIdistri.u4ional6
+unc4ii hash de3endenteIdistri.u4ional.
&lasa de funcii "as" independente-distribuional nu folosete distribuia c"eilor unei tabele
pentru calculul adresei unei !nregistrri.
&lasa de funcii "as" dependente-distribuional se folosete de distribuia unor c"ei din
punct de vedere probabilistic pentru calculul adresei unei !nregistrri.
S vedem !n continuare c)teva e%emple de funcii "as" dup care vom analiza operaiile i
algoritmii corespunztori manipulrii !nregistrrilor !ntr-o structur de date precum i modaliti de
a rezolva problema coliziunilor.
________________________________________________________________________________
QRR
Structuri de date i algoritmi
_______________________________________________________________________________
V.7.0. +unc4ii hash
$om e%amina o serie de funcii "as" simple. Dou dintre proprietile funciilor "as" sunt
importante i anume*
2ite1a $are de calcul a adresei=
distri.u4ia uni,or$ a adreselor.
3nainte de a trece la descrierea funciilor "as" s introducem conceptul de codificare a
c'eilor de cutare numit uneori precondiionare. &odificarea c"eilor de cutare se refer la spaiul
de c"ei ! care de cele mai multe ori este o mulime alfanu%eric$ care nu permite aplicarea
funciilor "as" care sunt funcii numerice. De aceea avem nevoie de codificare care face o
transformare a mulimii c"eilor de cutare alfanumerice !ntr-o mulime numeric care poate fi
manipulat mai uor i care poate fi argumentul funciilor "as" numerice -.nu /06]2.
&el mai des folosit e%emplu de codificare se bazeaz pe utilizarea codurilor A!CII sau
E'CDIC% !nlocuind semnificaia alfanumeric a unui caracter cu codul su numeric corespunztor.
De e%emplu putem folosi !n locul caracterului alfanumeric Y8c numrul !ntreg // care corespunde
codului su 8S&##.
O problem care poate apare datorit procesului de codificare este dimensiunea prea mare a
c"eii numerice obinut prin procesul de codificare. 5resupun)nd ca dimensiunea c"eii de cutare
este de /7 caractere alfanumerice codificarea ar transforma c"eia de cutare alfanumeric !ntr-o
c"eie de cutare numeric de ordinul miilor de mii de miliarde date care nu pot fi reprezentate !n
memoria calculatorului util)nd metode clasice. De aceea avem nevoie de o operaie pe care o vom
numi scalare! care s transforme intervalul -ab2 !ntr-un interval -cd2. Operaia de scalare se
bazeaz pe o transformare liniar de forma
[ ] [ ] ( ) + - - f d c b a f *
unde coeficienii 4 i 5 ai
transformrii liniare se determin din sistemul*
( )
( )

'

d b f
c a f
+S.%,
V.7.0.1. +unc4ia hash I $etoda $3r4irii
9na dintre cele mai utilizate funcii "as" este cea bazat pe metoda mpririi. 8ceasta este
definit !n felul urmtor*
( ) / mod * + % - - 3 A ! 3
+S.%,
unde % este un divizor !ntreg nenul iar operatorul $od este operatorul %odulo adic restul
!mpririi lui % la m. 8dresele generate de aceast funcie "as" vor fi /QT _ m.
________________________________________________________________________________
QRS
Structuri de date i algoritmi
_______________________________________________________________________________
Funcia "as" bazat metoda !mpririi asigur p)n la o anumit limit o distribuie
uniform a mulimii adreselor generate. 8ceast distribuie uniform prezint !ns dezavanta'ul
producerii de coliziuni pentru c"eile de cutare din aceeai clas de ec"ivalent %odulo m.
V.7.0.0. +unc4ia hash I $etoda 3tratului $ediu
O alt funcie "as" care este folosit !n multe aplicaii se bazeaz pe metoda ptratului
mediu. #n aceast metod c+eia de c$utare este ridicat la ptrat iar adresa unde va fi cutat
!nregistrarea este obinut prin alegerea unui numr de cifre sau bii din mi'locul numrului obinut
prin ridicare la ptrat. :umrul de cifre ales este dependent de dimensiunea structurii de date care
stoc"eaz !nregistrrile cutate.
De e%emplu s considerm o c"eie din ase cifre* /QT.RS]. <idicm la ptrat i rezult
numrul /S.QR1.7<T.0T]. Dac avem nevoie de o adres format din trei numere atunci putem alege
poziiile din mi'loc de la 9 la ; deci adresa va fi 17<.
V.7.0.7. +unc4ia hash I $etoda ndoirii
5entru funcia "as" bazat pe metoda ndoirii% numrul corespunz)nd c"eii de cutare este
divizat !n numere de lungime egal cu dimensiunea spaiului de adresare cu o posibil e%cepie
corespunz)nd ultimei pri care se poate completa cu zerouri nesemnificative pentru a avea aceeai
dimensiune cu celelalte diviziuni. 8ceste pri sunt !nsumate este ignorat cifra carr6 rezultatul
adunrii form)nd adresa dorit.
&.ser2a4ie* Dac c"eia este binar vom folosi operaia logic DO< !n locul operaiei de
adunare.
E/e$3lu* &"eia de cutare TS].0RQ.61/ este !mprit !n trei numere de c)te trei cifre pentru a
forma o adres de trei cifre deoarece spaiul de stocare necesit cel mult 000 de locaii de memorie.
&ele trei numere obinute sunt TS] 0RQ si 61/. 8dunate obinem*
TS] ?
0RQ renunm la cifra Q de transfer i avem adresa 760.
61/
--------
Q760
V.7.0.8. +unc4ia hash I $etoda ci,relor
________________________________________________________________________________
QR]
Structuri de date i algoritmi
_______________________________________________________________________________
Funcia "as" bazat pe metoda cifrelor formeaz adrese prin selectarea i translatarea cifrelor
din c"eia de cutare original.
E/e$3lu* O c"eie de cutare ce are valoarea numeric 6.SR]./QT este transformat !n adresa Q/]R
prin selectarea cifrelor din poziiile Q la ] i inversarea ordinii lor.
Cetoda de selectare i de inversare trebuie folosit cu consecven pentru o aceeai mulime
de c"ei de cutare. 5entru un set de c"ei aceeai poziie din c"eie aceeai rearan'are trebuie
folosit cu consisten.
V.7.0.9. +unc4ia hash I $etoda de3endent de lun#i$ea cheii
O alta funcie "as" des utilizat !n structuri de date alocate static care folosesc tabele este
funcia "as" bazat pe metoda dependent de lungimea c'eii. 3n aceast metod lungimea c"eii
este folosit singur sau !mpreun cu o parte a c"eii pentru a produce direct o adres din tabel ori
pentru a produce o c"eie intermediar care este folosit mai departe cu o alt metod cum ar fi de
e%emplu metoda !mpririi pentru a genera o adresa final din tabel.
O funcie "as" de acest tip sumeaz valoarea reprezentrii binare interne a primului i al
ultimului caracter al c"eii i a lungimii c"eii translatat la st)nga cu patru poziii binare +sau
multiplicat cu Q
R
@ /],.
E/e$3lu* 8vem c"eia de cutare PR&TE&. ;a va genera adresa*
Q/S ? Q/R ? + ] a /] , @ SQS dac utilizm codul E'CDIC.
Dac considerm 909 ca o c"eie intermediar i aplicm metoda !mpririi cu divizorul 8=%
atunci adresa rezultat este 7:.
V.7.0.:. +unc4ia hash K $etoda codi,icrii al#e.rice

Funcia "as" bazat pe metoda codificrii algebrice are la baz teoria de codificare
algebric -.nu /06]2. O c"eie binar de n bii +(
1
(
2
...(
n
,
Q
este codificat cu a'utorul unui polinom
de gradul n*
( )

n
i
i
i
- ( - !
/
/
+S.%,
Dac spaiul de adresare este !n intervalul [ ] / Q 7
%
atunci vom construi un polinom
divizor al polinomului . i anume*
( )

+
%
i
i
i
%
- p - - 7
/
/
+S.%,
3mprind polinomul ! la polinomul 7 folosind operaii !n baza Q vom obine polinomul
rest*
________________________________________________________________________________
QR6
Structuri de date i algoritmi
_______________________________________________________________________________
( ) ( ) ( )


r
i
i
i
- r - 7 - ! - 8
/
/
mod
+S.%,
&oeficienii polinomului rest
( ) - 8
++
1
+
2
+
r
,
Q
vor genera adresa cutat.

V.7.0.;. +unc4ii hash I $etoda $ulti3licati2
S.nu /06]2 a artat ca funciile "as" de cutare bazate pe metoda multiplicativ sunt
printre cele mai performante. Dac
+
9 -
iar c este o constant c pozitiv subunitar 7 J c J /
atunci funcia "as" arat !n felul urmtor*
( )
1 ]
/ + c- % - 3
+S.%,
8m notat cu ]
-
cel mai mare !ntreg mai mic dec)t - i cu 1
-
partea fracionar a lui -.
8ceast funcie "as" d rezultate foarte bune dac constanta c este aleas corespunztor.
8legerea constantei c este dificil.
V.7.7. Per,or$an4a ,unc4iilor hash
-.nu /06T2 prezint studii asupra funciilor "as" prezentate anterior. 3n general aceste
funii "as" genereaz adrese uniforme dar o generalizare a acestei afirmaii este dependent de
mulimile particulare de c"ei de cutare.
;ste nevoie de introducerea unui sistem de referin pentru a compara performanele
diferitele funcii "as". &el mai larg acceptat criteriu de referin este 8MOS +A*erage Lengt+ of
Searc+, prezentat !n +S./,.
De obicei cea mai performant funcie "as" de folosit pentru un anumit mulime de cutare
va minimiza 8MOS. Sunt !ns i ali factori !n afar de performana funciilor "as" care
minimizeaz 8MOS timpul mediu de cutare.
V.7.8. Tehnici de re1olu4iune a coli1iunilor
V.7.8.1. Introducere
&u a'utorul funciilor "as" se poate realiza transformarea c'eie de cutare < adres. :u am
inut !ns cont de problema prezentat !n +S.%, i anume de problema coliziunilor. O coliziune
apare aa cum am mai artat atunci c)nd dou c"ei de cutare distincte sunt mapate de funcia "as"
la aceeai adres a structurii de date. #n practic un astfel de fenomen se !nt)mpl pentru c spaiul
________________________________________________________________________________
QR1
Structuri de date i algoritmi
_______________________________________________________________________________
c"eilor de cutare este mai mare dimensional dec)t spaiul adreselor. 3ntr-o astfel de situaie funcia
"as" nu este in'ectiv deci dou sau mai multe c"ei de cutare pot genera prin intermediul funciei
"as" aceeai adres. ;vident c nu putem suprapune dou sau mai multe !nregistrri cu c"ei de
cutare diferite la aceeai adres generat de funcia "as".
<ezolvarea acestei probleme se face cu a'utorul te'nicilor de rezoluiune a coliziunilor.
Ie"nicile de rezoluiune a coliziunilor se !mpart !n dou clase*
adresare deschis6
adresare nln4uit.
Obiectivul general al te"nicilor de coliziune este de a !ncerca plasarea !nregistrrilor aflate
!n coliziune la alte adrese ale structurii de date. Dac structura de date este o tabel atunci ne
propunem s plasm !nregistrrile aflate !n tabel !n alte locaii libere ale tabelei. 8ceasta va implica
o serie de operaii de cutare !n tabel p)n c)nd gsim o poziie liber unde se poate insera una
din !nregistrrile aflate !n coliziune.
Deci avem nevoie de un mecanism i de algoritmul corespunztor care s e%amineze toate
poziiile structurii de date !n vederea realizrii operaiilor de inserare cutare tergere actualizare.
9n astfel de mecanism trebuie s satisfac o serie de cerine i anume -Iom /0062*
2ite1a +pentru a determina repede o nou poziie liber,=
3uterea de aco3erire +pentru a putea cuta !n toate poziiile e%istente !n structura de date,=
re3roducti.ilitatea +pentru a regsi !nregistrrile inserate !n structura de date,.
V.7.8.0. Tehnici de re1olu4iune a coli1iunilor 3rin adresare deschis
#deea de baz !n te"nica de rezoluiune a coliziunilor prin adresare desc"is este de a cuta
pentru !nregistrarea aflat !n coliziune o nou poziie liber !n structura de date. Dac structura de
date este alocat static !n memorie atunci vom folosi o tabel pentru reprezentare tabela se va numi
tabel 'as'. O astfel de tabel "as" fiind alocat static are un numr finit de poziii de stocare a
!nregistrrilor aceast capacitate ne put)nd fi modificat pe parcursul e%ecuiei programului ce
implementeaz algoritmul de manipulare a !nregistrrilor. De aceea pentru a folosi c)t mai eficient
spaiul de stocare fi% oferit de o tabel "as" va trebui s facem disponibile toate spaiile eliberate !n
urma unor operaii de tergere.
5utem a gestiona aceast problem vom introduce marca'e care s ne indice faptul c o
poziie a tabelei "as" este liber sau nu. $om avea urmtoarele valori posibile pentru o poziie liber
din tabel "as" !n c)mpul c"eii de cutare*
;mtp\ N poziie liber !n tabela "as" !n care nu s-a inserat nici o !nregistrare=
D;M;I;D - poziie liber !n tabela "as" unde a e%istat o !nregistrare dar a fost tears*
Cecanismul prin care realizm cutarea unei noi adrese pentru o c"eie de cutare aflat !n
coliziune prin te"nica adresrii desc"ise este de mai multe feluri i anume*
________________________________________________________________________________
QR0
Structuri de date i algoritmi
_______________________________________________________________________________
a. Pro.are liniar
.. Pro.are aleatoare
a. Pro.area liniar
9nul din cele mai simple mecanisme de cutare a unei locaii libere pentru o !nregistrare
av)nd o c"eie de cutare !n coliziune este de a folosii o secven de cutare liniar. 5resupun)nd c
avem c"eia
( ) A a ( 3 ! (
iar adresa la adresa a avem o coliziune atunci probarea liniar se
bazeaz pe urmtoarea secven de cutare liniar*
a % a T / % U % % I / % % % / % Q % U % a I / +S.%,
unde % reprezint capacitatea ma%im de stocare a tabelei. $om gsi o locaie liber dac tabela nu
este de'a plin.
&)nd efectum o operaie de cutare a unei !nregistrri cu c"eia de cutare ( vom proceda
astfel*
- calculm adresa corespunztoare c"eii de cutare (*
( ) A ( 3 a
=
- comparm c"eia de la adresa a cu c"eia de cutare (=
- Dac c"eia de la adresa a este cea cutat atunci avem o cutare cu succes*
- Dac c"eia de la adresa a nu este cea cutat pornim mecanismul de probare liniar +S.%,.
Dac an a'uns la locaia de adres a N / atunci cutare nu este cu succes !nregistrarea
cutat nu e%ist !n tabel. 8ltfel cutarea este cu succes.
8ceast te"nic de rezolvare a coliziunilor se numete probare liniar .
Operaia de inserare este prezentat cu a'utorul unui e%emplu. S presupunem c avem
urmtoarele o tabel de dimensiune // i c)teva !nregistrri cu urmtoarele c"ei de cutare*
:#:8 SIO#&8: 8:8 8D8 F9:&I#; f f<8:D i 58<8C;I<9
8plic)nd o funcie "as" 3" s presupunem ca avem urmtoarea situaie*
C'eia de
cutare
(dresa din tabela
'as'
:#:8 3 +:#:8, @ /
SIO#&8: 3 +SIO#&8:, @ Q
8:8 3 +8:8, @ T
8D8 3 +8D8, @ T
________________________________________________________________________________
QS7
Structuri de date i algoritmi
_______________________________________________________________________________
F9:&I#; 3 +F9:&I#;, @ 0
f 3 +f, @ 0
f<8:D 3 +f<8:D, @ 0
58<8C;I<9 3 +58<8C;I<9, @ 0
Dup operaia de inserare aplic)nd mecanismul probrii liniare vom avea urmtoarea tabel*
+i#ura 9./: Con4inutul ta.elei hash du3 a3licarea o3era4iilor de inserare ?i a cutrii
unei noi 3o1i4ii li.ere 3rin $ecanis$ul de 3ro.are liniar.
5rimele trei !nregistrri av)nd c"eile de cutare :#:8 SIO#&8: 8:8 sunt inserate
printr-o singur probare !n primele trei poziii libere +;mpt\, ale tabelei.
3nregistrarea cu c"eia de cutare 8D8 trebuie plasat !n poziia R a tabelei cci poziia T este
ocupat i astfel apare o coliziune. ;ste nevoie de dou probri.
3nregistrarea cu c"eia de cutare F9:&I#; este inserat !n poziia 0 de la prima operaie de
probare cci poziia 0 din tabel era liber +;mpt\,.
3nregistrrile cu c"eile de cutare f si f<8:D sunt !n coliziune cu !nregistrarea cu c"eia
de cutare F9:&I#; respectiv f. 5entru a insera !nregistrarea cu c"eia de cutare f aplicm
mecanismul probrii liniare i obinem poziia liber /7 din tabel !n urma a Q operaii de probare.
5entru a insera !nregistrarea cu c"eia de cutare f<8:D aplicm mecanismul probrii liniare i
obinem poziia liber // din tabel !n urma a T operaii de probare.
3n final !nregistrarea cu c"eia de cutare 58<8C;I;< va fi plasat prin mecanismul
probrii liniare !n poziia S a tabelei necesit)nd 1 operaii de probare fiind !n coliziune cu
!nregistrrile inserate anterior fiind probate poziiile ocupate 0 /7 // / Q T R i poziia liber S.
________________________________________________________________________________
QS/
Structuri de date i algoritmi
_______________________________________________________________________________
Specificarea problemei de inserare-cutare av)nd ca date de intrare tabela de "as" tab
dimensiunea ma%im a tabelei % c"eia de inserare-cutare c"eia #:S @ / pentru operaia de
inserare i #:S @ 7 pentru operaia de cutare este urmtoarea*
D8I; tab m c"eia #:S=
<;g9MI8I; tab=
Descrierea algoritmului de inserare !n 5seudocod este*
8MUO<#IC9M #:S;<8<;_&K9I8<;_5robare_liniar ;SI;*
&#I;XI; c"eia #:S=
a *@ d +c"eia,=
5;:I<9 i*@a=+m?a-/, COD C8D ;D;&9IK Ase genereaz adresele a a?/..mB
A/Q_ a-/ N probare liniar B
D8&K tab -i2 @ c"eia 8I9:&#
D8&K #:S @ 7 8I9:&#
Lreturneaz adresa a A&utare cu succesB
8MIF;M
I#5K<;XI; +Y;<O8<; #:S;<8<; N c"eie dublc a,=
;D#I=
SFD8&K
SFD8&K
D8&K +tab -i2 @ ;mpt\, sau +tab -i2 @ D;M;I;D, 8I9:&#
D8&K #:S @ / 8I9:&#
Linserm noua !nregistrare la adresa a din tabel
8MIF;M
D8&K +tab -i2 @ ;mpt\, 8I9:&#
I#5K<;XI; +Y;<O8<; &K9I8<;N inf. nu e%istc,=
SFD8&K
SFD8&K
SFD8&K
SF5;:I<9
D8&K #:S @ 7 8I9:&#
I#5K<;XI; +Y;<O8<; &K9I8<;N inf. nu e%istc,=
8MIF;M
I#5K<;XI; +Y;<O8<; #:S;<8<;N tabela plin,=
SF8MUO<#IC
8lgoritmul de cutare implementat !n limba'ul 5ascal ca o funcie ce returneaz adresa
poziiei cutate din tabela "as" !n cazul unei cutri cu succes este*
+unction searc"+ Ge\ * t\peGe\= var r * dataarra\ , * inte#er=
________________________________________________________________________________
QSQ
Structuri de date i algoritmi
_______________________________________________________________________________
2ar i last * inte#er=
.e#in
i *@ "as"function+ Ge\ , =
last *@ +i?n-/, $od m=
-hile +iJElast, and +not empt\+r-i2,, and +r-i2.GJEGe\, do
i *@ +i?/, $od m=
i, r-i2.G@Ge\ then searc" *@ i Aaaa !nregistrarea a fost gsit aaaB
else searc" *@ -/= Aaaa !nregistrarea nu a fost gsit aaaB
end6
Operaia de tergere a unei !nregistrri din tabela "as" este simpl. $om cuta !nregistrarea
de ters din tabela "as". Dac !nregistrarea e%ist vom avea gri' s marcm c)mpul corespunztor
c"eii de cutare cu marca'ul D;M;I;D. 8cest marca' este necesar pentru a optimiza operaiile de
cutare care se opresc !n cazul unei cutri cu insucces dac avem valoarea marca'ului D;M;I;D
i pentru a evita inserarea unor !nregistrri cu c"eie dubl. De e%emplu !n tabela +S.%, dac tergem
!nregistrarea cu c"eia de cutare F9:&I#; i nu marcm c)mpul c"eie cu marca'ul D;M;I;D
atunci dac vrem s !nserm o nou !nregistrare cu c"eia de cutare 'RAND poziia 0 din tabela
"as" va fi considerat liber i !nregistrarea duplicat va fi inserat.
Specificarea problemei de tergere av)nd ca date de intrare tabela de "as" tab dimensiunea
ma%im a tabelei % c"eia de tergere c"eia este urmtoarea*
D8I; tab m c"eia=
<;g9MI8I; tab=
Descrierea algoritmului de inserare !n 5seudocod este*
8MUO<#IC9M XI;<U;<;_5robare_liniar ;SI;*
&#I;XI; c"eia=
adresa *@ #:S;<8<;_&K9I8<;+tab C8D c"eia 7,=
D8&K adresa J@ 7 8I9:&#
I#5K<;XI; +Y;<O8<; &K9I8<;N inf. nu e%istc,=
8MIF;M
Lmarc"eaz locaia de ters cu marca'ul D;M;I;D
3n lucrarea -.nu /06]2 gsim un model probabilistic pentru a analiza te"nicile de rezoluie
a coliziune i calculare pentru determinarea performanelor algoritmului de cutare !n cazul
mecanismului de probare liniar. Codelul presupune ca fiecare c"eie este ec"iprobabil pentru
cutare. Dac notm cu % capacitatea ma%im a tabelei "as" atunci probabilitatea ca o !nregistrare
s fie cutat este
%
p
i
/

.
Dac dimensiunea spaiului c"eilor de cutare este n atunci vom avea un numr de %
n

________________________________________________________________________________
QST
Structuri de date i algoritmi
_______________________________________________________________________________
funcii posibile de la ! la A.
$om nota cu
%
n

factorul de ncrcare a tabelei 'as' . Iimpul mediu de cutare va fi
dependent de factorul de !ncrcare. 3n -.nu /06]2 gsim urmtoarea formul*
( )

'

,
_

,
_

insucces cu cautare pentru


succes cu cautare pentru
ALOS

/
/
/
Q
/

/
/
/
Q
/
Q

+S.%,
5entru o distribuie uniform a mulimii c"ei de cutare 3ro.area liniar d rezultate
rezonabile dac o comparm cu algoritmii de cutare sec2en4ial sau de cutare .inar
presupun)nd c tabela nu este plin. Factorul de !ncrcare trebuie s fie mai mic dec)t 71. 5entru
o valoare mai mare a factorului de !ncrcare 3ro.area liniara degenereaz rapid.
.. Pro.area aleatoare
Cetoda probrii liniare are o serie de dezavanta'e. 9n prim dezavanta' este datorat faptului
ca trebuie s gestionm un indicator suplimentar de tergere numit D;M;I;D 3n acest fel o
!nregistrare oarecare din tabel are trei stri i anume liber +;mpt\, ocupat sau tears
+D;M;I;D,. 3n mod normal ar trebui ca o !nregistrare din tabel s aib doar una din cele dou
stri posibile i anume liber sau ocupat.
9n alt dezavanta' al metodei de probare liniar este problema gruprii primare +primar\
clustering,. 8cest fenomen apare datorit cutrii secveniale a unei poziii libere pentru
!nregistrrile aflate !n coliziune. De aceea !nregistrrile aflate !n coliziune tind s se grupeze !ntr-o
anumit poziie a tabelei !n loc ca ele s se distribuie c)t mai uniform fenomen care duce la
scderea performanelor algoritmului de cutare.
;fectele negative fenomenului ale gruprii primare pot fi reduse prin selectarea unei alte
metode de probare care s foloseasc un mecanism aleatoriu de cutare a unei poziii libere !n
tabela "as" !n loc de mecanismul de cutare secvenial. O astfel de metod de probare se numete
probare aleatoare +random probing,
Secvena de adrese de cutare pentru o poziie liber !n tabela de "as" va fi generat aleator
dar va trebui s acopere toat mulimea de adrese cuprinse !ntre / i % e%act o singur dat. O
tabel de "as" va fi plin !n momentul !n care inser)nd o nou !nregistrare apel)nd ca urmare a
coliziunii la mecanismul de probare aleatoare se genereaz aleatoriu o adres duplicat -Ire /01R2.
9n e%emplu de mecanism de generare aleatoare a adreselor pentru o tabel "as" este *
a *@ + a ? c , %od % +S.%,
unde a este adresa iniial generat de funcia "as" c este o constant !ntreag nenul aleas astfel
________________________________________________________________________________
QSR
Structuri de date i algoritmi
_______________________________________________________________________________
!nc)t s fie relativ prim cu %.
De e%emplu dac considerm c % @ // i c @ S atunci presupun)nd c iniial a @ Q atunci
secvena de adrese generat pentru a cuta o poziie liber este 6 / ] 7 S /7 R 0 T 1 i Q.
Specificarea problemei de inserare av)nd ca date de intrare tabela "as" numit tab
dimensiunea ma%im a tabelei % c"eia de inserare c"eia este urmtoarea*
D8I; tab m c"eia=
<;g9MI8I; tab=
Descrierea algoritmului de inserare !n 5seudocod este*
8MUO<#IC9M #:S;<8<; _5robare_aleatoare ;SI;*
&#I;XI; c"eia=
a *@ d +c"eia,=
D8&K +tab -i2 @ ;mpt\, sau +tab -i2 @ D;M;I;D, 8I9:&#
Linserm noua !nregistrare la adresa a din tabel=
&HII#C5 Lnu s-a gsit o poziie liber !n tabela "as" ;D;&9IK
Lcalculeaz noua adres a utiliz)nd probarea aleatoare=
D8&K Ls-a generat o adres duplicat 8I9:&#
I#5K<;XI; +Y;<O8<; #:S;<8<;N tabela plin,=
;D#I=
8MIF;M
D8&K +tab -i2 @ ;mpt\, sau +tab -i2 @ D;M;I;D, 8I9:&#
Linserm noua !nregistrare la adresa a din tabel=
SFD8&K
SFD8&K
SF&KI
SF8MUO<#IC
5roblemele legate de tergere devin i mai severe !n cazul probrii aleatoare dec)t !n cazul
probrii liniare. Dei probarea aleatoare rezolv problema gruprii primare din pcate nu elimin
problema gruprii secundare +secondar\ clustering,. Uruparea secundar apare c)nd se genereaz
aceeai secven de adrese libere pentru dou c"ei de cutare aflate !n coliziune.
O soluie pentru problema gruprii secundare este de a folosii o funcie "as" secundar
care s genereze o valoare aleatoare pentru constanta c din formula +S.%, independent de prima
funcie "as". 5rin aplicarea acestei metode se anuleaz efectul negativ al gruprii.
Fie
A ! 3 *
/
prima funcie de "as" i
! ( (
Q /

dou c"ei de cutare distincte aflate !n


coliziune adic*
( ) ( ) A a ( 3 ( 3
Q Q / /
________________________________________________________________________________
QSS
Structuri de date i algoritmi
_______________________________________________________________________________
Fie
A ! 3 *
Q
a doua funcie de "as" folosit pentru a genera valoarea constantei c din
formula de probare aleatoare +S.%,. 8tunci dac ( ) ( )
Q Q / Q
( 3 ( 3 putem alege ( )
/ Q
( 3 c . 3n acest
fel la fiecare probare aleatoare se vor genera secvene diferite de adrese iar problema gruprii
secundare va fi depit.
Cetoda descris mai sus de a folosi dou funcii "as" independente se numete 'as' dublu.
Exemplu" S considerm urmtoarele funcii "as"*
3
1
+(, @ ( mod % si 3
2
+(, @ + ( mod + %-Q ,, ? /
unde ( este valoarea c"eii de cutare i % este mrimea tabelei "as". 5entru % @ // i (
1
@ 6S vom
avea urmtoarele valori* 3
1
+:., @ 0 i 3
2
+:.,@ R.
8plic)nd formula probrii aleatoare +S.%, pentru a @ 0 i c @ R obinem secvena de adrese
!n tabela "as"* 0 Q ] /7 T 6 7 R 1 / S
Dac avem c"eia de cutare (
2
@ RQ atunci 3
1
+RQ, @ 0. &"eile de cutare (
1
i (
2
sunt !n
coliziune. 8leg)nd c @ 3
2
+;2, @ 6k folosind formula de probare aleatoare obinem secvena de
adrese !n tabela "as"* 0 S / 1 R 7 6 T /7 ] Q.
#mplementarea !n limba' 5ascal al algoritmului de cutare utiliz)nd metoda 'as' dublu
este*
+unction searc"+ Ge\ * t\peGe\= var r * dataarra\ , * integer=
2ar i inc last * integer=
.e#in
i *@ "as"function+ Ge\ , =
inc *@ increment+ Ge\ , =
last *@ +i?+n-/,ainc, mod m=
-hile +iJElast, and +not empt\+r-i2,, and +r-i2.GJEGe\, do
i *@ +i?inc, $od m=
i, r-i2.G@Ge\ then searc" *@ i Aaaa cutare cu succes aaaB
else searc" *@ -/= Aaaa cutare fr succes aaaB
end6
5erformana algoritmului de cutare bazat pe probare aleatoare cu "as" dublu !n
conformitate cu -.nu /06]2 este dat de urmtoarea formul*
( )

'

insucces cu c$$tare pentru


succes cu c$$tare pentru
ALOS

/
/
/ ln
/

+S.%,
Cetoda probrii aleatoare cu "as" dublu este o metod mai performant dec)t probarea
liniar !n special c)nd tabela "as" este plin. De e%emplu c)nd o tabel "as" are un grad de
________________________________________________________________________________
QS]
Structuri de date i algoritmi
_______________________________________________________________________________
umplere de 0S l numrul mediu de operaii pentru metoda probrii liniare este /7S pe c)nd la
metoda probrii aleatoare cu dublu "as" este TQV
V.7.8.7. Tehnici de re1olu4iune a coli1iunilor 3rin adresare nln4uit
O alta metod de a rezolva problema coliziunilor este acea de a grupa c"eile de cutare
aflate !n coliziune !n clase de ec"ivalen. <eprezentantul unei clase de ec"ivalen va fi capul unei
liste simplu !nlnuite cu a'utorul creia se vor gestiona dinamic toate c"eile de cutare aflate !n
aceeai clas de coliziune adic toate c"eile de cutare care genereaz aceeai adres*
{ } ( ) ( )
i i l j i <
( ( 3 ( 3 dac$ ( ( ( ( ( ( ! A ! 3
Q Q /

m

m

m

m
*
$om avea in acest fel o tabel "as" fi% de dimensiune % mai mare sau egal cu numrul
claselor de ec"ivalen. 3n aceast tabel "as" vom stoca doar c"eia de cutare reprezentant al clasei
de ec"ivalen i adresa de !nceput a listei simplu !nlnuite care stoc"eaz restul c"eilor de cutare
aflate !n coliziune cu c"eia reprezentant al clasei de ec"ivalen.
8ceast te"nic de rezoluiune a coliziunilor se numete adresare nlnuit.
Exemplu" 3n figura de mai 'os avem un e%emplu de reprezentare a metodei adresrii !nlnuite
pentru % @ // si n @ 0. 5resupunem c c"eile sunt !nserate !n ordinea urmtoare *
:OD; SIO<8U; 8: 8DD F9:&I#O: f f<8:D i 58<8C;I;<
#igura -.x." Bodelul de re1ol2are a coli1iunilor 3rin adresare nln4uit.
________________________________________________________________________________
QS6
Structuri de date i algoritmi
_______________________________________________________________________________
S analizm algoritmul de inserare. Dac inserarm !n structura noastr de date !nregistrri
cu o c"eie de cutare ( facem urmtorii pai*
8plicm funcia "as" i obinem adresa a pentru !nregistrarea de inserat=
&utm !n tabela de "as" la adresa a e%istena unei alte !nregistrri=
Dac poziia a din tabela "as" este liber !nregistrarea de inserat nu este !n coliziune i
crem primul nod al listei simplu !nlnuite corespunztoare clasei de ec"ivalen am
.
Dac poziia a din tabela "as" este ocupat !nregistrarea de inserat este !n coliziune i
inserm la sf)ritul listei simplu !nlnuite noul element.
Specificarea problemei de inserare av)nd ca date de intrare tabela "as" numit tab
dimensiunea ma%im a tabelei % c"eia de inserare c"eia este urmtoarea*
D8I; tab m c"eia=
<;g9MI8I; tab=
Descrierea algoritmului de inserare !n 5seudocod este*
8MUO<#IC9M #:S;<8<; _adresare_!nlnuit ;SI;*
&#I;XI; c"eia=
a *@ d +c"eia,=
D8&K +tab -i2 @ ;mpt\, 8I9:&#
Linserm noua !nregistrare la adresa a din tabel=
Linserare la sf)rit lista simplu !nlnuit=
8MIF;M
Linserare la sf)rit lista simplu !nlnuit=
SFD8&K
SF8MUO<#IC
Specificarea problemei de cutare av)nd ca date de intrare tabela "as" numit tab c"eia de
cutare c"eia_caut este urmtoarea*
D8I; tab c"eia_caut=
<;g9MI8I; adresa=
8MUO<#IC9M &K9I8<; _adresare_!nlnuit ;SI;*
&#I;XI; c"eia_caut=
a *@ d +c"eia_caut,=
D8&K +tab -i2 @ ;mpt\, 8I9:&#
I#5K<;XI; +Y;<O8<; &K9I8<;N inf. nu e%istc,=
________________________________________________________________________________
QS1
Structuri de date i algoritmi
_______________________________________________________________________________
Lreturneaz :#M=
8MIF;M
adr *@ caut_list +M#SI c"eia_caut,= Ase caut !n lista simplu !nlnuit B
D8&K adr @ :#M 8I9:&#
I#5K<;XI; +Y;<O8<; &K9I8<;N inf. nu e%istc,=
Lreturneaz :#M=
8MIF;M
Lreturneaz adr=
SFD8&K
SFD8&K
SF8MUO<#IC
5erformana algoritmului de cutare bazat pe adresare !nlnuit este conform -Ire /01R2*

'

+
+

insucces cu c$$utar pentru e


succes cu c$$utar pentru
ALOS

Q
/

+S.%,
V.7.9. Pro.le$e 3ro3use 3entru ,unc4ii hash ?i tehnici de re1olu4iune
a coli1iunilor
/. Descriei modul de implementare a unei funcii "as" folosind un generator de numere aleatoare.
8re sens implementarea unui generator de numere aleatoare folosind o funcie "as" ^
Q. #lustrai coninutul tabelei "as" care rezult c)nd inserm c"eile* U N E A E B P " U D E P N T
R E ' A R E sunt inserate !n aceast ordine !ntr-o tabel iniial goal de dimensiune /T folosind
te"nica probrii liniar. + Folosii ca funcie "as" 3+(, @ ( mod /T pentru litera a-( a alfabetului,.
T. #lustrai coninutul tabelei "as" care rezult c)nd inserm c"eile* U N E A E B P " U D E P N T
R E ' A R E sunt !nserate !n aceast ordine !ntr-o tabela iniial goal de dimensiune /T folosind
probarea aleatoare i "as" dublu + Folosii ca funcie "as" primar funcia 3 din e%emplul Q iar ca
funcie "as" secundar funcia 3
2
+(, @ /? + ( mod //, , .
R. &)te probri sunt necesare c)nd este folosit te"nica probrii aleatoare pentru a insera n c"ei de
________________________________________________________________________________
QS0
Structuri de date i algoritmi
_______________________________________________________________________________
cutare egale^
S. &are metoda de probare este mai eficient !n situaia !n care se insereaz mai multe c"ei de
cutare egale ^
]. S presupunem c numrul de !nregistrri care trebuie inserate !ntr-o tabel "as" este cunoscut !n
prealabil. 3n ce condiii metoda adresrii !nlnuite este preferabil fat de metoda adresrii
desc"ise^
6. Folosind metoda divizrii calculai adresa generat de funcia "as" pentru urmtoarele seturi de
c"ei de cutare* PAA ARC RATE i NUBR. !e 2a ,olosi reprezentarea A!CII a c"eilor de
cutare i m @ ///.
1. <ezolvai problema 1 folosind o reprezentare E'CDIC a c"eilor de cutare.
0. 8vem urmtoarele c"ei de cutare numerice* ]] R6 16 07 /Q] /R7 /RS /ST /66 Q1S T0T
T0S R6] S]] ]Q7 6TS. Stocai !nregistrrile !ntr-o tabel "as" cu Q7 de poziii folosind metoda
divizrii pentru funcia "as" i metoda probrii liniare pentru rezolvarea coliziunilor.
/7. Folosind aceleai c"ei de cutare ca la e%erciiul 0 stocai !nregistrrile !ntr-o tabel "as" cu Q7
de poziii folosind metoda !mpririi pentru funcia "as" i metoda probrii aleatoare pentru
rezolvarea coliziunilor.
VI.TEHNICI DE !&RTARE
VI.1. I!T&RIC
&utarea originii metodelor actuale de sortare ne conduce !n secolul al D#D-lea c)nd au fost
inventate primele maini de sortat. 3n Statele 9nite cu ocazia recensm)ntului din /117 derman
dollerit" anga'at al firoului de <ecensm)nt a inventat o main electric de tabelat pentru a
rspunde necesitilor de prelucrare statistic. 9n om putea prelucra R0 de cartele pe minut. 3n /07/
a inventat o main mai modern care lucra automat. Caina de sortat al lui dollerit" este baza
metodelor de sortare dup ranguri folosite !n prezent pe calculatoare.
#deea interclasrii provine de la o alt main cu cartele numit 4collator4 din /0T1 care
putea interclasa dou pac"ete de cartele !ntr-unul singur !ntr-o singur trecere.
5rimul program scris pentru un calculator cu program memorat a fost o rutin de sortare. no"n von
:eumann a pregtit programe de sortare intern !n /0RS pentru a testa valabilitatea unor coduri de
instruciuni propuse de el pentru calculatorul ;:#8&. non" Cauc"l\ a confereniat despre 4Sortare
________________________________________________________________________________
Q]7
Structuri de date i algoritmi
_______________________________________________________________________________
si Fuziune4 la sesiunea special asupra calculatoarelor inut la Coore Sc"ool !n /0R] iar notele
acestei conferine constituie prima discuie public a sortrii pe calculator. 5rima metod de sortare
folosea numrarea comparaiilor= apoi urmau o serie de treceri de interclasare ec"ilibrat cu dou
ci.
3n /0SQ Daniel Uoldenberg a codificat S metode diferite* interclasarea direct cu dou ci
sortarea cu baz Q selecia direct metoda bulelor. SeWard a introdus idea de numrare a
distribuiilor si de selecie cu !nlocuire.
8stfel istoria sortrii este str)ns legat de multe premiere din domeniul calculatoarelor*
primele maini de prelucrare a datelor primele programe memorate primul softWare primele
metode de utilizare a zonelor tampon de intrare-ieire primele lucrri asupra analizei algoritmilor si
asupra comple%itii calculelor.
3n /0S0 Donald M. S"ell a propus sortarea prin micorarea incrementului= sortarea cu
interclasare si intersc"imb a fost descoperit de .. ;. fatc"er !n /0]R= &. 8. <. doare a descoperit
metoda sortrii rapide= !n /0]R a fost descoperit sortarea de ansambluri de ctre n. O. n. Oilliams.
5e parcursul anilor s-au !mbuntit aceste metode de sortare si s-au descoperit si metode noi
metode "ibride.
VI.0. Al#orit$i de sortare
3n acest capitol vom prezinta pe scurt cele mai importante informaii despre caracteristicile
principalelor metode de sortare i a algoritmilor corespunztori !ncep)nd de la cele mai simple
metode de sortaare p)n la cele comple%e metode de sortare folosind diferite structuri de date*
matrice liste !nlnuite stive arbori _. etc.
;%ist urmtoarea clasificare a metodelor de sortare -MeW /00/2*
Cetode de sortare simple * selecie inserare bule ,'ell=
Cetode de sortare comple%e * rapid interclasare ansambluri! <adi%.

Cetodele simple de sortare au de obicei comple%itatea O+&
2
, adic pot sorta & elemente
!ntr-un timp proporional cu &
2
si sunt eficiente pentru tabele mici !n care numrul de elemente este
mai mic dec)t S77. Iotui pentru multe aplicaii de sortare este mai bine s folosim metode simple
dec)t comple%e. De e%emplu dac tabela este de'a sortat !n cazul metodei de sortare rapid
pivotul ales +elementul !n 'urul creia se face sortarea, este primul element metoda de sortare prin
selecie este mai rapid. Cetodele simple sunt !ntotdeauna mai potrivite pentru un numr de
elemente mai mic dec)t S7. Iabelele parial sau total sortate sau cele care conin un numr mare de
c"ei identice sunt relativ uor de sortat cu a'utorul algoritmilor simplii. :ecesit relativ puin timp
de programare si !ntreinere.
Cetodele comple%e pot sorta & elemente !ntr-un timp proporional cu &log&. :ici un
algoritm nu poate folosi mai puin de &log& comparaii !ntre c"ei. 8ceste metode comple%e sunt
eficiente mai ales pentru sortarea unui numr mare de elemente. :ecesit mai mult timp pentru
programare dar sunt mai eficiente. 9nul dintre cei mai populari algoritmi de sortare cu scop general
________________________________________________________________________________
Q]/
Structuri de date i algoritmi
_______________________________________________________________________________
este sortare rapid +euicGsort, care are o comple%itate de O+&log&, e%primat pentru mediu
necesar operaiei de sortare. 8cest algoritm de sortare are performane bune !n general c"iar dac !n
caz nefavorabil comple%itatea devine O+&
2
,.
#deea 4divide et impera4 a fost aplicat problemelor de sortare !n mai multe feluri rezult)nd
urmtorii algoritmii de sortare* rapid interclasare ansambluri! <adi% care sunt mult mai eficiente
dec)t cele simple. Sortarea prin ansambluri si sortarea prin interclasare au comple%itatea egal cu
O+&log&, dei !n cazul general comportarea lor nu este c"iar aa de bun ca la algoritmul de
sortare rapid. ;%ist metode care folosesc proprietile digitale ale c"eilor ca s obin o
comple%itate proporional cu & ca de e%emplu sortarea <adi%.
Ma baza studiului comple%itii unui algoritm st detectarea !n descrierea algoritmului a
operaiei sau a operaiilor de baz adic acea operaie aflate !n cel mai interior corp de ciclu
repetitiv si a crei analiz permite estimarea !n avans !nainte de lansarea !n e%ecuie a algoritmului
ce descrie metoda de sortare respectiv.
3n ma'oritatea cazurilor e%ist o legtur foarte str)ns !ntre operaia de baz +cea mai repetat
operaie, si operaia care este dedus !n etapa de analiz a problemei ca fiind operaia inevitabil
pentru rezolvarea problemei.
De e%emplu !n cazul problemei sortrii unui sir de & c"ei prin comparaii este limpede c
operaia de comparare a mrimii c"eilor este operaia inevitabil si de asemenea ea va fi i
operaia de baz a crei contorizare va permite estimarea !nainte de e%ecuia programului ce
implementeaz algoritmul a duratei de e%ecuie a programului ce implementeaz algoritmul de
sortare respectiv.
3n aceast situaie toi algoritmii diferii care soluioneaz aceeasi problem si care se
bazeaz pe aceeai operaie de baz +inevitabil, formeaz clasa algoritmilor de soluionare a
problemei. De obicei numele clasei va fi dat c"iar de numele acelei operaii de baz ce este
coninut de fiecare algoritm al clasei !n mod inevitabil.
De e%emplu !n cazul problemei sortrii unui sir de & c"ei prin comparaii algoritmii diferii
ce soluioneaz aceast problema sunt grupai !n clasa algoritmilor de sortare prin comparaii spre
deosebire de clasa algoritmilor de sortare prin distribuire ce soluioneaz aceeai problem
baz)ndu-se !ns pe alt operaie de baz* distribuirea c"eilor de sortat.
8stfel algoritmi de sortare prin comparare descrii in aceasta lucrare sunt* algoritmul de
sortare prin inserare algoritmul de sortare prin selecie algoritmul de sortare ,'ell algoritmul de
sortare combinat algoritmul de sortare simplu algoritmul de sortare rapid algoritmul de sortare
prin ansambluri algoritmul de sortare prin interclasare iar algoritm de sortare prin distribuire este
algoritmul de sortare <adi%.
&ompararea eficienei a doi algoritmi diferii ce soluioneaz aceeai problem se face prin
determinarea teoretic a numrului de repetiii a operaiei de baz !n fiecare algoritm si compararea
celor dou valori. 3n final rezultatul comparrii va permite estimarea comparativ a (timpului de
sortare a programelor ce implementeaz acei algoritmi i alegerea celui mai bun.
&ompararea eficientei a doi algoritmi din punct de vedere practic se face prin compararea
timpilor medii de e%ecuie a celor dou programe ce !i implementeaz. 8ceast metod pragmatic
are dezavanta'ul c necesit rularea programelor care !n anumite situaii poate dura un timp
surprinztor de mare.
________________________________________________________________________________
Q]Q
Structuri de date i algoritmi
_______________________________________________________________________________
8naliz)nd comple%itatea algoritmilor factorul cel mai important este timpul de e%ecuie
e%primat prin 4O-mare4. Irebuie s folosim mai multe criterii pentru evaluarea timpului de e%ecuie
al algoritmului de sortare cum ar fi numrul de pai ai algoritmului si numrul de comparaii dintre
c"ei necesare pentru a sorta & elemente. 8ceast msur este de folos c)nd compararea dintre
perec"ile de c"ei este costisitoare c)nd c"eile sunt iruri lungi de caractere sau c)nd mrimea
!nregistrrii este mare.
8l doilea factor important este cantitatea +volumul, de memorie suplimentar folosit de un
algoritm de sortare. Cetodele se !mpart !n trei tipuri* cei care sorteaz pe loc nu folosesc memorie
suplimentar cu e%cepia poate unei tabele sau stive mici= cei care au o reprezentare de list
!nlnuit deci folosesc & cuvinte de memorie !n plus pentru pointerii listei= cei care au nevoie de
memorie suplimentar pentru o copie a tabelei iniiale.
&aracteristica care este uneori important !n practic este stabilitatea. O metod de sortare
este stabil dac pstreaz ordinea relativ a c"eilor egale !n tabel. +Dac sortm un sir de nume
numele cu aceeai liter de !nceput sunt sortate !n ordine alfabetic,. Ca'oritatea metodelor simple
sunt stabile dar muli dintre algoritmii de sortare compleci nu au aceast proprietate.

8MUO<#IC9M
D; SO<I8<;
O<D#:;8 D; C8U:#I9D#:;

S58I#9
FOMOS#I
&az
Favorabil
&az
Ueneral
&az
:efavorabil
Sortare prin
selecie
O+&
2
, O+&
2
, O+&
2
, Sorteaz pe loc
Sortare cu bule O+&
2
, O+&
2
, O+&
2
, Sorteaz pe loc
Sortare cu bule
4flag4
!mbuntit
O+&, O+&
2
, O+&
2
, Sorteaz pe loc
Sortare prin
inserare
O+&,
ir sortat
O+&
2
, O+&
2
, Sorteaz pe loc
Sortare ,'ell o O+&
2
, o O+&
2
, O+&
2
, Sorteaz pe loc
________________________________________________________________________________
Q]T
Structuri de date i algoritmi
_______________________________________________________________________________
Sortare
combinat
O+&log &, O+&
2
, O+&
2
, Sorteaz pe loc
Sortare simpl O+&
2
, O+&
2
, O+&
2
, Sorteaz pe loc
Sortare rapid O+&log &, O+&log &, O+:Q,
depinde de ir
i de pivot
Mog& !nregistrri
suplimentare
Sortare prin
interclasare
O+&log &, O+&log &, O+&log &, & !nregistrri
suplimentare
Sortare prin
ansambluri
O+&log &, O+&log &, O+&log &, Sorteaz !n loc
Sortare <adi% O+=?&, O+=?&, Spaiu suplimentar
pentru legturi
=abela 1.1. Co$3ararea al#orit$ilor de sortare.
Cetodele de sortare particulare nu sunt !n totdeauna superioare celorlalte metode pentru
orice set de c"ei. 5roprietile unui set de c"ei 'oac un rol important !n alegerea algoritmului de
sortare potrivit. 5roprieti ca numrul de !nregistrri mrimea !nregistrrii distribuia si ordinea
c"eilor dicteaz des care metoda de folosit. De e%emplu sortarea cu bule poate fi folosit dac
numrul elementelor din tabel este mic. Dac & este mare si c"eile de comparat sunt mici este mai
performant algoritmul de sortare <adi%. Dac & este mare si c"eile de comparat sunt lungi se poate
folosi algoritmul de sortare rapid algoritmul de sortare prin interclasare sau algoritmul de sortare
prin ansambluri. Dac tabela iniial este aproape sortat algoritmul de sortare rapid nu are
performane bune algoritmul de sortare prin inserare fiind alegerea cea mai bun.

VI.0.1. Al#orit$ul de sortare 3rin $etoda .ulelor Lbubble sortH
VI..0.1.1. Descrierea #eneral a $etodei
S ne imaginm o tabel !n poziie vertical care conine elemente +!nregistrri, nesortate.
3nregistrrile cu c"ei mici fiind mai (uoare asemenea bulelor de aer urc spre v)rful tabelei.
Sortarea bulelor se bazeaz pe cutarea celui mai mare +mic, element. &omparm elementele
tabelei dac dou elemente adiacente nu sunt !n ordine cresctoare le intersc"imbm. 8stfel
elementul cu c"eia cea mai mare va a'unge primul la locul potrivit iar elementul cu c"eia cea mai
mic urc tot timpul spre v)rf tabelei.
________________________________________________________________________________
Q]R
Structuri de date i algoritmi
_______________________________________________________________________________
VI.0.1.0. Descrierea al#orit$ului
Fie dat o tabel A cu & !nregistrri 8
i
fiecare !nregistrare av)nd c"eia de cutare !
i
. 5entru
sortarea tabelei este nevoie de &-/ pai.
5arcurgem tabela !n felul urmtor* comparm c"eia primului element !
1
cu c"eia celui de al
doilea element !
2
i dac nu sunt !n ordine cresctoare intersc"imbm primul element 8
1
cu cel de-
al doilea element 8
2
.
5rocesul se repet pentru !nregistrrile 8
2
8
>
_ 8
&
.. Dup prima parcurgere a tabelei
!nregistrarea cu cea mai mare c"eie va a'unge pe ultima poziie & a tabelei.
3n continuare vom lua !n considerare primele & N / !nregistrri. Dup aceea vom lua !n
considerare primele & -Q !nregistrri _ etc. Dup fiecare pas elementele cu c"ei mari vor a'unge
pe poziiile & - / & - Q _ Q !n final rezult)nd o tabel sortat !n ordine cresctoare.
Exemplul */.1" Sortarea tabelei 8 din Figura $#./ !n ordine cresctoare folosind algoritmul de
sortare prin metoda bulelor*
asul 1" relucrm primele 15 nregistrri ale tabelei.
- comparm ] cu R intersc"imbm=
- comparm ] cu S si intersc"imbm*
- comparm ] cu /7 nu intersc"imbm=
- comparm /7 cu T intersc"imbm=
- comparm /7 cu / intersc"imbm=
- comparm /7 cu 1 intersc"imbm=
- comparm /7 cu 0 intersc"imbm=
- comparm /7 cu 6 intersc"imbm=
- comparm /7 cu Q intersc"imbm=
3nregistrarea cu c"eia cea mai (grea /7 a a'uns la partea inferioar a tabelei.
asul 2" relucrm primele 4 nregistrri ale tabelei.
- comparm ] cu R intersc"imbm=
- comparm R cu S si nu intersc"imbm*
- comparm S cu ] nu intersc"imbm=
- comparm ] cu T intersc"imbm=
- comparm ] cu / intersc"imbm=
- comparm ] cu 1 nu intersc"imbm=
- comparm 1 cu 0 nu intersc"imbm=
- comparm 0 cu 6 intersc"imbm=
________________________________________________________________________________
Q]S
Structuri de date i algoritmi
_______________________________________________________________________________
- comparm 0 cu Q intersc"imbm=
3nregistrarea cu c"eia cea mai (grea 0 a a'uns la partea inferioar a tabelei.
___________________..
8lgoritmul de sortare prin metoda bulelor ordoneaz cele /7 !nregistrri ale tabelei 8 !n 1
pai.
#igura */.1. !ortarea unei ta.ele A cu 1> ele$ente 3rin al#orit$ul de sortare .a1at 3e metoda
bulelor.
VI.0.1.7. I$3le$entarea al#orit$ului
Specificarea problemei de sortare av)nd ca date de intrare tabela 8 dimensiunea ma%im a
tabelei & este urmtoarea*
D8I; 8 :=
<;g9MI8I; 8= A tabela 8 sortat !n ordine cresctoare B
Descrierea algoritmului de sortare !n 5seudocod este*
8MUO<#IC9M SO<I8<;_fubble_sort ;SI;*
&#I;XI; 8 :=
G *@ :=
<;5;IK
________________________________________________________________________________
Q]]
Structuri de date i algoritmi
_______________________________________________________________________________
OG *@ I<9;=
5;:I<9 i *@ /=G ;D;&9IK
D8&K 8-i2 E 8-i?/2 8I9:&#
temp *@ 8-i2=
8-i2 *@ 8-i?/2=
8-i?/2 *@ temp=
OG *@ F8MS;=
SFD8&K
SF5;:I<9
G *@ G -/=
5H:K&H:D OG SF<;5
SF8MUO<#IC
#mplementarea algoritmului de sortare prin metoda bulelor !n limba'ul 5ascal este*
Procedure bubble=
'e#in
. *@ n=
Re3eat
OG *@ true=
For i *@ / to G do
I, 8-i2 E8-i?/2 then
'e#in
temp *@ 8-i2=
8-i2 *@ 8-i?/2=
8-i?/2 *@ temp=
OG *@ ,alse=
End=
G *@G-/=
Until OG=
End=
VI.0.1.8. Co$3le/itatea al#orit$ului
8lgoritmul de sortare prin metoda bulelor este o metod de sortare simpl eficient pentru
un numr mic de elemente +mai puin de /S, dar nu pentru tabele mari.
:u necesit mult memorie dar este de dou ori mai lent dec)t algoritmul de sortare prin
inserare !n aproape orice situaie. Iimpul de e%ecuie depinde de structura iniial a datelor de
intrare adic de ordinea iniial al elementelor -SGi /0062. Dac tabela de dimensiune & este de'a
sortat e nevoie de un singur pas adic de &-/ operaii de comparaie !n aceast situaie algoritmul
________________________________________________________________________________
Q]6
Structuri de date i algoritmi
_______________________________________________________________________________
fiind de ordinul $+&,.
3n cazul cel mai nefavorabil sunt necesare & p +& - /, P Q operaii de comparaie i de & p +&
N /, P Q operaii de intersc"imbare. &omple%itatea algoritmului de sortare prin metoda bulelor este
( )
Q
n O !n aceast situaie. ;ste o metod stabil.
5erformana algoritmul de sortare se poate !mbunti prin introducerea unei variabile de tip
boolean care ne arat c)nd tabela este sortat !nainte de terminarea numrului ma%im de iteraii
-Iom /0062.
VI.0.0. Al#orit$ul de sortare 3rin selec4ie
VI.0.0.1. Descrierea #eneral a $etodei
Selecia direct este una dintre cele mai simple metode de sortare ce are performane foarte
bune pentru tabele mici fiecare element +!nregistrare, al tabelei fiind mutat !n procesul de sortare
cel mult o dat. ;ste o metod de sortare liniar pentru !nregistrri lungi si c"ei de cutare mici.
#mplementarea algoritmului este simpl dar necesit spaiu de memorie destul de mare pentru a
stoca dou tabele acest lucru fiind un nea'uns al algoritmului de sortare.
VI.0.0.0. Descrierea al#orit$ului
Se caut cel mai mic element din tabela de sortat A si se sc"imb cu elementul de pe
prima poziie. Dup aceea se caut al doilea element minim si se sc"imb cu elementul de
pe poziia a doua .a.m.d. 3n general !n pasul i se selecteaz elementul cu cea mai mic
c"eie dintre !nregistrrile A?i@" A?iA1@"" A?&@ si se sc"imb cu A?i@. &a rezultat dup i
pai al i2lea element minim va ocupa poziiile A?i@" A?iA1@"" A?&@ !n ordine sortat. Se
continu p)n c)nd toate elementele vor fi sortate !n ordine cresctoare.
Exemplul */.2" Sortarea tabelei 8 din Figura $#.Q folosind algoritmul de sortare prin selecie !n
ordine cresctoare*
________________________________________________________________________________
Q]1
Structuri de date i algoritmi
_______________________________________________________________________________

#igura */.2. !ortarea unei ta.ele A cu 1> ele$ente 3rin al#orit$ul de sortare prin selecie.
asul 1" relucrm nregistrrile 1+15 ale tabelei.
- cutm !nregistrarea cu c"eia de cutare minim. 8cesta este !nregistrarea cu c"eia / de pe poziia
] a tabelei=
- intersc"imbm !nregistrarea de pe poziia / cu !nregistrarea minim de pe poziia ]=
3nregistrarea cu c"eia cea mai (uoar / a a'uns !n poziia / a tabelei.
asul 2" relucrm nregistrrile 2+15 ale tabelei.
- cutm !nregistrarea cu c"eia de cutare minim. 8cesta este !nregistrarea cu c"eia Q de pe poziia
/7 a tabelei=
- intersc"imbm !nregistrarea de pe poziia Q cu !nregistrarea minim de pe poziia /7=
3nregistrarea cu c"eia cea mai (uoar Q a a'uns !n poziia Q a tabelei.
asul %" relucrm nregistrrile %+15 ale tabelei.
- cutm !nregistrarea cu c"eia de cutare minim. 8cesta este !nregistrarea cu c"eia T de pe poziia
S a tabelei=
- intersc"imbm !nregistrarea de pe poziia T cu !nregistrarea minim de pe poziia S=
3nregistrarea cu c"eia cea mai (uoar T a a'uns !n poziia T a tabelei.
__________________________________..
8lgoritmul de sortare prin metoda seleciei ordoneaz cele /7 !nregistrri ale tabelei 8 !n 1
pai.
VI.0.0.7. I$3le$entarea al#orit$ului
________________________________________________________________________________
Q]0
Structuri de date i algoritmi
_______________________________________________________________________________
Specificarea problemei de sortare av)nd ca date de intrare tabela 8 dimensiunea ma%im a
tabelei & este urmtoarea*
D8I; 8 :=
<;g9MI8I; 8= A tabela 8 sortat !n ordine cresctoare B
Descrierea algoritmului de sortare !n 5seudocod este*
8MUO<#IC9M SO<I8<;_#nserie ;SI;*
&#I;XI; 8 :=
5;:I<9 i *@ /=:-/ ;D;&9IK
min *@ i=
5;:I<9 ' *@ i ?/=: ;D;&9IK
D8&K 8-'2 J 8-min2 8I9:&#
Cin *@ '=
SFD8&K
SF5;:I<9
temp *@ 8-i2=
8-i2 *@ 8-min2=
8-min2 *@ temp=
SF5;:I<9
SF8MUO<#IC
#mplementarea algoritmului de sortare prin metoda seleciei !n limba'ul 5ascal este*
Procedure selection +2ar 8*arra\t\pe= n*inte#er,=
Var i min*integer= Ainde% B
'e#in
+or i *@ / to n-/ do
'e#in
min *@ i=
+or ' *@ i?/ to n do
#f 8-'2J8-min2 t"en min *@ '=
temp *@ 8-i2=
8-i2 *@ 8-min2=
8-min2 *@ temp=
________________________________________________________________________________
Q67
Structuri de date i algoritmi
_______________________________________________________________________________
End6
End6
VI.0.0.8. Co$3le/itatea al#orit$ului
8lgoritmul de sortare prin metoda seleciei este o metod de sortare eficient pentru un
numr mic de elemente de sortat dar nu pentru tabele mari.
Operaiile cele mai costisitoare sunt cele de cutare a !nregistrrii cu c"eia minim din
partea rmas nesortat !n tabel. Dup fiecare pas de cutare este necesar o inters"imbare deci
numrul intersc"imbrilor pentru & elemente este & 2 1. :umrul total de operaii de comparaie
pentru a gsi c"eia minim este -.nu /06]2*
( ) ( )
( ) ( )

+
/
/
Q
/
Q
/
/
n
i
n n n n
n n i n
8tunci performana algoritmului de sortare prin metoda seleciei este
( )
Q
n O
. 8celeai
performane se obin i !n medie i !n cazul cel mai nefavorabil c"iar i atunci c)nd tabela este de'a
sortat. Dac avem !nregistrri mari si c"ei mici algoritmul de sortare prin metoda seleciei va fi
alegerea cea mai bun.
VI.0.7. Al#orit$ul de sortare 3rin inserare
VI.0.7.1. Descrierea #eneral a $etodei
;ste un algoritm aproape la fel de simplu ca algoritmul de sortare prin selecie dar poate
mai fle%ibil.
Dac considerm c elementele A?1@...A?i21@ sunt de'a sortate atunci va trebui s inserm
elementul A?i@ !n locul potrivit pentru a menine ordinea de sortare aleas.
VI.0.7.0. Descrierea al#orit$ului
Fiind dat o tabel A cu & elemente nesortate parcurgem tabela si inserm fiecare element
!n locul potrivit pentru a menine ordinea de sortare aleas !ntre celelalte elemente considerate de'a
sortate.
5entru fiecare i @ Q.. & dac elementele A-/2 A-Q2_ A-i2 sunt sortate vom insera
elementul A-i2 !ntre lista elementelor sortate* A-/2 A-Q2_ A-i2.
;lementele aflate !n st)nga inde%ului i sunt sortate dar nu sunt !nc !n poziia lor final.
Iabela este complet sortat c)nd inde%ul a'unge la captul drept al tabelei.
5utem uura procesul inserrii +e%* c)nd cel mai mic element e greu de definit, prin introducerea
________________________________________________________________________________
Q6/
Structuri de date i algoritmi
_______________________________________________________________________________
unul element de 4limit4 A-72 c"eia care va avea o valoare mai mic dec)t orice valoare posibil a
unei c"ei din tabel. $om considera c aceast c"eie are valoarea

.
Exemplul */.%" Sortarea tabelei A din Figura $#.T folosind algoritmul de sortare prin inserare !n
ordine cresctoare*
A-'2 ] 8 S /7 T / 1 0 6 Q
pas /
pas Q
pas T
pas R
pas S
pas ]
pas 6
pas 1
pas 0
R ] 9 /7 T / 1 0 6 Q
R S ] 1> T / 1 0 6 Q
R S ] /7 7 / 1 0 6 Q
T R S ] /7 1 1 0 6 Q
/ T R S ]/7 < 0 6 Q
/ T R S ] 1 /7 = 6 Q
/ T R S ] 1 0/7 ; Q
/ T R S ] 6 1 0/7 0
/ Q T R S ] 6 1 0 /7
#igura */.%. !ortarea unei ta.ele A cu 1> ele$ente 3rin al#orit$ul de sortare prin inserare.
asul 1" (vem sortate nregistrrile dintre poziiile 1+1 ale tabelei.
- avem !nregistrarea de pe poziia Q cu c"eia R. Se caut poziia de inserare care este poziia /=
- se insereaz c"eia R !naintea poziiei de inserare=
Secvena de c"ei din poziiile /-Q ale tabelei sunt sortate.
asul 2 (vem sortate nregistrrile dintre poziiile 1+2 ale tabelei.
- avem !nregistrarea de pe poziia T cu c"eia S. Se caut poziia de inserare care este poziia Q=
- se insereaz c"eia S !naintea poziiei de inserare=
Secvena de c"ei din poziiile /-T ale tabelei sunt sortate.
asul %" (vem sortate nregistrrile dintre poziiile 1+% ale tabelei.
- avem !nregistrarea de pe poziia R cu c"eia /7. Se caut poziia de inserare care este poziia R=
- se insereaz c"eia /7 !naintea poziiei de inserare=
________________________________________________________________________________
Q6Q
Structuri de date i algoritmi
_______________________________________________________________________________
Secvena de c"ei din poziiile /-R ale tabelei sunt sortate.
asul 4" (vem sortate nregistrrile dintre poziiile 1+4 ale tabelei.
- avem !nregistrarea de pe poziia S cu c"eia T. Se caut poziia de inserare care este poziia /=
- se insereaz c"eia T !naintea poziiei de inserare=
Secvena de c"ei din poziiile /-S ale tabelei sunt sortate.
__________________________________..
8lgoritmul de sortare prin metoda inserrii ordoneaz cele /7 !nregistrri ale tabelei 8 !n 0
pai.
VI.0.7.7. I$3le$entarea al#orit$ului
Specificarea problemei de sortare av)nd ca date de intrare tabela A dimensiunea ma%im a
tabelei & este urmtoarea*
D8I; 8 :=
<;g9MI8I; 8= A tabela 8 sortat !n ordine cresctoare B
Descrierea algoritmului de sortare !n 5seudocod este*
8MUO<#IC9M SO<I8<;_#nserare ;SI;*
&#I;XI; 8 :=
8-72 *@ =
5;:I<9 i *@ Q=: ;D;&9IK
' *@ i=
&HII#C5 8-'2 J 8-' -/2
temp *@ 8-'2=
8-'2 *@ 8-' -/2=
8-' -/2 *@ temp=
' *@ ' -/=
SF&HI
SF5;:I<9
SF8MUO<#IC
________________________________________________________________________________
Q6T
Structuri de date i algoritmi
_______________________________________________________________________________
#mplementarea algoritmului de sortare prin metoda inserrii !n limba'ul 5ascal este*
Procedure insertion + 2ar 8* arra\t\pe= n*inte#er ,=
Var i '* inte#er=
'e#in
8-72 *@ minus_infinit= Aminus_infinit este o constant de valoare foarte micB
+or i*@Q to n do Ai' - variabila de tip inde%B
'e#in
' *@ i=
)hile 8-'2J8-'-/2 do
'e#in
temp *@ 8-'2=
8-'2 *@ 8-' -/2=
8-' -/2 *@ temp=
' *@ '-/=
End6
End6
End6
VI.0.7.8. Co$3le/itatea al#orit$ului
8lgoritmul de sortare prin inserare sort este un algoritm de sortare liniar* &omple%itatea
algoritmului este $+&, pentru tabele care conin & elemente sortate sau aproape sortate.
&omple%itatea algoritmului de sortare prin inserare depinde de numrul de inserri i
translatri care este influenat de ordinea iniial al elementelor. 3n caz general sunt necesare
R
Q
&
operaii de comparaie i
1
Q
&
operaii de intersc"imbare deci ordinea comple%itii este $+&
Q
,.
-Ire /01R2
VI.0.8. Al#orit$ul de sortare ,'ell
VI.0.8.1. Descrierea #eneral a $etodei
Sortarea prin micorarea incrementului numit i sortare S"ell este o e%tensie simpl al
metodei de sortare prin inserare !mbuntind performanele algoritmului prin intersc"imbarea
elementelor cele mai !ndeprtate. #deea de baz o constituie rearan'area elementelor din tabela A !n
________________________________________________________________________________
Q6R
Structuri de date i algoritmi
_______________________________________________________________________________
aa fel !nc)t lu)nd fiecare al +-lea element +!ncep)nd de oriunde, s obinem o tabel sortat.
8stfel spunem c tabela este +-sortat. O tabel +-sortat este format din + subtabele sortate
independent. Folosind astfel o procedur pentru fiecare secven de valori ale lui + care se termin
pentru valoarea / va rezulta o tabel sortat.
S considerm tabela A i un increment mai mare dec)t / fie acesta +. $om avea atunci
urmtoarele subtabele*
Subtabelul1/ A-/2 A-+ ?/2 A-Q+ ?/2 _.
Subtabelul2/ A-Q2 A-+ ?Q2 A-Q+ ?Q2 _.
Subtabelul>/ A-T2 A-+ ?T2 A-Q+ ?T2 _.
________________...
Subtabelul +/ A-+2 A-2+2 A-T+2 _.

Dac sortm fiecare din cele + subtabele folosind de e%emplu algoritmul de sortare prin
inserare atunci elementele (!ndeprtate se vor apropia srind cu pasul + ctre st)nga. 3n final vom
proceda la o sortare prin inserare cu incrementul / ceea ce va necesita un timp foarte scurt cci
tabela nu mai necesit corecii importante ma'oritatea !nregistrrilor fiind !n poziia cresctoare
dorit.
8lgoritmul de sortare ,'ell necesit o mulime de incremeni
/ /
+ + +
t t

ultimul
increment +
1
fiind egal cu /.
O formula des utilizat !n practic propune urmtoarele formule pentru secvena de
incremeni*
/ T = /
/ /
+
+ i i
+ + +
+]./,
Secvena este /R/T R7 /Q/ _. cu formula general*
Q
/ T

i
i
+ +].Q,
Deci numrul total de incremeni va fi*

( )
]
/ Q log
T
+ n t
+].T,
VI.0.8.0. Descrierea al#orit$ului
8lgoritmul de sortare ,'ell necesit mai multe operaii dec)t algoritmul de sortare prin
inserare dar la fiecare pas elementele ce urmeaz a fi intersc"imbate efectueaz salturi (lungi spre
poziia corect ceea ce ar trebui s duc la !mbuntirea performanelor algoritmului de sortare.
3n general algoritmul de sortare ,'ell poate fi descris astfel -8"o /0062*
5;:I<9 G *@ t=/ ;D;&9IK
5;:I<9 d *@ 7=
/
(
+
;D;&9IK
&d;8CK SO<I8<;_#nserare+LSubtabela d,=
Exemplul */.4" Sortarea tabelei 8 din Figura $#.R +a, folosind algoritmul de sortare ,'ell !n ordine
________________________________________________________________________________
Q6S
Structuri de date i algoritmi
_______________________________________________________________________________
cresctoare*
asul 1" Crearea celor ' subtabele +Fig. $#.R. +b,,
- S presupunem c am ales incrementul + @ S. Se creeaz cele S subtabele*
Subtabela 1* // ] /
Subtabela 2* /7 S 7
Subtabela >* 0 R
Subtabela ;* 1 T
Subtabela .* 6 Q
8- 2
A[1]A[2]A[3]
8-R2 8-S2 8-]2 8-62 8-12 8-02 8-/72 8-//2 8-/Q2
+a,
11 10 9 8 7 6 5 4 3 2 1 0
+b,
11 6 1
10 5 0
9 4
8 3
7 2
+c,
1 6 11
0 5 10
4 9
3 8
2 7
+d,
1 0 4 3 2 6 5 9 8 7 11 10
+e,
0 1 2 3 4 5 6 7 8 9 10 11
#igura */.4. !ortarea unei ta.ele A cu 10 ele$ente 3rin al#orit$ul de sortare ,'ell.
________________________________________________________________________________
Q6]
Structuri de date i algoritmi
_______________________________________________________________________________
asul 2 ,ortarea celor - subtabele +Fig. $#.R. +c,,
asul %" =abela iniial dup pasul de sortare cu incrementul - +Fig. $#.R. +d,,
asul %" =abela iniial dup pasul de sortare cu incrementul 1 +Fig. $#.R. +d,,
__________________________________..
VI.0.8.7. I$3le$entarea al#orit$ului
Specificarea problemei de sortare av)nd ca date de intrare tabela A dimensiunea ma%im a
tabelei & este urmtoarea*
D8I; 8 :=
<;g9MI8I; 8= A tabela 8 sortat !n ordine cresctoare B
Descrierea algoritmului de sortare !n 5seudocod este*
8MUO<#IC9M SO<I8<;_S"ell ;SI;*
&#I;XI; 8 :=
inc *@ #ncrement_intial+n,=
&KII#C5 inc E@ / ;D;&9IK
5;:I<9 i *@ inc= n-/ ;D;&9IK
' *@ i=
% *@ 8-i2=
&KII#C5 ' E@ inc i 8-' - inc2 E % ;D;&9IK
8-'2 *@ 8-' - inc2=
' *@ ' - inc=
SF&HI
8-'2 *@ %=
SF5;:I<9
inc *@ #ncrement_urmtor+inc n,=
SF8MUO<#IC
$bservaie"
Secvena de incrementare este determinat iterativ folosind funciile #ncrement_intial+n, i
________________________________________________________________________________
Q66
Structuri de date i algoritmi
_______________________________________________________________________________
#ncrement_urmtor+inc n,. Funcia #ncrement_intial+n, va returna cel mai mare increment
utilizabil pentru sortarea unei tabele de dimensiune n.
Funcia #ncrement_urmtor+inc n, va returna cel mai mare increment dar mai mic dec)t inc
utilizabil pentru sortarea unei tabele de dimensiune n.
Funciile #ncrement_intial+n, i #ncrement_urmtor+inc n, vor genera irul descresctor de
incremeni
/ /
+ + +
t t

@/.
Se presupune c #ncrement_urmtor+/ n, @ 7. &iclul e%terior se va termina c)nd inc @ /.
#mplementarea algoritmului de sortare prin metoda inserrii !n limba'ul 5ascal este*
Procedure S"ellsort + 2ar 8* arra\-/.. :2 of inte#er,=
Var i ' incr*integer=
'e#in
incr *@ : di2 Q= A Funcia #ncrement_intial+n,B
)hile incr E 7 do
'e#in
+or i *@ / to incr do
'e#in
G *@ i?incr=
)hile GJ@ : do
'e#in
% *@8-G2= A% @ elementul de comparatB
' *@ G-incr=
)hile 'E7 do
'e#in
I, %.Ge\ J 8-'2.Ge\ then
'e#in
Sc"imba +8-'?incr2 8-'2,=
' *@ ' - incr=
End=
G *@ G?incr
End
End=
incr *@ incr di2 Q= AFuncia #ncrement_urmator+incn,B
End=
End=
End=

VI.0.8.8. Co$3le/itatea al#orit$ului
________________________________________________________________________________
Q61
Structuri de date i algoritmi
_______________________________________________________________________________
&omple%itatea algoritmului de sortare ,'ell sort este greu de analizat greu de comparat cu
alte metode fiind dependent i de mulimea de incremeni. 5entru acest algoritm de sortare
cercetri empirice au artat c comple%itatea este !n general
( ) & & O log
-8"o /0062. ;%ist
mulimi de incremeni pentru care s-a dovedit c comple%itatea este ( ) ( )
Q
log & & O . :u se cunoate
p)n !n prezent o mulime optimal de incremeni pentru algoritmul de sortare ,'ell.
VI.0.9. Al#orit$ul de sortare rapid :>uic?sort;
VI.0.9.1. Descrierea #eneral a $etodei
8lgoritmul de sortare considerat a fi cel mai rapid de comple%itate
( ) & & O log
este numit
algoritm de sortare rapid +juicGsort, folosind partiionarea ca idee de baz. ;ste mai rapid dec)t
orice metod de sortare simpl se comport eficient pentru fiiere sau tabele mari dar ineficient
pentru cele de mici dimensiuni.
Strategia de baz are la baz o te"nic de tip 4divide et impera4 -Miv /01]2 pentru c este
mai uor de sortat dou tabele mici dec)t o tabbel mare. 8lgoritmul este uor de implementat
consum mai puine resurse dec)t orice alt metod de sortare.
VI.0.9.0. Descrierea al#orit$ului
8v)nd o tabel A cu & elemente alegem o c"eie pivot * !n 'urul creia rearan'm
elementele. 5ivotul poate fi ales !n mai multe moduri. O modalitate simpl ar fi s alegem ca pivot
primul element.
Dup ce avem pivotul partiionm tabela. 5rin partitionare toate elementele cu c"ei mai
mici dec)t pivotul le vom plasa !n partiia st)ng a tabelei iar elementele cu c"ei mai mari dec)t
pivotul !n partiia dreapt.
Dup aceea apelm recursiv algoritmul de sortare rapid relativ la cele dou subtabele
formate prin partiionare.
Se consider urmtoarea sc"em de comparaie-intersc"imb*
- folosindu-se Q indicatori i" j cu valorile iniiale i @ / i j @ & se compar !nregistrarea cu
numrul de ordine i cu !nregistrarea cu numrul de ordine j=
- algoritmul mut pe i la dreapta p)n c)nd gsete o c"eie mai mare dec)t pivotul * si mut
pe j la st)nga p)n c)nd gsete o c"eie mai mic dec)t pivotul *.
________________________________________________________________________________
Q60
Structuri de date i algoritmi
_______________________________________________________________________________
- dac nu este necesar intersc"imbarea se decrementeaz j cu / si se repet procesul de
comparaie=
- dac apare un intersc"imb se incrementeaz i cu / si se continu compararea mrind i p)n
la apariia unui nou intersc"imb=
- se decrementeaz j continu)ndu-se acest proces de numit 4ardere a lum)nrii la ambele
capete4 p)n c)nd i E@ j.
5rocedura se apeleaz recursiv printr-un apel de forma* SO<I8<;_<apida+A / &,=
Exemplul */.-" Sortarea tabelei A din Figura $#.R +a, folosind algoritmul de sortare ,'ell !n ordine
cresctoare*
asul 1" (legem pivotul! elementul cu c'eia @ de pe poziia 1
- &omparm pe 6 cu R 6 E R i intersc"imbm=
asul 2" Caut de la st&nga la dreapta elementul cu c'eia mai mare dec&t @ :indexul i;
- 8cesta este 1 comparm pe 6 cu 1 1 E 6 i intersc"imbm=
asul %" Caut de la dreapta la st&nga elementul cu c'eia mai mic dec&t @ :indexul 8;
- 8cesta este ] i intersc"imbm cu elementul de pe poziia i=
5rocesul de 4ardere a lum)nrii la ambele capete4 se continu p)n c)nd i E@ j" atunci tabela
se !mparte !n dou subtabele care se sorteaz separat recursiv p)n c)nd fiecare subtabel va conine
doar un element.
________________________________________________________________________________
Q17
Structuri de date i algoritmi
_______________________________________________________________________________
#igura */.-. !ortarea unei ta.ele A cu 10 ele$ente 3rin al#orit$ul de sortare ,'ell.
VI.0.9.7. I$3le$entarea al#orit$ului
Specificarea problemei de sortare av)nd ca date de intrare tabela 8 dimensiunea ma%im a
tabelei & este urmtoarea*
D8I; 8 :=
<;g9MI8I; 8= A tabela 8 sortat !n ordine cresctoare B
Descrierea general a algoritmului de sortare !n 5seudocod este*
8MUO<#IC9M SO<I8<;_<apid +i ', ;SI;*
D8&K L!ntre 8-i2 i 8-'2 e%ist cel puin dou c"ei distincte 8I9:&#
Lfie v *@ cea mai mare dintre cele dou c"ei distincte=
Lpermutm 8-i2 _. 8-'2 astfel !nc)t pentru
j ( i +/
s avem*
elementele 8-i2 _. 8-G-/2 au c"ei strict mai mici dec)t pivotul v=
elementele 8-G2 _. 8-'2 au c"ei mai mari sau egale cu pivotul v=
&d;8CK SO<I8<;_<apid +i G-/,
&d;8CK SO<I8<;_<apid +G ',
________________________________________________________________________________
Q1/
Structuri de date i algoritmi
_______________________________________________________________________________
SF8MUO<#IC
#mplementarea algoritmului de sortare prin metoda rapid !n limba'ul 5ascal este*
$ariabilele left si rig+t reprezint !nceputul si sf)ritul tabelei sau subtabelei.
Procedure e9#&.+2ar 8*arra6t6pe= left rig"t* inte#er,=
Var i'* inte#er=
v t* ele%=
'e#in
i *@ left= ' *@ rig"t= v *@ 8-l2=
Re3eat
)hile 8-i2.Ge\ J v.Ge\ do
i *@ i?/=
)hile 8-'2.Ge\ E v.Ge\ do
' *@ '-/=
I, i J ' then
'e#in
t *@ 8-i2=
8-i2 *@ 8-'2=
8-'2 *@ t=
End
Until i E@ ' Apentru siguran= conform algoritmului era suficient i @ 'B
I, left J '-/ then
e9#&. +left '-/,=
I, i?/ J rig"t then
e9#&. +i?/ rig"t,=
End=
VI.0.9.7. Co$3le/itatea al#orit$ului
3n algoritmului de sortare rapid fiecare element este comparat cu pivotul adic avem
comple%itatea O+&,.
#n continuare tabela este divizat !n dou pri fiecare parte este iari divizat !n dou pari
_. .a.m.d. Dac fiecare parte este !mprit apro%imativ !n dou 'umti egale vom avea log
Q
&
operaii de !mprire.
Deci comple%itatea algoritmului de sortare rapid este !n caz mediu O+&log
Q
&, iar !n caz
nefavorabil este ( )
Q
& O -.nu /06]2.
Dup cum am artat mai sus algoritmul de sortare rapid este o metod bun !n cazul
general dar nu i !n cazul nefavorabil c)nd este preferabil alegerea pivotului conform formulei
________________________________________________________________________________
Q1Q
Structuri de date i algoritmi
_______________________________________________________________________________
+].Q,. 5erformanele algoritmului de sortare rapid sunt dependente de ordinea datelor de intrare. De
aceea nu este o metod de sortare stabil.
VI.0.:. Al#orit$ul de sortare prin interclasare :mergesort;
VI.0.:.1. Descrierea #eneral a $etodei
8lgoritmul de sortare prin interclasare se bazeaz pe urmtoarea idee* pentru a sorta o tabel
cu & elemente !mprim tabela iniial !n dou subtabele pe care le sortm separat si le interclasm.
;ste o metod de sortare care folosete ca strategie de baz te"nica 4di*ide et i%pera4 conform
creia o problema care se poate descompune !n alte dou subprobleme de acelai tip se rezolv cale
dou subprobleme iar rezultatele subproblemelor se combin pentru a genera rezultatul problemei
iniiale. 8lgoritmul de sortare prin interclasare sorteaz elementele !n ordine cresctoare.
VI.0.:.0. Descrierea al#orit$ului
Fiind dat o tabel A cu & elemente !mprim tabela !n dou pri sortm separat fiecare
parte si (!mbinm prin interclasare cele dou pri !ntr-o tabel au%iliar temporar. Dac o parte
conine doar un singur element atunci considerm acea parte sortat.
3mprirea tabelei !n dou pri presupune gsirea elementului de mi'loc*
+pri% ? ulti%, P Q +].R,
5entru a (!mbina 'umtile sortate interclasm fiecare subtabel comparm succesiv
perec"ile de c"ei +din fiecare parte, si punem valoarea mai mic !ntr-o tabela temporal. 8lgoritmul
general necesit urmtorii pai*
/. 3mparte tabela !n dou
Q. Sorteaz 'umtatea st)ng
T. Sorteaz 'umtatea dreapt
R. 3mbin prin interclasare cele dou 'umti sortate !ntr-o tabel sortat.
3mbinarea celor dou pri necesit un numr de operaii de ordinul O+&,. 8lgoritmul se
termin c)nd o subtabel nu mai are nici o !nregistrare si mutm !nregistrrile rmase din cealalt
subtabel !n tabela temporar. Dup pasul de interclasare putem copia tabela temporar sortat !n
tabela original.
________________________________________________________________________________
Q1T
Structuri de date i algoritmi
_______________________________________________________________________________

#igura */.1. VP$.inareaR 3rin interclasare a unei ta.ele A cu 1>> ele$ente.
asul 1" (flm mi8locul tabelei! utiliz&nd formula 1.4
- mi'loc *@ +/ ? 0, P Q @ S=
asul 2 .mprim tabela n dou subtabele fat de elementul de mi8loc.
- avem subtabela format din !nregistrrile / Q T R=
- avem subtabela format din !nregistrrile S ] 6 1 0=
asul %" ,ortm subtabela st&ng.
- avem !nregistrrile cu c"eile sortate* Q S 6 1.
asul 4" ,ortm subtabela dreapt.
- avem !nregistrrile cu c"eile sortate* / T R ] 0.
asul -" /nterclasm subtabela st&ng i dreapt n tabela =emp.
asul 1" Copiem nregistrrile din tabela =emp n tabela original (.
________________________________________________________________________________
Q1R
Structuri de date i algoritmi
_______________________________________________________________________________
#igura */.@. !ortarea unei ta.ele A cu = ele$ente 3rin al#orit$ul de sortare prin interclasare.
VI.0.:.7. I$3le$entarea al#orit$ului
Specificarea problemei de sortare av)nd ca date de intrare tabela A dimensiunea ma%im a
tabelei & este urmtoarea*
D8I; 8 :=
<;g9MI8I; 8= A tabela 8 sortat !n ordine cresctoare B
Descrierea general a algoritmului de sortare !n 5seudocod este*
8MUO<#IC9M SO<I8<;_#nterclasare ;SI;*
&#I;XI; 8 :=
Bnde- *@ 7ri%StngC
&HII#C5 Lmai sunt elemente !n 'umtatea st)ng si !n cea dreapt
D8&K c+eia_Bnde-1curent1stng D c+eia_Bnde-1curent1drept 8I9:&#
)e%p-Bnde-2 *@ 8-Bnde- curent stng2
Bnde-1curent1stng *@ Bnde-1curent1stng ? /=
8IF;M
)e%p-Bnde-2 *@ 8-Bnde- curent1 drept2=
________________________________________________________________________________
Q1S
Structuri de date i algoritmi
_______________________________________________________________________________
Bnde-1curent1drept *@ Bnde-1curent1drept ? /=
L&opiaz toate elemente rmas din 'umtatea st)ng !n tabela )e%p=
L&opiaz toate elemente rmas din 'umtatea deapt !n tabela )e%p=
L&opiaz toate elemente sortate din tabela )e%p !n tabela A=
SF8MUO<#IC
#mplementarea algoritmului de interclasare !n limba'ul 5ascal este*
$ariabilele lfirst" llast" rfirst" rlast indic cele dou capete ale subtabelei din st)nga si ale
subtabelei din dreapta. $ariabilele curent1left si curent1rig+t reprezint elementul curent din st)nga
respectiv din dreapta. )e%p este tabela temporar folosit pentru sortare.
Procedure #nterclasare +2ar 8*arra6t6pe= lfirst llast rfirst rlast* inte#er,=
2ar
temp* arra6t6pe=
inde% curent_left curent_rig"t* inte#er=
'e#in
curent_left*@lfirst=
curent_rig"t*@rfirst=
inde%*@lfirst=
)hile +curent_leftJ@llast, and +curent_rig"tJ@rlast, do
'e#in
I, 8-curent_leftJ 8-curent_rig"t2 then
'e#in
Iemp-inde%2*@8-curent_left2=
curent_left*@curent_left?/=
End
Else
'e#in
Iemp-inde%2*@8-curent_rig"t2=
curent_rig"t*@curent_rig"t?/=
End=
inde% *@ inde%?/=
End6
)hile curent_leftJ@llast do
'e#in
Iemp-inde%2*@8-curent_left2=
curent_left*@curent_left?/=
inde%*@inde%?/=
End=
)hile curent_rig"tJ@rlast do
'e#in
Iemp-inde%2*@8-curent_rig"t2=
curent_rig"t*@curent_rig"t?/=
inde%*@inde%?/=
________________________________________________________________________________
Q1]
Structuri de date i algoritmi
_______________________________________________________________________________
End=
+or inde%*@lfirst to rlast do
8-inde%2 *@ Iemp-inde%2
End6
#mplementarea algoritmului de sortare prin interclasare! !n limba'ul 5ascal este*
Procedure SO<I8<;_#nterclasare +var 8* arra6t6pe= firstlast*integer,=
2ar
middle* inte#er=
'e#in
I, first J last then
'e#in
middle*@+first?last, di2 Q=
SO<I8<;_#nterclasare +8 first middle,=
SO<I8<;_#nterclasare +8 middle ?/ last,=
#nterclasare +8 first middle middle ?/ last,=
End=
End=
VI.0.:.7. Co$3le/itatea al#orit$ului
Ca'oritatea operaiilor efectuate de algoritmul de sortare prin interclasare sunt efectuate de
operaiile de comparare i de copiere.
3n cadrul operaiilor de interclasare fiecare !nregistrare din cele dou subtabele este
comparat aceast !nsemn)nd o comple%itate de ordinul $+&,.
&opierea !nregistrrilor din tabela temporar )e%p !n tabela original A necesit un numr
de operaii tot de ordinul $+&,.
5rocedura de sortare propriu-zis este recursiv i este apelat recursiv pentru 'umtatea
st)ng i pentru 'umtatea dreapt. Iabela iniial A poate fi !mprit de cel mult log
Q
& ori. Ma
fiecare !mprire se e%ecut operaia de interclasarere care este de ordinule $+&,.
8tunci algoritmul de sortare prin interclasare va avea o comple%itate de ordinul O+& log
Q
&,
!n toate dintre cele trei cazuri -Iom /0062. ;ste o metod stabil. 8lgoritmul de sortare prin
interclasare nu este dependent de ordinea iniial a elementelor.
Dezavanta'ul algoritmului de sortare prin interclasare este c necesit o tabel au%iliar
)e%p de dimensiune & egal cu dimensiunea tabelei de sortat A.
VI.0.:. Al#orit$ul de sortare 3rin ansambluri :'eapsort;
________________________________________________________________________________
Q16
Structuri de date i algoritmi
_______________________________________________________________________________
VI.0.:.1. Descrierea #eneral a $etodei
0efiniia 1.1." 9n arbore binar posed proprietatea de ansamblu dac orice nod al su verific
proprietatea* c"eia de cutare a nodului este mai mare sau egal dec)t c"eia de cutare a nodului
fiu_st)nga sau dec)t c"eia de cutare a nodului fiu_dreapta.
0efiniia 1.2." 9n ansamblu +'eap, este un arbore binar complet ce posed proprietatea de
ansamblu +Definiia ]./,.
&aracteristica de baz a acestei structuri de date numit ansamblu! este c modificarea
valorii c"eii de cutare a unui nod se poate face uor pstr)nd totui proprietatea de ansamblu.
5resupun)nd c c"eia de cutare a unui nod_fiu depete c"eia de cutare a nodului_tat este
suficient s intersc"imbm !ntre ele cele dou noduri s continum procedeul pe drumul ascendent
ctre nodul rdcin p)n c)nd proprietatea de ansamblu este restabilit. $om spune c valoarea
modificat a fost filtrat ctre noua poziie -8nd /00S2.
Dac dimpotriv c"eia de cutare a nodului_tat scade devenind mai mic dec)t c"eia de
cutare a unui nod_fiu atunci este suficient s sc"imbm !ntre ele nodul_tat cu nodul_fiu av)nd
c"eia de cutare cea mai mare apoi s continum procesul !n mod descendent p)n c)nd
proprietatea de ansamblu este restabilit. $om spune c valoarea modificat a fost cernut ctre
noua sa poziie -8nd /00S2.
Cetoda de sortare prin ansambluri se bazeaz pe reprezentarea arborescent al unei tabele
date.
VI.0.:.0. Descrierea al#orit$ului
a. Construirea ansamblului * Descrierea general a algoritmului !n 5seudocod este*
Specificarea problemei de construire a ansamblului av)nd ca date de intrare tabela A
dimensiunea ma%im a tabelei & este urmtoarea*
D8I; 8 :=
<;g9MI8I; 8nsamblu= A (nsamblul construit din tabela nesortat 8 B
Descrierea general a algoritmului de creare al ansamblului !n 5seudocod este*
8MUO<#IC9M &reare_8nsamblu ;SI;*
&#I;XI; 8 := A (nsamblul construit din tabela nesortat 8 B
5;:I<9 i *@ +: div Q,= / ;D;&9IK
&d8CK &ernere +8 : i,=
________________________________________________________________________________
Q11
Structuri de date i algoritmi
_______________________________________________________________________________
SF-5;:I<9
SF8MUO<#IC
8MUO<#IC9M &ernere +f C ', ;SI;*
G *@ '* A Se cerne valoarea din tabela f-'2 B
<;5;IK
l *@ G= A Usete fiul cu valoarea cea mai mare B
D8&K +Ql J@ C, i +f-Ql2 E f-G2, 8I9:&#
G *@ Ql=
SFD8&K
D8&K +Ql J C, i +f-Ql ?/2 E f-G2, 8I9:&#
G *@ Ql ?/=
SFD8&K
temp *@ f-l2=
f-l2 *@ f-G2=
f-G2 *@ temp=
5H:K&H:D l @ G SF<;5
SF8MUO<#IC
3n Figura $#.1 avem un e%emplu de construire a unui ansamblu. :odurile reprezentate cu
cercuri __ semnific elementele care constituie ansamblul iar nodurile reprezentate cu cercuri
__ reprezint noduri care violeaz proprietatea ansamblului.

(a) (b) (c)
(d) (e) (f)ansamblu
#igura */.3. Construirea unui ansa$.lu A cu = ele$ente.
7oEitia 1 2 > ; . F : G H
________________________________________________________________________________
Q10
Structuri de date i algoritmi
_______________________________________________________________________________
ta.ela
ori#inala
; 9 < 0 7 = 1 : 8
dupa +b, 6 S 1 ] T 0 / Q R
dupa +c, 6 S 0 ] T 1 / Q R
dupa +d, 6 ] 0 S T 1 / Q R
dupa +e, 0 ] 1 S T 6 / Q R
asul 1" Construim arborele binar corespunztor tabelei originale
- secvena de noduri este* 6 S 1 Q T 0 / ] R=
- arborele binar este reprezentat !n Figura $#.1.a.
asul 2" 9odul cu c'eia 2 violeaz proprietatea de ansamblu +arborele binar este reprezentat !n
Figura $#.1.b.,
- cernem valoarea nodului cu c"eia Q=
- intersc"imbm nodul cu c"eia Q cu nodul cu c"eia 0=
- arborele binar este reprezentat !n Figura $#.1.d.
asul %" 9odul cu c'eia 3 violeaz proprietatea de ansamblu +arborele binar este reprezentat !n
Figura $#.1.d.,
- cernem valoarea nodului cu c"eia 1=
- intersc"imbm nodul cu c"eia Q cu nodul cu c"eia ]=
- arborele binar este reprezentat !n Figura $#.1.c.
asul 4" 9odul cu c'eia - violeaz proprietatea de ansamblu +arborele binar este reprezentat !n
Figura $#.1.d.,
- cernem valoarea nodului cu c"eia S=
- intersc"imbm nodul cu c"eia S cu nodul cu c"eia ]=
- arborele binar este reprezentat !n Figura $#.1.e.
asul -" 9odul cu c'eia @ violeaz proprietatea de ansamblu +arborele binar este reprezentat !n
Figura $#.1.e.,
- cernem valoarea nodului cu c"eia 6=
________________________________________________________________________________
Q07
Structuri de date i algoritmi
_______________________________________________________________________________
- intersc"imbm nodul cu c"eia S cu nodul cu c"eia 0=
- arborele binar este reprezentat !n Figura $#.1.f.
3n Figura $#.1.f aven reprezentat ansamblul construit din tabela 8.
#mplementarea algoritmului de creare al ansamblului !n limba'ul 5ascal este*
Procedure &reare_8nsamblu +2ar 8* arra6t6pe first last* inte#er,=
2ar
r ma%* inte#er=
oG* .oolean=
'e#in
r *@ first= oG*@,alse=
)hile +raQ J@ last, and not oG do
'e#in
#f raQ @ last then
ma% *@raQ
Else
I, 8-raQ2 E 8-raQ?/2 then
ma% *@ raQ
Else
ma% *@ raQ?/=
I, 8-r2 J 8-ma%2 then
'e#in
SWap+ 8-r2 8-ma%2 ,=
r *@ ma%=
End
Else
oG *@ true=
End
End=
b. ,ortare cu ansambluri" Fiind dat o tabel nesortat A de dimensiune & s presupunem c am
construit ansamblul corespunztor tabelei A. 8stfel vom putea accesa uor elementul ma%im din
tabel pentru c acesta este c"iar nodul rdcin al ansamblului si !n reprezentarea cu a'utorul
tabelei va fi !nregistrarea A-/2. 8ceast !nregistrare va fi intersc"imbat cu !nregistrarea A-&2. :e
vom ocupa !n continuare de primele & -/ !nregistrri A-/2 _ A-&-/2 care alctuiesc aproape un
ansamblu iari apelm la algoritmul de creare al ansamblului pentru aceste !nregistrri _.
.a.m.d. p)n c)nd toate !nregistrrile vor fi la locul potrivit adic toate !nregistrrile vor fi sortate.
VI.0.:.7. I$3le$entarea al#orit$ului
________________________________________________________________________________
Q0/
Structuri de date i algoritmi
_______________________________________________________________________________
Specificarea problemei de sortare av)nd ca date de intrare tabela 8 dimensiunea ma%im a
tabelei & este urmtoarea*
D8I; 8 :=
<;g9MI8I; 8= A tabela 8 sortat !n ordine cresctoare B
Descrierea general a algoritmului de sortare !n 5seudocod este*
8MUO<#IC9M SO<I8<;_8nsamblu ;SI;*
&#I;XI; 8 :=
&d;8CK &reare_8nsamblu*
5;:I<9 i *@ := Q ;D;&9IK
temp *@ 8-l2=
8-/2 *@ 8-i2=
8-i2 *@ temp=
&d;8CK &ernere +f i -/ /,=
SF-5;:I<9
SF8MUO<#IC
8lgoritmul Sortare_8nsambluri construiete ansamblul original pentru elementele nesortate
si sorteaz elementele !n ansamblu prin sc"imbarea nodului rdcin A-/2 cu ultimul element
nesortat A-i2 apoi rearan'eaz elementele rmase.
#mplementarea algoritmului de sortare prin ansambluri !n limba'ul 5ascal
este*
Procedure SO<I8<;_8nsamblu +2ar 8* arra\t\pe= :* inte#er,=
Var i* inte#er=
'e#in
&reare_8nsamblu +8 / :,=
+or i*@ : do-nto Q do AsortareB
'e#in
SWap+8-/28-i2,=
&reare_8nsamblu +8/i-/,=
End
End=
VI.0.:.8. Co$3le/itatea al#orit$ului
________________________________________________________________________________
Q0Q
Structuri de date i algoritmi
_______________________________________________________________________________
9n arbore binar complet cu & noduri are nevoie de logQ+& ?/, operaii !n cazul cel mai
nefavorabil pentru a cerne nodul rdcin astfel !nc)t s a'ung !n poziia de nod frunz.
8lgoritmul &reare_8nsamblu efectueaz un numr de log
Q
& intersc"imbri deci comple%itatea sa
va fi $+log
Q
&,. -Iom /0062
&iclul 5;:I<9 din algoritmul de sortare se va e%ecuta de &-/ ori deci comple%itatea
algoritmului de sortare este O+&log
Q
&,.
8lgoritmul de sortare prin ansambluri are comple%itatea O+&log
Q
&, !n toate din cele trei
cazuri de analizat* cazul general favorabil i nefavorabil -.nu /06]2.
5entru tabele mici algoritmul de sortare prin ansambluri este ineficient dar foarte eficient
pentru cele tabele mari. :u necesit memorie suplimentar. ;ficiena algoritmul de sortare prin
ansambluri nu este afectat de ordinea iniial a elementelor.
VI.0.;. Al#orit$ul de sortare RADIA
VI.0.;.1. Descrierea #eneral a $etodei
Sortarea <8D#D +sau sortarea digital , este o metod de sortare care precede apariia
calculatoarelor electronice fiind inspirat dintr-o metod de sortare mecanic a cartelelor perforate.
;ste una din cele mai eficiente metode de sortare intern cu condiia ca dimensiunea & a numrului
de !nregistrri de sortat s nu fie prea mic iar c"eile dup care se face ordonarea s nu fie prea mici.
8lgoritmul de sortare <adi% trateaz c"eile ca i cum ar fi numere reprezentate !ntr-o baz
= utiliz)nd cifrele din reprezentarea individuale a numerelor +de e%emplu caracterele pot fi
reprezentate !n baz /Q1,.
Dac folosim clasica reprezentare zecimal deci = @ /7 vom folosi /7 buzunare
corespunz)nd celor /7 cifre zecimale ale sistemului de numeraie zecimal. Fiecare coloan este
sortat !ncep)nd cu rangul cel mai puin semnificativ al c"eilor +primul din dreapta, mut)nd
!nregistrrile din zona de intrare a algoritmului de sortare !ntr-o zon au%iliar a algoritmului de
sortare. 5rocesul de sortare continu apoi cu urmtorul rang semnificativ p)n c)nd !n pasul final
se ordoneaz toate !nregistrrile.
VI.0.;.0. Descrierea al#orit$ului
5utem organiza !nregistrrile de sortat !n buzunare +pocGet, fiecare buzunar corespunz)nd
________________________________________________________________________________
Q0T
Structuri de date i algoritmi
_______________________________________________________________________________
unei cifre din reprezentarea c"eilor de sortat !n baza =. Fiecare buzunar poate fi reprezentat ca o
structur de date de tip coad +list #/#$,. Ma sf)ritul fiecrui pas al procesului de sortare cozile
pot fi combinate uor !n ordine potrivit.
Dac numrul ma%im de cifrei !ntr-o c"eie este = atunci vor fi necesari = pai de sortare
pornind de la cifra cea mai puin semnificativ la cifra cea mai semnificativ. ;ste recomandat a se
folosi reprezentarea !nlnuit sub forma de list simpl !nlnuit a structurii de date
corespunz)nd buzunarelor deoarece nu putem ti c)te !nregistrri vor intra !ntr-un buzunar.
5rima dat vom sorta !nregistrrile dup cifra cea mai puin semnificativ a c"eii
interclasm apoi buzunarele. <epetm procesul de la primul pas sort)nd !nregistrrile dup cifra
urmtoare interclasm iari buzunarele .a.m.d.
Exemplu" S considerm urmtoarea secven de numere de sortat !n ordine cresctoare*
RQ QT 6R // ]S S6 0R T] 00 16 67 1/ ]/
Fiind vorba de o reprezentare zecimal vom avea nevoie de /7 buzunare pentru procesul de
sortare. Datorit ordinului de mrime al numerelor de sortat avem doar Q cifre de reprezentare cifra
unitilor i cifra zecilor.
asul 1" relucrm datele de sortat dup cifra unitilor n cele 15 buzunare
asul 2" /nterclasm buzunarele
- obinem secvena de c"ei* 67 // 1/ ]/ RQ QT 6R 0R ]S T] S6 16 00
asul %" relucrm datele de sortat dup cifra zecilor n cele 15 buzunare
asul 4" /nterclasm buzunarele
- obinem secvena de c"ei* // QT T] RQ S6 ]/ ]S 67 6R 1/ 16 0R 00
VI.0.;.7. I$3le$entarea al#orit$ului
________________________________________________________________________________
Q0R
Structuri de date i algoritmi
_______________________________________________________________________________
Specificarea problemei de sortare av)nd ca date de intrare tabela 8 dimensiunea ma%im a
tabelei & este urmtoarea*
D8I; 8 : C= A C reprezint baza sistemului de numeraie B
<;g9MI8I; 8= A tabela 8 sortat !n ordine cresctoare B
Descrierea general a algoritmului de sortare !n 5seudocod este*
8MUO<#IC9M SO<I8<;_<8D#D ;SI;*
&#I;XI; 8 : C=
G*@ Lnumrul ma%im de cifre necesar reprezentrii c"eilor din tabela 8=
5;:I<9 i *@ /= G ;D;&9IK
Lgolete buzunarul f-i2=
5;:I<9 ' *@ /= : ;D;&9IK
Lanalizeaz cifra i a c"eii 8-'2 i introducem !nregistrarea !n buzunarul f-2=
SF-5;:I<9
L interclaseaz buzunarele f-/2 f-Q2_ f-C2=
SF-5;:I<9
SF8MUO<#IC
#mplementarea algoritmului de sortare prin ansambluri !n limba'ul 5ascal este*
Fie dat o mulime de & !nregistrri organizat ca o list !nlnuit cu c)mpurile c"eie +?eA,
si legtur +next,. $ectorii 'ead si tail contin adresele primelor i respectiv ultimelor !nregistrri din
fiecare buzunar +coad,. $ariabila i este inde%ul pasului de sortare variabila j este inde%ul
buzunarelor variabila r este variabila pointer al !nregistrrii curente. $ariabila + de tip !ntreg
corespunde cifrei de analizat din c"eie variabila = reprezint numrul ma%im de cifre care
alctuiesc c"eia +?eA @ c
/
c
Q
c
T
_c
=2/
c
=
,.
+unction SO<I8<;_<8D#D +r * list , * list=
2ar "ead tail * arra5-7..02 o, list=
i ' " * inte#er=
fegin
+or i*@C do-nto / do Anumrul de pai necesariB
'e#in
+or '*@ 7 to 0 do
"ead-'2 *@ nil= Ainiializeaz listele corespunztoare buzunarelorB
)hile r JEnil do Apune !nregistrrile !n buzunarul corespunztorB
'e#in
" *@ c"arac+ i r[.Ge\ ,= Aobtine bitul i al c"eii B
#f "ead-"2@ nil then
"ead-"2 *@ r
________________________________________________________________________________
Q0S
Structuri de date i algoritmi
_______________________________________________________________________________
Else
tail-"2[.ne%t *@ r=
tail-"2 *@ r=
r *@ r[.ne%t=
End=
r *@ nil= A interclasm buzunarele B
+or '*@0 do-nto 7 do
I, "ead-'2 JE nil then
'e#in
tail-'2[.ne%t *@ r=
r *@ "ead-'2
End6
End=
SO<I8<;_<8D#D *@ r=
End=
VI.0.;.8. Co$3le/itatea al#orit$ului
5entru ca algoritmul de sortare <8D#D fie performant este necesar s folosim structuri de
date potrivite De e%emplu este preferabil ca s avem !nregistrrile de sortat organizate ca o list
simplu !nlnuit si nu ca o tabel static. Dac folosim organizarea sub form de list simpli
!nlnuit atunci nu va trebui s copiem !nregistrrile efectiv din structura iniial !n buzunare ci
doar s mutm adresa !nregistrrii dintr-o list !n alta. De asemenea pentru ca interclasarea s fie
rapid avem nevoie de pointeri la sf)ritul fiecrei liste.
&omple%itatea algoritmului de sortare <adi% este liniar adic de comple%itate O+&, dac
c"eile de sortare sunt de tip !ntreg sau de tip ir de caractere cu lungime fi% -Ire /01R2.
Dac avem & !nregistrri de sortat cu ma%imum = cifre necesare pentru reprezentare atunci
comple%itatea algoritmul de sortare <8D#D este O+=&,.
'I'"I&(RA+IE
8tanasiu 8. <. 5intea -/00]2. 'ulegere de proble%e 7ascal% ;ditura 5etrion fucureti.
________________________________________________________________________________
Q0]
Structuri de date i algoritmi
_______________________________________________________________________________
8"o 8. $. n. ;. dopcroft n. D. 9llman -/06R2. )+e Design and Anal6sis of 'o%puter
Algorit+%s Addison-Wesley, Reading, Massachusetts.
8"o 8. $. n. ;. dopcroft n. D. 9llman -/0162. Data Structures and Algorit+%s 8ddison -
Wesley, Reading, Massachusetts.
8lbeanu U. -/00R2. 7rogra%are n 7ascal i )urbo 7ascal .'ulegere de proble%e% ;ditura
Ie"nic fucureti.
8ndonie <. #. U)rbacea -/00S2. Algorit%i funda%entali. O perspecti*$ 'AA" ;ditura Mibris
&lu'-:apoca.
faase S. -/0162. 'o%puter Algorit+%s. Bntroduction to Design and Anal6sis 8ddison-Oesle\
Reading, Massachusetts.
flaga 5. U. &oman S. Uroze -/0612. IaEele Bnfor%aticii B. 'ulegere de proble%e Mitografia
9niversitii fabe-fol\ai &lu'-:apoca.
fq"m &. I. &. nacopini -/0]]2. FloW Diagrams Iuring Cac"ines and Manguages Wit" onl\
tWo Formation <ules 'o%%. A.'.=. =*S.
foian F. C. Frentiu -/00Q2. IaEele Bnfor%aticii. Li%bajul 7ascal ediia a ##-a Mitografia
9niversitii fabe-fol\ai &lu'-:apoca.
furdescu D.D. -/0012. AnaliEa co%ple-it$0ii algorit%ilor ;ditura 8lbastr fucureti.
&ooG S. 8. -/0672. I"e comple%it\ of t"eorem-proving procedure >2rd A'= S6%posiu% of
'o%puting pg /S/-/S1.
&ristea $. #. 8t"anasiu ;. .alisz 8. 5noiu -/00Q2. )urbo 7ascal F.J% ;ditura Ieora
fucureti.
&ristea $. #. 8t"anasiu ;. .alisz $. #orga -/00T2. )e+nici de progra%are ;ditura Ieora
fucureti.
Dale :. S. &. Mill\ -/0112. 7ascal 7lus Data Structures D. &. deat" and &ompan\ Me%ington
Cassac"usetts.
Fortune S. &. n. $an O\G -/00T2. ;fficient ;%act 8rit"metic for &omputational Ueometr\
7roceedings of t+e Ht+ A'= S6%posiu% 'o%putational Keo%etr6.
________________________________________________________________________________
Q06
Structuri de date i algoritmi
_______________________________________________________________________________
Frentiu C. S. Uroze -/01]2. IaEele Bnfor%aticii ediia a ##-a Mitografia 9niversitii fabe-
fol\ai &lu'-:apoca.
Uiumale &.8. -Q77R2. Bntroducere n analiEa algorit%ilor. )eorie i aplica0ie ;ditura 5olirom
fucureti.
doroWitz ;. S. Sa"ni -/0612. Lunda%entals of 'o%puter Algorit+%s &omputer Science 5ress
<ocGville.
.nut" D. ; -/06]2. )ratat de progra%area calculatoarelor. Algorit%i funda%entali ;ditura
Ie"nic fucureti.
.nut" D. ;. -/06]2. )ratat de progra%are a calculatoarelor. Sortare i c$utare ;ditura
Ie"nic fucureti.
.ors" n. F. M. n.Uarrett -/0112. Data Structures" Algorit+%s and 7rogra% St6le Msing ' 5OS-
.ent 5ublis"ing &o. foston.
MeWis d.<. M. Denenberg -/00/2. Data Structures N )+eir Algorit+%s darper &ollins
5ublis"ers :eWP`orG.
Mivovsc"i M. -/0172. Sc+e%e logice. Se%nifica0ie" elaborare" *erificare testare ;ditura
Ie"nic fucureti.
Mivovsc"i M. d. Ueorgescu -/01]2. SinteEa i analiEa algorit%ilor ;ditura Stiinific i
;nciclopedic fucureti.
Cocanu C. U. Carian &. fdic &. fdic -/00T2. >>> proble%e de progra%are% ;ditura
Ieora fucureti.
SedgeWitz <. -/0112. Algorit+%s Addison-Wesley, Reading, Massachusetts.
SedgeWitz <. -/0072. Algorit+%s in ' Addison-Wesley, Reading, Massachusetts.
S"eWc"uG n. <. -/0062. Floating-point arit"metic and fast robust geometric predicates
Discrete and 'o%putational Keo%etr6 /1.
SGiena S. -/0062. )+e Algorit% Design =anual ;ditura Springer-$erlag :eW-`orG.
Iomescu #. -/06Q2. Bntroducere n co%binatoric$ ;ditura Ie"nic fucureti.
Iomescu #. -/01/2. 7roble%e de co%binatoric$ i teoria grafurilor ;ditura Didactic i
5edagogic fucureti.
Iomescu #. -/0062. Data Structures ;ditura 9niversitii din fucureti fucureti.
________________________________________________________________________________
Q01
Structuri de date i algoritmi
_______________________________________________________________________________
Irembla\ n. 5. 5. U. Sorenson -/01R2. An Bntroduction to Data Structures Oit+ Applications
second edition CcUraW-dill :eW-`orG.
Iudor S. -/00T2. )e+nici de progra%are i structuri de date vol. ## ;ditura Iurbo <abbit
fucureti.
________________________________________________________________________________
Q00

You might also like