Gli Heap di Fibonacci
Transcript
Gli Heap di Fibonacci
Gli Heap di Fibonacci 1 Introduzione Possiamo dire che gli heap di Fibonacci sono basati sugli heap binomiali; un heap di Fibonacci è un insieme di alberi; impiega O(1) per eseguire le stesse operazioni degli heap binomiali, ad eccezione delle operazioni di eliminazione di un nodo; mentre gli heap binomiali impiegano O(lgn). 2 Struttura (I) ¾ È un insieme di alberi con l’ordinamento parziale dello heap; ¾ tali alberi non devono essere necessariamente binomiali; ¾ hanno una radice, ma non sono ordinati (a diff.dei binomiali); ¾ ogni nodo x contiene un puntatore al padre p[x] e a uno dei suoi figli (child[x]); 3 Struttura (II) ¾i figli di un nodo x sono collegati da una lista circolare a doppio collegamento; ¾ ogni figlio y ha due puntatori al fratello sinistro e destro (left[y] e right[y]). Se y non ha fratelli y=left[y]=right[y]; ¾ l’ordine in cui compaiono i fratelli in una lista è arbitrario; ¾ un nodo x contiene un campo degree[x] che contiene il numero di figli di x; ¾Il campo mark[x] ci dice se x ha perso almeno un figlio, dall’ultima volta in cui è diventato a sua volta figlio di un altro nodo (mark è un boolean). 4 Funzione potenziale (I) 9min[H] è il puntatore al nodo con chiave minima (che è sempre una radice). 9n[H] è il numero dei nodi contenuti attualmente in H. 9t(H) è il numero degli alberi contenuti nello heap di Fibonacci. 9m(H) è il numero dei nodi marcati in H. 9Funzione potenziale P(H): serve per analizzare le prestazioni delle operazioni sugli heap di Fibonacci P(H) = t(H) + 2 m(H) 5 Funzione potenziale (II) 9il potenziale di un insieme di heap di Fibonacci è dato dalla somma dei potenziali degli heap che lo costituiscono P(H)=P(H1)+P(H2)+…+P(Hn), dove H=H1+H2+…+Hn 9 Si assume che un’applicazione che fa uso di uno heap di Fibonacci inizia con un heap vuoto; dunque il potenziale è 0. 9 Il potenziale non è mai negativo. 9 GRADO MASSIMO: si assume che esiste un limite superiore D(n) al numero dei figli di ogni nodo di un heap di Fibonacci con n nodi. 9 D(n) = lgn 6 Esempio I min[H] 23 7 3 18 52 39 18 : nodo marcato Potenziale = 5+2*3=11 17 38 41 30 24 26 46 35 7 Esempio II min[H] 23 7 3 18 52 39 17 38 41 30 24 26 46 35 8 Operazioni Se devono essere fornite solo le operazioni MAKE-HEAP, INSERT, MINIMUM, EXTRACT-MIN e UNION, allora uno heap di Fibonacci non è altro che un insieme di alberi binomiali “non ordinati”. Creazione di uno heap di Fibonacci MAKE-FIB-HEAP(){ n[H]=0; min[H]=NULL; } t(H)=m(H)=0, quindi P(H)=0. Costo di MAKE-FIB-HEAP: O(1) 9 Inserimento di un nodo FIB-HEAP-INSERT(H, x){ Il nodo x è già stato allocato e degree(x)=0; key(x) è già impostato. p(x)=NULL; child(x)=NULL; left(x)=right(x)=x; mark(x)=FALSE; Tempo concatena la lista delle radici contenente x con O(1) la lista delle radici di H if (min(H)=NULL || key(x)<key(min(H))) min(H)=x; n(H)++; } P(H) =t(H) + 2*m(H) P(H’)=(t(H)+1) + 2*m(H) P(H)-P(H’)= 1 Aumento del potenziale=1 Dunque costo ammortizzato= costo reale +1 = O(1)+1 = O(1) 10 Inserimento del nodo 21 min[H] 23 7 21 3 18 39 52 17 38 41 30 24 26 46 35 11 Unione di due heap di Fibonacci FIB-HEAP-UNION(H1, H2){ H=MAKE-FIB-HEAP() min(H)=min(H1); concatena la lista delle radici di H2 con la lista delle radici di H if ((min(H1)=NULL) || (min(H2)!=NULL && min(H2)<min(H1))) min(H)=min(H2); n(H)=n(H1)+n(H2); rilascia gli oggetti H1 eH2 return H; } Variazione del potenziale: P(H) - ( P(H1)+P(H2) ) = = (t(H)+2*m(H)) – ( (t(H1)+2*m(H1)) - (t(H2)+2*m(H2)) ) Siccome P(H)=P(H1)+P(H2), costo ammortizzato= costo reale +0 = O(1) 12
Documenti analoghi
Code di Priorità
Utili per ripristinare la proprietà di ordinamento a
heap su un nodo v che non la soddisfi
La Sezione Aurea in Informatica
gerarchia padre-figlio, un nodo padre può avere al massimo due figli e tutti i nodi ad
esclusione della radice possiedono un padre.
I principali tipi di Heap sono:
1) Heap binario
2) Heap binomiale...