Heap
Un albero binario è detto heap se è completo fino al livello , e il resto delle foglie sono verso sinistra.
Per esempio, un albero può essere:
e potrà essere rappresentato in un array come A = [16, 3, 10, 0, 2, 4]
.
Per cui il padre di i
si raggiunge con floor(i/2)
, mentre il figlio sinistro con 2*i
e il destro con 2*i+1
.
In base all'ordinamento di ogni nodo i
, un heap può essere specializzato in:
- Max heap, se
A[parent(i)] >= A[i]
- Min heap, se
A[parent(i)] <= A[i]
che garantiscono che la radice contiene il nodo più grande o più piccolo rispettivamente.
Proprietà
Per un heap di , si ha che:
-
Ha altezza .
Questo si può dimostrare perchè: cioè che è tra il numero di nodi di un albero completo alto e , per cui: e quindi dato che .
-
Le foglie occupano le posizioni .
-
Può possedere al più nodi che hanno altezza .
Infatti con ci sono foglie, mentre con ci sono nodi.
Implementazione
-
Heapify, per ripristinare l'heap sapendo che
left(i)
eright(i)
sono max heapmax_heapify(Heap A, Node i) l = left(i) r = right(i) max = i if l <= A.heap_size and A[l] > A[i] max = l if r <= A.heap_size and A[r] > max max = r if i != max swap(A[i], A[max]) max_heapify(A, max)
dove
A.heap_size
corrisponde a mentre cioè per la prima proprietà. -
Costruzione, per generare gradualmente l'heap da , cioè i nodi sopra le foglie, fino alla radice
build_max_heap(Array A) A.heap_size = A.length for i = floor(A.length/2) down to 1 max_heapify(A, i)
che è corretto per l'invariante del
for
:Ogni nodo in
A[i+1..n]
è radice di un rispettivo max heapche al termine
i = 0
quindiA[1..n]
sono radici di max heap, compresoA[1]
che è la radice.Ha complessità , ma più precisamente: perchè per la prima e terza proprietà e se .