Sunteți pe pagina 1din 54

Coada cu priorităt, i.

Colect, ii de mult, imi disjuncte

SD 2019/2020
Conţinut

Coada cu priorităţi s, i “max-heap”

Colecţii de mulţimi disjuncte şi “union-find”

FII, UAIC Curs 6 SD 2019/2020 2 / 50


Coada cu priorităt, i – exemple

I Pasagerii unui avion


Priorităţi:
– clasa “business”;
– persoane călatorind cu copii / cu mobilitate redusă;
– ceilalt, i pasageri.

FII, UAIC Curs 6 SD 2019/2020 3 / 50


Coada cu priorităt, i – exemple

I Pasagerii unui avion


Priorităţi:
– clasa “business”;
– persoane călatorind cu copii / cu mobilitate redusă;
– ceilalt, i pasageri.

I Avioane care se pregătesc să aterizeze


Priorităţi
– urgenţe;
– nivelul carburantului;
– distanţa faţă de aeroport.

FII, UAIC Curs 6 SD 2019/2020 3 / 50


Tipul abstract Coada cu priorităţi

I Obiecte:
– structuri de date ı̂n care elementele sunt numite atomi;
– orice atom are un câmp cheie numit prioritate.

I Elementele sunt memorate ı̂n funct, ie de prioritate s, i nu de pozit, ia lor.

FII, UAIC Curs 6 SD 2019/2020 4 / 50


Coada cu priorităţi – operat, ii

I citeşte
– intrare: o coadă cu priorităţi C

– ies, ire: atomul din C cu cheia cea mai mare.

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

– ies, ire: C la care s-a adăugat at.

FII, UAIC Curs 6 SD 2019/2020 5 / 50


maxHeap

I Implementează coada cu priorităt, i.

I Arbori binari cu proprietăt, ile:


– Nodurile memorează câmpurile cheie;

– 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.

FII, UAIC Curs 6 SD 2019/2020 6 / 50


maxHeap – exemplu

12

9 8

7 1 3 4

5 2

FII, UAIC Curs 6 SD 2019/2020 7 / 50


Înălţimea unui maxHeap

Teoremă
Un maxHeap care cont, ine n chei are ı̂nălt, imea O(log2 n).

FII, UAIC Curs 6 SD 2019/2020 8 / 50


Înălţimea unui maxHeap

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

FII, UAIC Curs 6 SD 2019/2020 8 / 50


maxHeap: eliminarea

I Se elimină rădăcina heap-ului


(corespunde elementului cel mai prioritar).

I Algoritmul are trei etape:


I Se ı̂nlocuies, te cheia rădăcinii cu cheia ultimului nod;

I Se s, terge ultimul nod (de pe ultimul nivel);

I Se reface proprietatea de maxHeap.

FII, UAIC Curs 6 SD 2019/2020 9 / 50


maxHeap: eliminare – exemplu

12

9 8

7 1 3 4

5 2

FII, UAIC Curs 6 SD 2019/2020 10 / 50


maxHeap: eliminare – exemplu

9 8

7 1 3 4

5 2

FII, UAIC Curs 6 SD 2019/2020 11 / 50


maxHeap: eliminare – exemplu

9 8

7 1 3 4

5 2

FII, UAIC Curs 6 SD 2019/2020 12 / 50


maxHeap: eliminare – exemplu

9 8

7 1 3 4

FII, UAIC Curs 6 SD 2019/2020 13 / 50


maxHeap: eliminare – exemplu

9 8

7 1 3 4

FII, UAIC Curs 6 SD 2019/2020 14 / 50


maxHeap: eliminare – exemplu

2 8

7 1 3 4

FII, UAIC Curs 6 SD 2019/2020 15 / 50


maxHeap: eliminare – exemplu

2 8

7 1 3 4

FII, UAIC Curs 6 SD 2019/2020 16 / 50


maxHeap: eliminare – exemplu

7 8

2 1 3 4

FII, UAIC Curs 6 SD 2019/2020 17 / 50


maxHeap: eliminare – exemplu

7 8

2 1 3 4

FII, UAIC Curs 6 SD 2019/2020 18 / 50


maxHeap: eliminare – exemplu

7 8

5 1 3 4

FII, UAIC Curs 6 SD 2019/2020 19 / 50


maxHeap: eliminare – exemplu

7 8

5 1 3 4

FII, UAIC Curs 6 SD 2019/2020 20 / 50


maxHeap: inserarea

I Se inserează noua cheie ı̂ntr-un nou nod.

I Algoritmul are trei etape:


I Se adaugă noul nod ca cel mai din dreapta pe ultimul nivel;

I Se inserează noua cheie ı̂n acest nod;

I Se reface proprietatea de maxHeap.

FII, UAIC Curs 6 SD 2019/2020 21 / 50


maxHeap: inserare – exemplu

12 noua cheie: 10

9 8

7 1 3 4

5 2

FII, UAIC Curs 6 SD 2019/2020 22 / 50


maxHeap: inserare – exemplu

12 noua cheie: 10

9 8

7 1 3 4

5 2

FII, UAIC Curs 6 SD 2019/2020 23 / 50


maxHeap: inserare – exemplu

12 noua cheie: 10

9 8

7 1 3 4

5 2 10

FII, UAIC Curs 6 SD 2019/2020 24 / 50


maxHeap: inserare – exemplu

12

9 8

7 1 3 4

5 2 10

FII, UAIC Curs 6 SD 2019/2020 25 / 50


maxHeap: inserare – exemplu

12

9 8

7 10 3 4

5 2 1

FII, UAIC Curs 6 SD 2019/2020 26 / 50


maxHeap: inserare – exemplu

12

9 8

7 10 3 4

5 2 1

FII, UAIC Curs 6 SD 2019/2020 27 / 50


maxHeap: inserare – exemplu

12

10 8

7 9 3 4

5 2 1

FII, UAIC Curs 6 SD 2019/2020 28 / 50


maxHeap: inserare – exemplu

12

10 8

7 9 3 4

5 2 1

FII, UAIC Curs 6 SD 2019/2020 29 / 50


maxHeap: inserare – exemplu

12

10 8

7 9 3 4

5 2 1

FII, UAIC Curs 6 SD 2019/2020 30 / 50


maxHeap: implementarea cu tablouri

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]

FII, UAIC Curs 6 SD 2019/2020 31 / 50


maxHeap: inserare

procedure insereaza(a, n, cheie)


begin
n ← n+1
a[n-1] ← cheie
j ← n-1
heap ← false
while (j > 0 and not heap) do
k ← [(j-1)/2]
if (a[j] > a[k]) then
swap(a[j], a[k])
j←k
else
heap ← true
end

FII, UAIC Curs 6 SD 2019/2020 32 / 50


maxHeap: elimina

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

FII, UAIC Curs 6 SD 2019/2020 33 / 50


maxHeap: timp de execuţie

I Operaţiile de inserare / eliminare au clasa de complexitate

O(h) = O(log n)

1 2

3 4 5 6

FII, UAIC Curs 6 SD 2019/2020 34 / 50


Conţinut

Coada cu priorităţi s, i “max-heap”

Colecţii de mulţimi disjuncte şi “union-find”

FII, UAIC Curs 6 SD 2019/2020 35 / 50


Colecţii de mulţimi disjuncte

Aplicaţii:
I Ret, ele de calculatoare
I Pagini web (Internet)
I Pixeli ı̂ntr-o imagine
digitală

FII, UAIC Curs 6 SD 2019/2020 36 / 50


Tipul abstract Colecţii de mulţimi disjuncte

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;

– ies, ire: submulţimea din C căreia aparţine i.


I union
– intrare: o colecţie C şi două elemente i şi j din mulţimea univers;

– ies, ire: C ı̂n care s-au reunit componentele lui i şi j.


I singleton
– intrare: o colecţie C şi un element i din mulţimea univers;

– ies, ire: C la care componenta lui i are pe i ca unic element.

FII, UAIC Curs 6 SD 2019/2020 37 / 50


Colecţii de mulţimi disjuncte: union-find

I Structura union-find:

– mulţimea univers este {0, 1, · · · , n − 1};

– o submulţime este reprezentată printr-un arbore;

– o colecţie (partiţie) este o colecţie de arbori (“pădure”);

– reprezentarea unei “păduri” se face prin relaţia “părinte”.

FII, UAIC Curs 6 SD 2019/2020 38 / 50


union-find: exemplu

I n = 10, C = {{1, 2, 6}, {3}, {0, 4, 5, 8}, {7, 9}}

FII, UAIC Curs 6 SD 2019/2020 39 / 50


union-find: exemplu

I n = 10, C = {{1, 2, 6}, {3}, {0, 4, 5, 8}, {7, 9}}

6 3 5 9

2 1 0 8 7

FII, UAIC Curs 6 SD 2019/2020 39 / 50


union-find: exemplu

I n = 10, C = {{1, 2, 6}, {3}, {0, 4, 5, 8}, {7, 9}}

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

FII, UAIC Curs 6 SD 2019/2020 39 / 50


union-find: singleton

procedure singleton(C, i)
begin
C.parinte[i] ← -1
end

FII, UAIC Curs 6 SD 2019/2020 40 / 50


union-find: find

procedure find(C, i)
begin
temp ← i
while (C.parinte[temp] >= 0) do
temp ← C.parinte[temp]
return temp
end

FII, UAIC Curs 6 SD 2019/2020 41 / 50


union-find: union

procedure union(C, i, j)
begin
ri ← find(i)
rj ← find(j)
if ri != rj then
C.parinte[rj] ← ri
end

FII, UAIC Curs 6 SD 2019/2020 42 / 50


Structură union-find ponderată

I Solut, ie la problema arborilor dezechilibrat, i.

I Mecanism:

– Memorarea numărului de vârfuri din arbore (cu semn negativ).

– Aplatizarea arborilor.

FII, UAIC Curs 6 SD 2019/2020 43 / 50


Structură union-find ponderată: exemplu

I n = 10, C = {{0, 2, 3, 6, 7}, {1}, {4, 5, 8, 9}}

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

FII, UAIC Curs 6 SD 2019/2020 44 / 50


Aplatizarea arborilor – exemplu

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

FII, UAIC Curs 6 SD 2019/2020 45 / 50


Aplatizarea arborilor – exemplu

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

FII, UAIC Curs 6 SD 2019/2020 46 / 50


Aplatizarea arborilor – exemplu

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

FII, UAIC Curs 6 SD 2019/2020 47 / 50


Aplatizarea arborilor – exemplu

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

FII, UAIC Curs 6 SD 2019/2020 48 / 50


Structură union-find ponderată

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

FII, UAIC Curs 6 SD 2019/2020 49 / 50


Structură union-find ponderată

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).

Observatie: log∗ n este numărul de logaritmări până se obţine valoarea 1.

FII, UAIC Curs 6 SD 2019/2020 50 / 50

S-ar putea să vă placă și