Sunteți pe pagina 1din 51

Curs SDA (PC2)

Arbori (continuare)
Iulian Nstac
2
Arbori binari
Recapitulare
Un arbore binar este o
mulime finit de elemente care
sau este vid, sau conine un
element numit rdcina, iar
celelalte elemente (dac exist)
se mpart n dou submulimi
disjuncte, care fiecare la rndul
ei, este un arbore binar.
3
Utilizarea structurilor pentru
realizarea unui arbore binar
Recapitulare
Nodul unui arbore binar poate fi reprezentat ca o
dat structural de tipul NOD care se definete n felul
urmtor:
typedef struct nod
{
declaratii ;
struct nod *st;
struct nod *dr;
} NOD;
unde:
st - este pointerul spre fiul stng al nodului curent;
dr - este pointerul spre fiul drept al aceluiai nod.
4
Recapitulare
Asupra arborilor binari se pot
defini mai multe operaii:
1. inserarea unui nod frunz ntr-un arbore
binar;
2. accesul la un nod al unui arbore;
3. parcurgerea unui arbore;
4. tergerea unui arbore.
5
Operaiile de inserare i acces la un
nod, au la baz un criteriu care s
defineasc locul n arbore al nodului
n cauz.
Acest criteriu este dependent de
problema concret, la care se aplic
arborii binari, pentru a fi rezolvat.
6
Funcia pentru tratarea echivalenei
Recapitulare
De obicei, la ntlnirea unei perechi de noduri
echivalente, nodul din arbore (spre care pointeaz
p1) este supus unei prelucrri, iar nodul curent
(spre care pointeaz p2) este eliminat.
Pentru a realiza o astfel de prelucrare este
necesar s se apeleze o funcie care are ca
parametri pointerii p1 i p2 i care returneaz un
pointer spre tipul NOD (de obicei se returneaz
valoarea lui p1).
Vom numi aceast funcie: echivalenta. Ea este
dependent de problema concret, ca i funcia
criteriu.
7
Intrarea n arbore
Recapitulare
Numim prad o variabil global ctre rdcina
arborelui binar. Ea se definete astfel:
NOD *prad;
n cazul n care ntr-un program se prelucreaz
simultan mai muli arbori, se vor utiliza mai multe
variabile globale de tip prad; interfaa dintre
funcii realizndu-se cu ajutorul unui parametru
care este pointer spre tipul NOD i cruia i se
atribuie, la apel, adresa nodului rdcin al
arborelui prelucrat prin funcia apelat.
8
Parcurgerea unui arbore binar
Recapitulare
Prelucrarea informaiei pstrat n nodurile
unui arbore binar se realizeaz
parcurgnd nodurile arborelui respectiv.
Parcurgerea nodurilor unui arbore binar se
poate face n mai multe moduri, dintre
care se remarc:
parcurgerea n preordine;
parcurgerea n inordine;
parcurgerea n postordine.
9
Accesul la un nod permite prelucrarea
informaiei coninute n nodul
respectiv.
n acest scop se poate apela o funcie
care este dependent de problema
concret care se rezolv cu ajutorul
parcurgerii arborelui (de exemplu
funcia prelucrare).
void prelucrare( NOD *p)
10
Parcurgerea unui arbore binar in preordine
Recapitulare
void preord(NOD *p)
{
if(p != 0)
{
prelucrare(p);
preord(p -> st);
preord(p -> dr);
}
}
11
tergerea unui arbore binar
Recapitulare
pentru tergerea unui arbore binar este
necesar parcurgerea lui i tergerea
fiecrui nod al arborelui respectiv.
se apeleaz funcia elibnod.
arborele se parcurge n postordine
12
tergerea unui arbore binar
(doar n postordine)
void sterge_arb(NOD *p)
{
if(p != 0)
{
sterge_arb (p -> st);
sterge_arb (p -> dr);
elibnod(p);
}
}
13
Observaii:
Funcia sterge_arb nu atribuie valoarea
zero variabilei globale prad.
Aceast atribuire se va face obligatoriu
imediat dup ce se apeleaz funcia
sterge_arb
14
tergerea unui nod precizat
printr-o cheie
Cheia dup care se face cutarea este unic i se
gsete n fiecare nod:
typedef struct nod
{
declaratii ;
tip cheie;
struct nod *st;
struct nod *dr;
} NOD;
unde tipul cheii poate fi char, int, float sau double.
Se pot terge doar noduri care sunt frunz.
tergerea unui nod care nu este frunz implic operaii
suplimentare complicate pentru refacerea arborelui.
15
Arbori binari degenerai
sunt arbori binari cu n vrfuri dispuse pe n
niveluri.
16
Adncimea i nlimea unui
arbore
Vom nota nlimea unui arbore binar
cu h sau cu i
17
Arbori binari speciali
P: Un arbore binar de nlime i are
maximum 2
i+1
-1 varfuri (sau noduri)
Observaie:
Orice nivel de adncime k are maximum 2
k
noduri
18
Demonstraie prin inducie:
Se observ foarte uor c propoziia anterioar
este valabil pentru i = 0, 1, 2 ...
Dac pentru nlimea i avem 2
i+1
-1 noduri
atunci pentru nlimea i+1 avem 2
i+2
-1 noduri
Ne bazm pe faptul c orice nivel de
adncime k are maximum 2
k
noduri.
Se observ uor c pentru nlimea i+1 avem:
Nr_de_noduri = 2
i+1
- 1 + 2
i+1
= 2
i+1
(1 + 1) - 1 =
2
i+1
2 - 1 = 2
i+2
- 1 noduri
19
Arborele binar plin
Arborele binar plin este arborele care are numrul
maxim de vrfuri (2
i+1
-1) pentru o nlime i dat.
De exemplu, arborele binar plin cu nlimea 2 se
prezint astfel:
20
Observaii:
Vrfurile unui arbore binar plin se numeroteaz n
ordinea adncimii.
Pentru aceeai adncime, numerotarea se face n
arbore de la stnga la dreapta.
21
Arborele binar complet
Un arbore binar cu n vrfuri i de nlime i este
complet dac se obine din arborele binar plin
de nlime i, prin eliminarea vrfurilor
numerotate cu n+1, n+2, ... pn la 2
i+1
-1.
22
Observaie :
Un arbore binat complet se poate
reprezenta secvenial folosind un
tablou T, punnd vrfurile de adncime
k, de la stnga la dreapta, n poziiile:
T[2
k
], T[2
k
+1], , T[2
k+1
-1], cu excepia
nivelului final care poate fi incomplet.
23
Atenie: acesta este un tablou generic care ncepe cu T [1]
i nu cu T [0].
Se pot opera modificrile necesare atunci cnd se scrie
codul n C.
24
Observaii:
Tatl unui vrf
reprezentat n
T[i], i>1, se afl
n T[i div 2] .
Fiii unui vrf
reprezentat n
T[i], se afl (dac
exist) n T[2i] i
T[2i + 1] .
25
Definim:

} , | max{ Z n x n n x e s =
(
} , | min{ Z n x n n x e > =
26
Proprieti:
1.
2.
3.
4.
(
1 1 + < s s < x x x x x
n
n n
=
(
(
(

+
(

2 2
(
(
(

=
(
(
(

(
(
(

ab
n
b
a
n
i
i
(

=
(

ab
n
b
a
n a, b, n e Z;
a, b = 0
n e Z;
x e R;
(
(
(

+
=
(

m
m n
m
n 1
(

+
=
(
(
(

m
m n
m
n 1
n, m e N
*
;
27
nlimea unui arbore binar
complet
Vom arta c nlimea unui arbore
complet cu n vrfuri este:

n i
2
log =
28
Demonstraie:
Fie:
n numrul de vrfuri;
i nlimea arborelui.
tim c:
n
max
= 2
i+1
-1 (cnd arborele binar este plin)
n
min
= 2
i
(cnd pe ultimul nivel avem un singur nod)
Rezult c:
min 2
log n i =

min 2
log n i =
=>
(1)
29
Deoarece funcia logaritmic este cresctoare
avem:

1 2 log ) 1 2 ( log log
1
2
1
2 max 2
+ = < =
+ +
i n
i i
(2)
Aadar:

1 log
max 2
+ < i n
Din (1) i (2) rezult c:

1 log log
max 2 min 2
+ < s = i n n i
=>

n i
2
log =
30
Arborele HEAP
Un heap este un arbore binar
complet care are proprietarea c
valoarea fiecrui vrf este mai
mare sau egal cu valoarea
fiecrui fiu al su.
Observaie: orice heap poate fi
reprezentat printr-un vector (tablou
unidimensional)
31
Exemplu:
Acest heap poate fi reprezentat prin urmtorul tablou:
10 7 9 4 7 5 2 2 1 6
T[1] T[2] T[3] T[4] T[5] T[6] T[7] T[8] T[9] T[10]
32
Observaii:
ntr-un heap se pot opera modificri la
nivel de nod (schimbarea valorii nodului
curent).
Astfel valoarea unui nod poate crete
sau poate fi micorat anulnd ordinea
iniial de heap.
Ordinea de heap poate fi restabilit
simplu prin intermediul a dou operaiuni
numite de cernere i de filtrare.
33
Filtrarea n heap
Dac valoarea unui vrf crete astfel nct
depete valoarea tatlui, este suficient
s se schimbe ntre ele aceste dou valori
i s se continue procesul n mod
ascendent, pn cnd proprietatea de
heap va fi restabilit.
Se spune c valoarea modificat a fost
filtrat (percolated) ctre noua sa poziie.
34
Cernerea n heap
Dac valoarea unui vrf scade astfel nct
devine mai mic dect valoarea fiului mai
mare, este suficient s schimbm ntre ele
aceste dou valori, procesul continund n
mod descendent, pn cnd proprietatea de
heap va fi restabilit.
Se spune c valoarea modificat a fost
cernut (shifted down) ctre noua sa poziie.
35
Not:
n continuare, marea majoritate a
funciilor vor fi scrise n varianta
pseudocod
36
Pseudocodul funciei de cernere
void cerne (T[1n], i)
{ int k, x, j;
k i ;
do {
j k ;
if ((2j n) . (T[2j] > T[k])) then k 2j;
if ((2j+1 n) . (T[2j+1] > T[k])) then k 2j+1;
x T[j];
T[j] T[k];
T[k] x
} while (j = k)
}
37
Pseudocodul funciei de filtrare
void filtreaza (T[1n], i)
{ int k, j, x;
k i ;
do {
j k ;
if ((j > 1) . (T[ j div 2] < T[k])) then k j div 2;
x T[ j];
T[ j] T[k];
T[k] x
} while (j = k)
}
38
Restabilirea proprietii de heap
Considerm T[1..n] ca fiind un heap. Fie i,
1in. Lui T[i] i se atribuie valoarea v i
apoi restabilim proprietatea de heap.
void restab_heap (T[1..n], i, v)
{ variab. loc. x;
x T[i];
T[i] v;
if v < x then cerne(T, i);
else filtreaza(T,i);
}
39
Heap-ul este un modelul util pentru:
Determinarea i extragerea maximului
dintr-o mulime.
Inserarea unui nou vrf.
Modificarea valorii unui vrf (cu
restab_heap).
40
Operaiile anterioare pot fi folosite pentru
a implementa o list dinamic de prioriti:
Valoarea unui vrf va da prioritatea
elementului corespunztor.
Evenimentul cu probabilitatea cea mai mare
se va afla mereu la rdcina heap-ului.
Prioritatea unui eveniment poate fi modificat
n mod dinamic.
Acestea sunt cteva principii care stau la
baza programelor de baze de date.
41
Exemple de funcii utile:
1) Funcia pentru gsirea unui maxim:
gaseste_maxim (T[1..n])
{ return T[1];
}
2) Funcia pentru extragerea unui maxim (i tergerea sa):
extr_max (T[1..n])
{ var loc x;
x T[1];
T[1] T[n];
cerne (T[1..n-1], 1);
return x;
}
42
3) Funcia de inserare a unui element nou n heap:
insert (T[1..n], v)
{
T[n+1] v;
filtreaza (T[1..n+1], n+1);
}
43
Observaie: n limbajul C nu este luat
n consideraie valoarea maxim a
numrului de elemente ale unui tablou,
folosit ca parametru de funcie, astfel
nct, de exemplu, pentru funcia de
cernere, filtrare, etc., va trebui s inem
seama de un parametru suplimentar.
Ex.: cerne (T[ ], n, i)
unde n indic indicele ultimului element
folosit (!de fapt numerotarea ar trebui
s nceap de la 0).
44
Cum putem forma un heap pornind
de la un vector neordonat T[1..n] ?
O soluie mai puin eficient este aceea de
a porni de la un heap virtual vid i adugm
elementele unul cte unul.
slow_make_heap(T[1..n])
{
for (i=2; i n; i++)
filtreaza (T[1..i], i);
}
45
Exist un algoritm mai eficient care lucreaz liniar
(din punct de vedere al ordinului/eficienei):
make_heap(T[1..n])
{
for (i = n div 2; i 1; i - -)
cerne (T[ ], i);
}
46
Exemplu:
Pornind de la vectorul urmtor (care nu
este un heap):
1 6 9 2 7 5 2 7 4 10
T[1] T[2] T[3] T[4] T[5] T[6] T[7] T[8] T[9] T[10]
Printr-o succesiune de civa pai se ajunge la:
10 7 9 4 7 5 2 2 1 6
T[1] T[2] T[3] T[4] T[5] T[6] T[7] T[8] T[9] T[10]
47
Exist variante
Def.: Un min-heap este un heap inversat
(valoarea fiecrui vrf este mai mic sau egal
cu valoarea fiecrui fiu al su).
Observaii:
- Rdcina min-heap-ului va conine cel mai
mic element al vectorului.
- Se modific n mod corespunztor i celelalte
proceduri de manipulare a heap-ului.
48
Atenie!
Heap-ul este o structur de date
foarte atractiv, dar are i limitri.
Exist operaii care nu pot fi efectuate
eficient ntr-un heap.
49
Dezavantajele unui heap:
Necesitatea ca arborele s fie complet.
Gsirea unui vrf, cu o anumit valoare
dat, este ineficient (pentru c pot exista
mai multe vrfuri cu aceeai valoare
plasate pe diferite ramuri i nivele din
heap).
50
O extensie a conceptului de heap este
posibil pentru arbori complei i ordonai a
cror noduri neterminale au mai mult de
doi fii.
O astfel de structur accelereaz
procedura de filtrare.
51
Principala aplicaie:
O nou tehnic de sortare
(heapsort)
Noiunea de heap a fost introdus i
folosit n anii 60 de Robert W. Floyd
i J. W. J. Williams pentru crearea
unui algoritm de sortare numit
heapsort.