Post on 09-Jan-2016
description
1/32
heap binomiali
2/32
Heap binomiale
Una heap binomiale è un insieme di alberi binomiali.
Un albero binomiale Bk è un albero ordinato definito ricorsivamente per cui valgono le seguenti proprietà:
•I nodi dell’albero sono 2k
•L’altezza dell’albero è k
•I nodi a profondità i sono esattamente , con i=0, 1, ... , k
•La radice dell’albero ha grado k. Il grado della radice è maggiore del grado di ogni altro nodo. Enumerando con k-1, k-2, ..., o i figli della radice, il figlio numero i è la radice del sottoalbero binomiale Bi.
i
k
3/32
Alberi Binomiali: esempi
B0
Bk
Bk-1
Bk-1
4/32
Alberi Binomiali: esempi
B0 B2B1 B3
5/32
Alberi Binomiali: esempi
B4
6/32
Alberi Binomiali: esempi
Bk
Bk-1
Bk-2B2
B1
B0
7/32
Heap Binomiali - Definizione
Una heap binomiale H è un insieme di alberi binomiali che soddisfa le seguenti proprietà:
• Ogni albero binomiale è ordinato come una heap, cioè per ogni nodo si ha che la sua chiave è maggiore o uguale alla chiave dei suoi genitori
• Non esistono due alberi binomiali in H le cui radici hanno lo stesso grado
8/32
Heap Binomiali - Esempio
38
14 29
6
27
11 17
8
18
12 25
110head[H]
9/32
Heap Binomiali - Esempio
10 0 1 2 6 3
12 1 25 0
18 0
8 2 14 1 29 0
11 1 17 0 38 0
27 0
head[H]
pkeydegchild
sibling
10/32
Heap Binomiali - Min
Binomial-Heap-Minimum(H):y=NILx=head[H]min = while x NIL do
if key[x] < min then min = key[x]; y=x
x = sibling[x]return y
Ricerca della chiave minimainput: una heap binomiale H con n nodioutput: puntatore al nodo con chiave minima (è in una radice!)
11/32
UnioneCollega tutti gli alberi binomiali le cui radici hanno lo stesso grado.Subroutine Binomial-Link(y,z) che collega gli alberi binomiali y e z le cui radici hanno lo stesso grado: z diventa padre di y.
Binomial-Link(y,z)p[y] = zsibling[y] = child[z]child[z] = ydegree[z] = degree[z]+1
12/32
Binomial-Heap-Union
Binomial-Heap-Union(H1,H2):H = Make-Binomial-Heap()P = Head[H]; P1 = Head[H1]; P2 = Head[H2]while P1 NIL and P2 NIL do
if Deg[P1] < Deg[P2] thenSibling[P] = P1; P1 = Sibling[P1]
elseSibling[P] = P2; P2 = Sibling[P2]
while P1 NIL doSibling[P] = P1; P1 = Sibling[P1]
while P2 NIL doSibling[P] = P2; P2 = Sibling[P2]
Unisce H1 e H2, distruggendole.
13/32
Binomial-Heap-Union (cont.)
prev_x=NIL; x = head[H]; next_x = sibling[x]while next_x ≠ NIL do
if deg[x] ≠ deg[next_x] or (sibling[next_x] ≠ NIL and deg[sibling[next_x]] == deg[x])
then prev_x = x; x = next_xelse if key[x] ≤ key[next_x]
then sibling[x] = sibling[next_x]; Binomial-Link(next_x,x)
else if prev_x == NILthen head[H] = next_xelse sibling[prev_x] = next_xBinomialLink(x,next_x)x = next_xnext_x = sibling[x]
return H
14/32
Heap binomiale - Unione - Esempio
17
10 44
6
50
48 31
2937
318
24
23 22
8
55
45 32
30
25
712
33
15
41
28H1
H2
head[H1]
head[H2]
15/32
Heap Binomiali - Unione - esempio
17
10 44
6
50
48 31
2937
318
24
23 22
8
55
45 32
30
25
712
33
15
41
28H1H2
head[H]
16/32
Heap Binomiali - Unione - esempio
17
10 44
6
50
48 31
2937
3
18
24
23 22
8
55
45 32
30
25
712
33
15
41
28
H1H2head[H1]
17/32
Heap Binomiali - Unione - Esempio
17
10 44
6
50
48 31
2937
3
18
24
23 22
8
55
45 32
3025
7
12
33
15
41
28
H1H2head[H1]
18/32
Heap Binomiali - Unione - Esempio
17
10 44
6
50
48 31
2937
3
18
24
23 22
8
55
45 32
3025
7
12
33
15
41
28
H1H2head[H1]
19/32
Heap Binomiali - Inserimento
Binomial-Heap-Insert(H, x):H’ = Make-Binomial-Heap()p[x] = NILchild[x] = NIL sibling[x] = NILdeg[x] = 0Head[H’] = x H = Binomial-Heap-Union(H,H’)
Inserisce un nodo in una heap binomiale
20/32
Heap Binomiali - ExtractMin
Binomial-Heap-Extract-Min(H)min = ; MinKey = NIL; MKP = NIL P = Head[H]; PP = Head[H]while P NIL do
if key[P] < min then min = Key[P]; MinKey = P; MKP = PP PP = P; P = Sibling[P]
if MinKey == NIL then return fail
(cont…)
Elimina da una heap binomiale H il nodo con chiave minima e restituisce il puntatore a quel nodo
21/32
Heap Binomiali - ExtractMin (cont.)
(… cont)H1 = Make-Binomial-Heap()if MKP head[H] then sibling[MKP] = sibling[MinKey]else head[H] = sibling[MinKey]P = left[MinKey]while P 0 do
S = sibling[P] sibling[P] = head[H1]head[H1] = Pp[P] = 0P = S
H = Binomial-Heap-Union(H,H1)
22/32
Heap Binomiali - ExtractMin - Esempio
18
12 25
1
42
26 23
1641
38
14 29
6
27
11 17
8
37
13
10
77
28
head[H]
23/32
Heap Binomiali - ExtractMin - Esempio
41
37
13
10
77
28
head[H]
18
12 25
1
42
26 23
16
38
14 29
6
27
11 17
8
x
24/32
Heap Binomiali - ExtractMin - Esempio
25
41
37
13
10
77
28
head[H]
18
12
42
26 23
16
38
14 29
6
27
11 17
8
head[H’]
25/32
Heap Binomiali - ExtractMin - Esempio
25
41
37
13
10
77
28
head[H]
18
12
42
26 23
16
38
14 29
6
27
11 17
8
26/32
Heap Binomiali - ExtractMin - Esempio
25
41
37
13
10
77
28
head[H]
18
12
42
26 23
16 38
14 29
6
27
11 17
8
27/32
Decremento di una chiave
Binomial-Heap-Decrease-Key(H,x,k)if k>key[x] then errorkey[x]=k, y=x; z=p[x]while z NIL and key[y] < key[z] do
key[y] key[z]y = zz = p[y]
Si assegna un nuovo valore k alla chiave di un nodo x di una heap binomiale H. Errore se k > key[x]
28/32
Decremento di una chiave - Esempio
25
41
37
13
10
77
28
head[H]
18
12
42
7 23
16 38
14 29
6
27
11 17
8
z
y
29/32
Decremento di una chiave - Esempio
25
41
37
13
10
77
28
head[H]
18
12
42
16 23
7 38
14 29
6
27
11 17
8z
y
30/32
Decremento di una chiave - Esempio
25
41
37
13
7
77
28
head[H]
18
12
42
16 23
10 38
14 29
6
27
11 17
8
z
y
31/32
Eliminazione di una chiave
Binomial-Heap-Delete(H,x):Binomial-Heap-Decrease-Key(H,x, )Binomial-Heap-Extract-Min(H)
Elimina un nodo x da uno heap binomiale H
32/32
Heap Binomiali - Sommario
heap binomiali heap
Min (log n) or (1) (1)
Extract-Min (log n) (log n)
Decrease-Key (log n) (log n)
Union (log n) (n)
Insert (log n) (log n)
Delete (log n) (log n)
Make-Empty (1) (1)
Is-Empty (1) (1)