320 likes | 536 Views
heap binomiali. Heap binomiale. Una heap binomiale è un insieme di alberi binomiali. Un albero binomiale B k è un albero ordinato definito ricorsivamente per cui valgono le seguenti proprietà: I nodi dell’albero sono 2 k L’altezza dell’albero è k
E N D
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.
Alberi Binomiali: esempi B0 Bk-1 Bk-1 Bk
Alberi Binomiali: esempi B0 B1 B2 B3
Alberi Binomiali: esempi B0 B1 B2 Bk-2 Bk-1 Bk
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
Heap Binomiali - Esempio 10 1 6 head[H] 12 25 8 14 29 18 11 17 38 27
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] p key deg child sibling
Heap Binomiali - Min Ricerca della chiave minima input: una heap binomiale H con n nodi output: puntatore al nodo con chiave minima (è in una radice!) Binomial-Heap-Minimum(H): y=NIL x=head[H] min= whilex NIL do ifkey[x] < min thenmin= key[x]; y=x x = sibling[x] returny
Unione Collega 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] = z sibling[y] = child[z] child[z] = y degree[z] = degree[z]+1
Binomial-Heap-Union Unisce H1 e H2, distruggendole. Binomial-Heap-Union(H1,H2): H= Make-Binomial-Heap() P= Head[H]; P1= Head[H1]; P2= Head[H2] whileP1 NIL andP2 NIL do ifDeg[P1] < Deg[P2]then Sibling[P]= P1; P1 = Sibling[P1] else Sibling[P] = P2; P2 = Sibling[P2] whileP1 NIL do Sibling[P] = P1; P1 = Sibling[P1] whileP2 NIL do Sibling[P] = P2; P2 = Sibling[P2]
Binomial-Heap-Union (cont.) prev_x=NIL; x = head[H]; next_x = sibling[x] while next_x ≠ NIL do ifdeg[x] ≠ deg[next_x] or (sibling[next_x] ≠ NIL anddeg[sibling[next_x]] == deg[x]) then prev_x = x; x = next_x elseifkey[x] ≤ key[next_x] thensibling[x] = sibling[next_x]; Binomial-Link(next_x,x) elseif prev_x == NIL thenhead[H] = next_x elsesibling[prev_x] = next_x BinomialLink(x,next_x) x = next_x next_x = sibling[x] returnH
Heap binomiale - Unione - Esempio 18 3 6 head[H2] H2 37 8 29 10 44 head[H1] 12 7 15 30 23 22 48 31 17 H1 25 28 33 45 32 24 50 41 55
Heap Binomiali - Unione - esempio head[H] 12 18 7 3 15 6 H1H2 25 37 28 33 8 29 10 44 41 30 23 22 48 31 17 45 32 24 50 55
Heap Binomiali - Unione - esempio head[H1] H1H2 12 7 3 15 6 18 25 37 28 33 8 29 10 44 41 30 23 22 48 31 17 45 32 24 50 55
Heap Binomiali - Unione - Esempio head[H1] H1H2 12 3 15 6 18 7 37 28 33 8 29 10 44 25 41 30 23 22 48 31 17 45 32 24 50 55
Heap Binomiali - Unione - Esempio head[H1] H1H2 6 12 3 8 29 10 44 18 15 7 37 30 23 22 48 31 17 28 33 25 45 32 24 50 41 55
Heap Binomiali - Inserimento Inserisce un nodo in una heap binomiale Binomial-Heap-Insert(H, x): H’= Make-Binomial-Heap() p[x]= NIL child[x] =NIL sibling[x]= NIL deg[x]= 0 Head[H’]= x H= Binomial-Heap-Union(H,H’)
Heap Binomiali - ExtractMin Elimina da una heap binomiale H il nodo con chiave minima e restituisce il puntatore a quel nodo Binomial-Heap-Extract-Min(H) min= ;MinKey = NIL;MKP = NIL P= Head[H]; PP = Head[H] whileP NIL do ifkey[P] < min thenmin= Key[P]; MinKey = P;MKP = PP PP = P; P = Sibling[P] ifMinKey == NIL then return fail (cont…)
Heap Binomiali - ExtractMin (cont.) (… cont) H1= Make-Binomial-Heap() ifMKP head[H] thensibling[MKP] = sibling[MinKey] elsehead[H] = sibling[MinKey] P = left[MinKey] whileP 0 do S = sibling[P] sibling[P] = head[H1] head[H1] =P p[P] = 0 P = S H= Binomial-Heap-Union(H,H1)
Heap Binomiali - ExtractMin - Esempio head[H] 37 10 1 41 28 13 6 16 12 25 77 8 14 29 26 23 18 11 17 38 42 27
Heap Binomiali - ExtractMin - Esempio head[H] x 37 10 1 41 28 13 6 16 12 25 77 8 14 29 26 23 18 11 17 38 42 27
Heap Binomiali - ExtractMin - Esempio head[H] head[H’] 12 25 37 10 16 6 18 41 28 13 26 23 8 14 29 77 42 11 17 38 27
Heap Binomiali - ExtractMin - Esempio head[H] 12 10 25 37 16 6 18 28 13 41 26 23 8 14 29 77 42 11 17 38 27
Heap Binomiali - ExtractMin - Esempio head[H] 12 25 6 18 37 10 8 14 29 41 28 13 11 17 38 16 27 77 26 23 42
Decremento di una chiave Si assegna un nuovo valore k alla chiave di un nodo x di una heap binomiale H. Errore se k > key[x] Binomial-Heap-Decrease-Key(H,x,k) if k>key[x] then error key[x]=k, y=x; z=p[x] while z NIL and key[y] < key[z] do key[y] key[z] y = z z = p[y]
Decremento di una chiave - Esempio head[H] 12 25 6 18 37 10 8 14 29 z 41 28 13 11 17 38 16 y 27 77 7 23 42
Decremento di una chiave - Esempio head[H] 12 25 6 18 z 37 10 8 14 29 41 y 28 13 11 17 38 7 27 77 16 23 42
Decremento di una chiave - Esempio head[H] 12 25 z 6 18 37 y 7 8 14 29 41 28 13 11 17 38 10 27 77 16 23 42
Eliminazione di una chiave Elimina un nodo x da uno heap binomiale H Binomial-Heap-Delete(H,x): Binomial-Heap-Decrease-Key(H,x, ) Binomial-Heap-Extract-Min(H)