Documente Academic
Documente Profesional
Documente Cultură
SD 2019/2020
Conţinut
I Obiecte:
– structuri de date ı̂n care elementele sunt numite atomi;
– orice atom are un câmp cheie numit prioritate.
I citeşte
– intrare: o coadă cu priorităţi C
I elimină
– intrare: o coadă cu priorităţi C
– ies, ire: C din care s-a eliminat atomul cu cheia cea mai mare.
I inserează
– intrare: o coadă cu priorităţi C şi un atom at
– Pentru orice nod, cheia din acel nod este mai mare decât sau egală cu
cheile din nodurile fiu;
– Arborele este complet. Fie h ı̂nălt, imea arborelui. Atunci,
– Pentru i = 0, · · · , h − 1, sunt 2i noduri cu adâncimea i;
– Pe nivelul h − 1 nodurile interne sunt situate la stânga nodurilor
externe.
– Ultimul nod al unui maxHeap este nodul cel mai la dreapta pe nivelul h.
12
9 8
7 1 3 4
5 2
Teoremă
Un maxHeap care cont, ine n chei are ı̂nălt, imea O(log2 n).
Teoremă
Un maxHeap care cont, ine n chei are ı̂nălt, imea O(log2 n).
Demonstraţie.
I Utilizăm proprietatea de arbore binar complet.
I Fie h ı̂nălt, imea unui maxHeap cu n chei.
I Avem 2i chei de adâncime i, pentru i = 0, · · · , h − 1 s, i cel put, in o
cheie de adâncime h: ⇒ n ≥ 20 + 21 + 22 + · · · + 2h−1 + 1 = 2h .
I Obt, inem: h ≤ log2 n
nivel chei
0 20
1 21
h−1 2h−1
h 1
12
9 8
7 1 3 4
5 2
9 8
7 1 3 4
5 2
9 8
7 1 3 4
5 2
9 8
7 1 3 4
9 8
7 1 3 4
2 8
7 1 3 4
2 8
7 1 3 4
7 8
2 1 3 4
7 8
2 1 3 4
7 8
5 1 3 4
7 8
5 1 3 4
12 noua cheie: 10
9 8
7 1 3 4
5 2
12 noua cheie: 10
9 8
7 1 3 4
5 2
12 noua cheie: 10
9 8
7 1 3 4
5 2 10
12
9 8
7 1 3 4
5 2 10
12
9 8
7 10 3 4
5 2 1
12
9 8
7 10 3 4
5 2 1
12
10 8
7 9 3 4
5 2 1
12
10 8
7 9 3 4
5 2 1
12
10 8
7 9 3 4
5 2 1
0 12
1 9 2 8
3 7 4 1 5 3 6 4
7 5 2 8
x a[i]
12 9 8 7 1 3 4 5 2
0 1 2 3 4 5 6 7 8 a[2i + 1] y z a[2i + 2]
∀k : 1 ≤ k ≤ n − 1 ⇒ a[k] ≤ a[(k − 1)/2]
procedure elimina(a, n)
begin
a[0] ← a[n-1]
n ← n-1
j←0
heap ← false
while (2*j+1 < n and not heap) do
k ← 2*j+1
if (k < n-1 and a[k] < a[k+1]) then
k ← k+1
if (a[j] < a[k]) then
swap(a[j], a[k])
j←k
else
heap ← true
end
O(h) = O(log n)
1 2
3 4 5 6
Aplicaţii:
I Ret, ele de calculatoare
I Pagini web (Internet)
I Pixeli ı̂ntr-o imagine
digitală
I Obiecte:
Colecţii de submulţimi disjuncte (partiţii) ale unei mulţimi univers.
I Operaţii:
I find
– intrare: o colecţie C şi un element i din mulţimea univers;
I Structura union-find:
6 3 5 9
2 1 0 8 7
6 3 5 9
2 1 0 8 7
parinte 5 6 6 -1 8 -1 -1 9 5 -1
0 1 2 3 4 5 6 7 8 9
procedure singleton(C, i)
begin
C.parinte[i] ← -1
end
procedure find(C, i)
begin
temp ← i
while (C.parinte[temp] >= 0) do
temp ← C.parinte[temp]
return temp
end
procedure union(C, i, j)
begin
ri ← find(i)
rj ← find(j)
if ri != rj then
C.parinte[rj] ← ri
end
I Mecanism:
– Aplatizarea arborilor.
0 1 4
3 6 2 5 8 9
parinte -5 -1 0 0 -4 4 0 2 4 4
0 1 2 3 4 5 6 7 8 9
I find(9)
0 0
1 2 9 6 3 1 2
3 4 5 10 11 8 7 4 5
6 7
8 9
10 11
I find(9)
0 0
1 2 9 1 2
3 4 5 10 11 3 4 5
6 7 6 7
8 9 8
10 11
I find(9)
0 0
9 1 2 9 6 1 2
10 11 3 4 5 10 11 8 3 4 5
6 7 7
I find(9)
0 0
9 6 1 2 9 6 3 1 2
10 11 8 3 4 5 10 11 8 7 4 5
procedure union(C, i, j)
begin
ri ← find(i); rj ← find(j)
while (C.parinte[i] >= 0) do
temp ← i; i ← C.parinte[i]; C.parinte[temp] ← ri
while (C.parinte[j] >= 0) do
temp ← j; j ← C.parinte[j]; C.parinte[temp] ← rj
if C.parinte[ri] > C.parinte[rj] then
C.parinte[rj] ← C.parinte[ri] + C.parinte[rj]
C.parinte[ri] ← rj
else
C.parinte[ri] ← C.parinte[ri] + C.parinte[rj]
C.parinte[rj] ← ri
end
Teoremă
Pornind de la o colecţie vidă, orice secvenţă de m operaţii union şi find
asupra n elemente are complexitatea O(n + m log∗ n).