Heap binomiale: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
AttoBot (discussione | contributi)
m Bot: inserimento template categorie qualità; modifiche estetiche
Riga 4:
[[File:Binomial-heap-13.svg|thumb|upright=1.4|Esempio di heap binomiale costituito da 13 nodi con chiavi distinte. Lo heap è costituito da 3 [[albero binomiale|alberi binomiali]] di grado rispettivamente 0, 2 e 3]]
Un '''heap binomiale''' è un insieme di [[Albero binomiale|alberi binomiali]] che soddisfa le seguenti proprietà:
# per qualsiasi intero <math>k</matH> non negativo esiste al più un albero binomiale la cui radice ha grado <math>k</math> (può anche non esserci). Ciò significa anche che non possono esservi più di un albero binomiale con il medesimo grado,
# ogni albero binomiale gode della proprietà di ordinamento parziale degli [[heap]], ossia ogni nodo di ciascun albero è tale che la propria chiave sia sempre maggiore o uguale della chiave del nodo padre.
 
Riga 11:
 
 
== Creazione di uno heap binomiale ==
La procedura di creazione restituisce uno heap binomiale vuoto e richiede tempo di esecuzione <math>\Theta(1)</math>. Il puntatore ''head[H]'' punterà alla testa della lista delle radici dello heap.
 
Riga 21:
</code>
 
== Ricerca della chiave minima ==
Ogni albero binomiale che costituisce uno heap binomiale gode della proprietà di ordinamento parziale degli heap, pertanto ognuno di essi avrà la chiave minima in corrispondenza della radice. La chiave minima dello heap binomiale sarà, quindi, contenuta, in uno dei nodi radice dei vari alberi binomiali che lo costituiscono, di conseguenza la ricerca della chiave minima si riduce ad una ricerca del minimo nella lista delle radici degli alberi binomiali. Il numero massimo di radici di alberi binomiali di uno heap binomiale è al più <math>\lfloor lgn \rfloor +1</math> dunque il tempo per l'esecuzione della ricerca è <math>O(lgn)</math>.
 
== Unione di due heap binomiali ==
Dato che un albero binomiale, per sua definizione, contiene esattamente <math>2^k</math> nodi al suo interno, con <math>k</math> grado dell'albero, deduciamo che uno heap binomiale possa contenere un qualsiasi numero di nodi al suo interno, componendo alberi binomiali di gradi diversi, esattamente come una cifra binaria è espressa in funzione delle diverse potenze di 2.
La somma di due heap binomiali avviene esattamente come la somma tra due numeri binari, dove un <math>1</math> in posizione <math>k</math> indica la presenza di un albero di grado <math>k</math> all'interno della struttura. Lo heap binomiale risultante avrà di conseguenza la stessa struttura del numero decimale risultato della somma.
Riga 47:
Dopodiché scorre ogni elemento (che sarà la radice di un albero binomiale) osservando i suoi due elementi successivi.
 
== Inserimento di un nodo ==
L'operazione di inserimento di un nodo in uno heap binomiale consiste nella creazione di un nuovo heap binomiale costituito solo dal nodo da inserire (con tempo di esecuzione <math>O(1)</math>) e in una successiva operazione di unione dello heap binomiale originale con lo heap binomiale appena creato (operazione che richiede tempo di esecuzione <math>O(lgn)</math>). Il tempo complessivo di esecuzione è pertanto <math>O(lgn)</math>.
 
== Estrazione del nodo con chiave minima ==
L'operazione di estrazione del nodo con chiave minima prevede l'eliminazione dallo heap binomiale del nodo con chiave minima restituendone il puntatore. Tale procedura consta di tre fasi e si supponga di indicare con <math>H</math> lo heap binomiale di partenza:
# si cerca la radice con la chiave minima e la si elimina dalla lista delle radici degli alberi binomiali,
Riga 58:
La procedura impiega tempo di esecuzione <math>O(lgn)</math>.
 
== Decremento di una chiave ==
{{...}}
 
== Eliminazione di una chiave ==
L'operazione di eliminazione di una chiave (senza che ne venga restituito un puntatore) consiste in due fasi:
# si decrementa al minimo valore rappresentabile dal calcolare il valore della chiave da eliminare,
Riga 67:
Le due operazioni richiedono rispettivamente tempo di esecuzione <math>O(lgn)</math> pertanto il tempo di esecuzione complessivo è sempre <math>O(lgn)</math>.
 
== Bibliografia ==
* Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, ''Introduzione agli algoritmi''. Jackson Libri, 2003, ISBN 88-256-1421-7.
 
Riga 73:
 
[[Categoria:Strutture dati]]
{{Linkcategorie VdQ|dequalità}}