Heap binario: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m WPCleaner v1.37b - Fixed using Wikipedia:Check Wikipedia (Entità per le lineette) |
Aggiunta chiarificazione nella "condizione di forma" |
||
(34 versioni intermedie di 10 utenti non mostrate) | |||
Riga 1:
{{F|programmazione|febbraio 2013}}
[[File:HeapVector.PNG|thumb|Implementazione di un heap (min-heap) mediante Vettore]]
*Condizione di heap: se A è un genitore di B, allora la chiave di A è ordinata rispetto alla chiave di B conformemente alla [[relazione d'ordine]] applicata all'intero heap. In parole più semplici, se il nodo A è genitore del nodo B, allora il nodo A ha maggior priorità di B. Uno heap binario può essere definito in modo che le chiavi più prioritarie siano quelle più piccole (si parla di ''heap a minimo'') oppure in modo che le chiavi più prioritarie siano le più grandi (''heap a massimo'').
*Condizione di forma: tutti i livelli
== Implementazione con array ==
Dato ''j'', indice ad un nodo della heap, si definiscono padre di ''j'' il nodo in posizione <math>j/2</math>, figlio sinistro di ''j'' il nodo in posizione <math>j*2</math> e figlio destro di ''j'' il nodo in posizione <math>j*2+1</math>. Si possono quindi definire le funzioni Padre(j), FiglioSX(j), FiglioDX(j) che rispettivamente restituiscono l'indice del padre, del figlio sinistro e del figlio destro di j. Spesso sono implementate come macro o funzioni in linea.▼
Dato <var>j</var>, indice ad un nodo della heap, si ha che:
* il padre di <var>j</var> è il nodo in posizione <math>j/2</math>
* il figlio sinistro di <var>j</var> è il nodo in posizione <math>2*j</math>
* il figlio destro di <var>j</var> è il nodo in posizione <math>2*j+1</math>
▲
Nell'immagine in alto a
==
Sia
Un Heap di elementi appartenenti ad
*''Inserimento'':
*''Rimozione'': nello heap <math>H</math> si rimuove di massima priorità. Dopo la rimozione lo heap mantiene la proprietà di heap
== Code di priorità ==
{{Vedi anche|Coda di priorità}}
Un problema classico dell'informatica è ordinare delle code di dati che possiedono una data priorità. Questo tipo di problema viene risolto utilizzando liste concatenate o alberi binari (heap).
Line 31 ⟶ 34:
=== Albero binario con priorità ===
In questo tipo di implementazione ogni nodo contiene sia l'elemento che la priorità dell'elemento. Un albero è
<math>\forall v. val(v) \geq val(v')</math>, dove <math>v'</math> è il figlio di v.
Line 55 ⟶ 58:
Si inizia a considerare il primo nodo che non è una foglia si troverà a livello k -1. A questo livello si troveranno <math>2 ^ {k-1}</math> nodi.
Ogni controllo se un nodo contiene un heap ordinato sottostante utilizza 1 confronto tra i due ''fratelli'' e un confronto con il padre per un totale di
Passando al livello k - 2 si effettuano <math> 2 * 2 ^ {k -2} = 2 ^ {k -1} </math> quindi generalizzando al livello k - i si effettueranno <math>2 * 2 ^ {k -i} = 2 ^ {k - i + 1}</math> ossia
Line 62 ⟶ 65:
== Inserimento di un valore ==
Vediamo ora una rassegna dei principali metodi che sono associati ad una [[coda
In primo luogo analizziamo il metodo ''insert'', attraverso il quale, come dice il nome stesso, si inserisce un nuovo nodo all'interno dell'albero:
<pre>
Line 76 ⟶ 79:
</pre>
nell'algoritmo appare una tecnica di scorrimento dell'heap chiamata
== Sostituzione della radice ==
Capita spesso in una struttura heap, di effettuare la sostituzione della radice con un nuovo elemento.
Una volta che l'elemento viene sostituto capita che l'heap non sia più ordinato. Per questo motivo si opera il downheap, controllando a livello inferiore (<var>2i</var> e <var>2i+1</var>) quale sia l'elemento più piccolo da promuovere alla posizione di radice. Questa procedura è ricorsiva e permette di riportare l'heap nella condizione di struttura ordinata.
== Cancellazione della radice ==
Un'operazione classica di una struttura heap è la cancellazione della radice. Quest'operazione può comportare problemi a mantenere la struttura dell'heap. Il metodo più semplice è quello di sostituire il valore nella radice che si intende cancellare con il valore minimo presente nell'heap. Inizialmente il valore nella radice dell'heap viene sostituito con l'ultimo valore dell'array associato all'heap che è anche il valore più a destra nell'ultimo livello dell'albero completo. A questo punto si effettua con un approccio di tipo top down il ripristino della struttura dell'heap con
== Voci correlate ==
* [[
* [[Heap binomiale]]
== Altri progetti ==
{{Interprogetto|preposizione=sull'}}
== Collegamenti esterni ==
* {{Collegamenti esterni}}
{{strutture dati}}
|