Concetti Chiave

  • L'heap è una struttura dati dinamica che si presenta come un albero binario, utile per implementare code a priorità e algoritmi di ordinamento.
  • Ogni nodo padre dell'heap è maggiore di tutti i nodi discendenti, permettendo di trovare rapidamente il valore massimo nella radice.
  • L'heap è memorizzato in un vettore dinamico, il che facilita la gestione della memoria e l'accesso ai nodi.
  • La funzione heapBuild applica le caratteristiche strutturali dell'heap a un nuovo vettore di valori, partendo dall'ultimo nodo padre per garantire la corretta struttura.
  • La funzione heapify mantiene le proprietà dell'heap nei sotto-alberi, verificando e scambiando i nodi se necessario per preservare l'integrità della struttura.

L’heap è una strutture dati dinamica implementata per semplicità quasi sempre come un ADT di prima categoria; si tratta, dal punto di vista logico, di un albero binario con determinate caratteristiche strutturali che rendono questa struttura dati particolarmente utile per l’implementazione di code a priorità, per ordinamenti e per svariati casi d’uso, permettendo di abbassarne il livello di complessità generale.

Quali sono le caratteristiche dell'heap?

La peculiarità dell’heap è quella di essere memorizzato all’interno di un vettore dinamico e che ogni nodo padre sia, come numero intero, maggiore di tutti i nodi discendenti; grazie a questa caratteristica, ad esempio, il valore maggiore dell’heap si trova nel nodo radice.

struct heap{

int heapsize;

int *vett;

}

Creazione e gestione dell'heap

Durante la creazione dell’heap viene sfruttata la funzione heapBuild dell’ADT che si occupa di far valere le caratteristiche strutturali dell’heap al nuovo vettore di valori a partire dall’ultimo nodo padre dell’albero rappresentante l’heap:

void heapBuild (Heap h) {

int i;

for (i=(h->heapsize)/2-1; i >= 0; i--)

heapify(h, i);

return;

}

Funzione heapify

La funzione heapify dell’ADT si occupa di applicare le proprietà dell’heap a tutti i sotto-alberi passati alla funzione, rendendo quindi il sotto-ramo aderente alle proprietà strutturali richieste.

void HEAPify(Heap h, int i) {

int l, r, largest;

l = LEFT(i);

r = RIGHT(i);

if ((l heapsize) && (h->A[l]>h->A) )

largest = l;

else

largest = i;

if ((rheapsize)&& (h->A[r]>h->A[largest]))

largest = r;

if (largest != i) {

Swap(h, i,largest);

HEAPify(h, largest);

}

return;

}

La funzione LEFT restituisce l’indice del figlio sinistro, RIGHT quello del figlio destro e swap scambia semplicemente i nodi.

Domande da interrogazione

  1. Qual è la principale caratteristica strutturale dell'heap?
  2. L'heap è caratterizzato dal fatto che ogni nodo padre è maggiore di tutti i nodi discendenti, permettendo così di trovare il valore maggiore nel nodo radice (come descritto nel testo).

  3. Come viene creato un heap a partire da un vettore di valori?
  4. L'heap viene creato utilizzando la funzione heapBuild, che applica le caratteristiche strutturali dell'heap a un nuovo vettore di valori partendo dall'ultimo nodo padre dell'albero (come spiegato nel testo).

  5. Qual è la funzione di heapify nell'ADT?
  6. La funzione heapify applica le proprietà dell'heap a tutti i sotto-alberi, garantendo che ogni sotto-ramo rispetti le caratteristiche strutturali richieste (come indicato nel testo).

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community