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:

  1. 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 .

  2. Le foglie occupano le posizioni .

  3. 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) e right(i) sono max heap

    max_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 heap

    che al termine i = 0 quindi A[1..n] sono radici di max heap, compreso A[1] che è la radice.

    Ha complessità , ma più precisamente: perchè per la prima e terza proprietà e se .