heap binomiali

32
1/32 heap binomiali

description

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 - PowerPoint PPT Presentation

Transcript of heap binomiali

Page 1: heap binomiali

1/32

heap binomiali

Page 2: 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

Page 3: heap binomiali

3/32

Alberi Binomiali: esempi

B0

Bk

Bk-1

Bk-1

Page 4: heap binomiali

4/32

Alberi Binomiali: esempi

B0 B2B1 B3

Page 5: heap binomiali

5/32

Alberi Binomiali: esempi

B4

Page 6: heap binomiali

6/32

Alberi Binomiali: esempi

Bk

Bk-1

Bk-2B2

B1

B0

Page 7: heap binomiali

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

Page 8: heap binomiali

8/32

Heap Binomiali - Esempio

38

14 29

6

27

11 17

8

18

12 25

110head[H]

Page 9: heap binomiali

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

Page 10: heap binomiali

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

Page 11: heap binomiali

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

Page 12: heap binomiali

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.

Page 13: heap binomiali

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

Page 14: heap binomiali

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]

Page 15: heap binomiali

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]

Page 16: heap binomiali

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]

Page 17: heap binomiali

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]

Page 18: heap binomiali

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]

Page 19: heap binomiali

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

Page 20: heap binomiali

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

Page 21: heap binomiali

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)

Page 22: heap binomiali

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]

Page 23: heap binomiali

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

Page 24: heap binomiali

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’]

Page 25: heap binomiali

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

Page 26: heap binomiali

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

Page 27: heap binomiali

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]

Page 28: heap binomiali

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

Page 29: heap binomiali

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

Page 30: heap binomiali

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

Page 31: heap binomiali

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

Page 32: heap binomiali

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)