Heap binario
Min heap binario
Dato un insieme di chiavi totalmente ordinabile, un heap binario è un albero binario che memorizza chiavi dell’insieme:
- ogni nodo contiene una chiave
- l’albero è binario completo quasi perfettamente bilanciato a sinistra. È completo fino al penultimo livello, mentre all’ultimo livello le foglie sono ammassate a sinistra
- per ogni nodo
vla chiave memorizzata è delle chiavi memorizzate nel sottoalbero radicato inv
Max heap binario
È uguale al min heap binario, solo che per ogni nodo v la chiave memorizzata è delle chiavi memorizzate nel sottoalbero radicato in v.
Proprietà
Un heap con nodi ha altezza .

Quindi un heap ha almeno tanti nodi quandi ne ha un albero binario completo perfettamente bilanciato di altezza .
E ovviamente non ha più nodi di quandi ne ha un albero binario completo perfettamente bilanciato di altezza
L’heap binario viene rappresentato come un array, dove vengono inserite le chiavi livello per livello da sinistra a destra.

padre(i):
return ⌈i/2⌉-1
figlioSinistro(i):
return 2i+1
figlioDestro(i):
return 2(i+1)
Primitive
costruisciHeap(H): costruisce un heap a partire da un array di chiavi memorizzate nell’arrayH- sarebbe , ma facendo dei calcoli si scopre che èminimoHeap(H) -> k: ritorna la chiave minima memorizzata in H -decrementaChiaveHeap(H, i, k): decrementa il valore della chiave all’indice i nell’heap H, impostando il valore a k -- inserzioneChiaveHeap(H, k): inserisce una nuova chiave k in H -
heapify(H, i): ripristina la proprietà dell’ordinamento di un heap in seguito all’incremento di una chiave già presente nell’heap -estrazioneMinimoHeap(H) -> k: restituisce la chiave minima e la elimina dell’heap -
minimoHeap(H):
return H[0]
decrementaChiaveHeap(H, i, k):
if H[i] < k then
return error "Chiave maggiore di quella attuale"
H[i] := k
while i > 0 and H[padre(i)] > k do
scambia H[padre(i)] con H[i]
i := padre(i)
inserzioneChiave(H, k):
if dim(H) == H.lenght then
return error "L'heap è pieno"
setDim(H) := dim(H) + 1
H[dim(H)] := k
decrementaChiaveHeap(H, dim(H), k)
heapify(H, i):
min := i
s := figlioSinistro(i)
d := figlioDestro(i)
if s <= dim(H) and H[s] < H[i] then
min := s
if d <= dim(H) and H[d] < H[min] then
min := d
if min != i then
scambia H[i] con H[min]
heapify(H, min)
estrazioneMinimo(H):
if dim(H) < 0 then
return error "heap empty"
tmp := minimo(H)
H[0] := H[dim(H)]
setDim(H) := dim(H) - 1
heapify(H, 0)
return tmp
costruisciHeap(H):
for i=padre(dim(H)) downto 0 do
heapify(H, i)