DAA - Binary Heap

Esistono diversi tipi di heap, tuttavia in questo capitolo discuteremo di heap binari. UNbinary heapè una struttura dati, che sembra simile a un albero binario completo. La struttura dei dati dell'heap obbedisce alle proprietà di ordinamento discusse di seguito. In genere, un heap è rappresentato da un array. In questo capitolo, rappresentiamo un mucchio diH.

Poiché gli elementi di un heap sono archiviati in un array, considerando l'indice iniziale come 1, la posizione del nodo padre di ith elemento può essere trovato a ⌊ i/2 ⌋. Figlio sinistro e figlio destro diith il nodo è in posizione 2i e 2i + 1.

Un heap binario può essere ulteriormente classificato come file max-heap o a min-heap in base alla proprietà dell'ordine.

Max-Heap

In questo heap, il valore della chiave di un nodo è maggiore o uguale al valore della chiave del figlio più alto.

Quindi, H[Parent(i)] ≥ H[i]

Min-Heap

In mean-heap, il valore della chiave di un nodo è minore o uguale al valore della chiave del figlio più basso.

Quindi, H[Parent(i)] ≤ H[i]

In questo contesto, le operazioni di base sono mostrate di seguito rispetto a Max-Heap. L'inserimento e la cancellazione di elementi in e da heap richiedono una riorganizzazione degli elementi. Quindi,Heapify la funzione deve essere chiamata.

Rappresentazione di array

Un albero binario completo può essere rappresentato da un array, memorizzando i suoi elementi utilizzando l'attraversamento dell'ordine dei livelli.

Consideriamo un heap (come mostrato di seguito) che sarà rappresentato da un array H.

Considerando l'indice di partenza come 0, utilizzando l'attraversamento dell'ordine dei livelli, gli elementi vengono mantenuti in un array come segue.

Index 0 1 2 3 4 5 6 7 8 ...
elements 70 30 50 12 20 35 25 4 8 ...

In questo contesto, le operazioni sull'heap vengono rappresentate rispetto a Max-Heap.

Per trovare l'indice del genitore di un elemento in index i, il seguente algoritmo Parent (numbers[], i) si usa.

Algorithm: Parent (numbers[], i) 
if i == 1 
   return NULL 
else 
   [i / 2]

L'indice del figlio sinistro di un elemento in index i può essere trovato utilizzando il seguente algoritmo, Left-Child (numbers[], i).

Algorithm: Left-Child (numbers[], i) 
If 2 * i ≤ heapsize 
   return [2 * i] 
else 
   return NULL

L'indice del figlio destro di un elemento in index i può essere trovato utilizzando il seguente algoritmo, Right-Child(numbers[], i).

Algorithm: Right-Child (numbers[], i) 
if 2 * i < heapsize 
   return [2 * i + 1] 
else 
   return NULL