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_sizecorrisponde 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 = 0quindiA[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 .