La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Heap di Fibonacci. Una heap di Fibonacci é un insieme di alberi (non necessariamente binomiali) con l’ordinamento parziale a heap. Gli alberi hanno una.

Presentazioni simili


Presentazione sul tema: "Heap di Fibonacci. Una heap di Fibonacci é un insieme di alberi (non necessariamente binomiali) con l’ordinamento parziale a heap. Gli alberi hanno una."— Transcript della presentazione:

1 heap di Fibonacci

2 Una heap di Fibonacci é un insieme di alberi (non necessariamente binomiali) con l’ordinamento parziale a heap. Gli alberi hanno una radice ma non sono ordinati. Hanno una struttura meno vincolata delle heap binomiali, permettendo di differire il lavoro di riorganizzazione della struttura.

3 heap di Fibonacci - Esempio 39 1852 3237 41 3830 17 35 2646 24 min(H) I nodi rossi sono nodi marcati, cioè nodi che hanno perso un figlio dall’ultima volta in cui erano diventati loro stessi figli di un altro nodo. Si accede all’albero da un puntatore al nodo con chiave minima (il nodo minimo)

4 heap di Fibonacci - Esempio 39 1852 3237 41 3830 17 35 2646 24 min(H) Campi di ogni nodo: key data deg p child left right

5 heap di Fibonacci – creazione Make-Fib-Heap alloca e restituisce una heap di Fibonacci H, per la quale n[H]=0 e min[H]=NIL.

6 inserimento di un nuovo nodo inserisce un nodo x nella heap H Fib-Heap-Insert(H,x) deg[x]=0 p[x]=NIL child[x]=NIL left[x]=x right[x]=x mark[x]=FALSE concatena la lista delle radici contenente x con la lista delle radici di H if min[H] == NIL or key[x] { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.it/12/4136494/slides/slide_6.jpg", "name": "inserimento di un nuovo nodo inserisce un nodo x nella heap H Fib-Heap-Insert(H,x) deg[x]=0 p[x]=NIL child[x]=NIL left[x]=x right[x]=x mark[x]=FALSE concatena la lista delle radici contenente x con la lista delle radici di H if min[H] == NIL or key[x]

7 heap di Fibonacci - Insert - Esempio 39 1852 3237 41 3830 17 35 2646 24 min(H) 2

8 heap di Fibonacci - Insert - Esempio 39 1852 3237 41 3830 17 35 2646 24 min(H) 2

9 heap di Fibonacci - Insert - Esempio 39 1852 3237 41 3830 17 35 2646 24 min(H) 2

10 Estrazione del nodo minimo E’ un’operazione complicata. Realizza la ristrutturazione dell’albero. Utilizza una procedure Consolidate per ristrutturare la lista delle radici di H, che itera i due passi seguenti fino a quando ogni radice nella lista delle radici ha grado diverso: 1) trova due radici x e y nella lista delle radici con lo stesso grado, dove key[x] ≤ key[y] 2) collega y a x: togli y dalla lista delle radici e fallo diventare figlio di x. deg[x] cresce e mark[y] va a false.

11 Estrazione del nodo minimo Fib-Heap-Extract-Min(H) z = min[H] if z ≠ NIL thenforeach figlio x di z do aggiungi x alla lista delle radici di H p[x]=NIL togli z dalla lista delle radici di H if z == right[z] thenmin[H]=NIL elsemin[H] = right[z] Consolidate(H) n[H] = n[H]-1 return z

12 heap di Fibonacci - ExtractMin - Esempio 39 1852 3237 41 3830 17 35 2646 24 min(H) 21

13 heap di Fibonacci - ExtractMin - Esempio 39 1852237 41 38 30 17 35 2646 24 min(H) 21

14 heap di Fibonacci - ExtractMin - Esempio 39 1852237 41 38 30 17 35 2646 2421 01234

15 heap di Fibonacci - ExtractMin - Esempio 39 1852237 41 38 30 17 35 2646 2421 01234

16 heap di Fibonacci - ExtractMin - Esempio 39 1852237 41 38 30 17 35 2646 2421 01234

17 heap di Fibonacci - ExtractMin - Esempio 39 1852 23 7 41 38 30 17 35 2646 2421 01234

18 heap di Fibonacci - ExtractMin - Esempio 39 1852 23 7 41 38 30 17 35 2646 2421 01234

19 heap di Fibonacci - ExtractMin - Esempio 39 1852 23 7 41 38 30 17 35 2646 24 21 01234

20 heap di Fibonacci - ExtractMin - Esempio 39 1852 23 7 41 38 30 17 35 2646 24 21 01234

21 heap di Fibonacci - ExtractMin - Esempio 39 1852 23 7 41 38 30 17 35 2646 24 21 01234

22 heap di Fibonacci - ExtractMin - Esempio 39 18 52 23 7 41 38 30 17 35 2646 2421 01234

23 heap di Fibonacci - ExtractMin - Esempio 39 18 52 23 7 41 38 30 17 35 2646 2421 min(H)

24 Decremento di una chiave Viene decrementata al valore k la chiave del nodo x della heap H. Fib-Heap-Decrease-Key(H,x,k) key[x] = k; y = p[x] if y ≠ NIL and key[x] < key[y] then Cut(H,x,y), Cascading-Cut(H,y) if key[x] < key[min[H]] then min[H]=x Cut(H,x,y) togli x dalla lista dei figli di y, decrementando deg[y] aggiungi x alla lista delle radici di H p[x] = NIL; mark[x] = FALSE Cascading-Cut(H,y) z = p[y] if z≠NIL then if not(mark[y]) then mark[y]=TRUE else Cut(H,y,z),Cascading-Cut(H,z)

25 Decremento di una chiave: Esempio 39 18 52 23 7 41 38 30 17 35 2646 2421 min(H) 15

26 Decremento di una chiave: Esempio 39 18 52 23 7 41 38 30 17 35 26 15 2421 min(H)

27 Decremento di una chiave: Esempio 2 39 18 52 23 7 41 38 30 17 35 26 15 2421 min(H) 5

28 Decremento di una chiave: Esempio 2 39 18 52 23 7 41 38 30 17 26 15 2421 min(H) 5

29 Decremento di una chiave: Esempio 2 39 18 52 23 7 41 38 30 17 2615 2421 min(H) 5

30 Decremento di una chiave: Esempio 2 39 18 52 23 7 41 38 30 17 261524 21 min(H) 5

31 Limitazione al grado massimo Sia D(n) il massimo grado possibile per un nodo in una heap di Fibonacci con n elementi Se D(n) è O(lgn) allora il tempo ammortizzato di ExtractMin e Delete è O(lgn). Per mostrarlo, l’idea è mostrare che size(x) – num. nodi contenuti nel sottoalbero radicato in x – cresce esponenzialmente in deg(x).

32 Limitazione al grado massimo Lemma Sia x un nodo di una heap di Fibonacci con deg(x) = k. Siano y 1,..., y k i figli di x nell’ordine in cui erano stati collegati a x, dal meno recente al più recente. Quindi deg(y 1 )  0 e deg(y i )  i – 2 per i = 2, 3,..., k.

33 Limitazione al grado massimo Numeri di Fibonacci F 0 = 0F 1 = 1F k = F k – 1 + F k – 2 Lemma Per ogni k  0: F k + 2 = 1 +  i = 0...k F i

34 Limitazione al grado massimo Lemma Sia x un nodo in una heap di Fibonacci con deg(x) = k. Allora size(x)  F k + 2   k, dove  = (1 +  5)/2.

35 Limitazione al grado massimo Corollario Il massimo grado D(n) di qualsiasi nodo in una heap di Fibonacci con n nodi è O(lgn). Dimostrazione Sia x un nodo in una heap H con n nodi e sia k=deg[x]. Dal Lemma prec. si ha che n ≥ size[x] ≥  k. Utilizzando i logaritmi in base  si ha k ≤ log  n. Il grado massimo di un qualunque nodo è quindi O(lgn).

36 heap di Fibonacci - Sommario heap di Fibonacci heap binomialiHeap Min  (1)  (log n)  (1) ExtractMin  (log n) DecreaseKey  (1)  (log n) Union  (1)  (log n) (n)(n) Insert  (1)  (log n) Delete  (log n) MakeEmpty  (1) IsEmpty  (1)


Scaricare ppt "Heap di Fibonacci. Una heap di Fibonacci é un insieme di alberi (non necessariamente binomiali) con l’ordinamento parziale a heap. Gli alberi hanno una."

Presentazioni simili


Annunci Google