Heap


Apa itu Heap?

Heap adalah struktur data berbasis pohon yang memenuhi sifat heap. Sifat heap menyatakan bahwa untuk setiap node didalam heap, nilai node tersebut lebih besar dari atau sama dengan (untuk max heap) atau kurang dari atau sama dengan (untuk min heap) nilai anak-anaknya.


Notes

  • Heap dibagi menjadi dua jenis: Max heap dan Min heap. Max heap memiliki nilai terbesar di bagian atas, sedangkan Min heap memiliki nilai terkecil di bagian atas.
  • Insert dan delete elemen pada heap hanya dilakukan pada root heap, karena hanya root yang berpengaruh pada sifat heap.

Ilustrasi

heap visualization
heap visualization

Berikut merupakan contoh proses membuat array menjadi Max Heap,

heap visualization

Pada ilustrasi di sebelah kiri, ada tree yang sudah dibuat berdasarkan array kita, index pada tiap node ditulis sesuai array pada ilustrasi sebelumnya.

Ilustrasi sebelah kanan, menggambarkan bahwa kita akan mulai dari index di tengah ( SIZE / 2 + 1 ) yaitu index 2, untuk melihat apakah anak-anak dari node tersebut mempunyai angka yang lebih besar dari node yang sekarang kita cek.

heap visualization
heap visualization

Ternyata benar bahwa angka dibawah node 2 adalah 5 dimana nilainya lebih besar dari node 2, kita akan menukar tempat kedua node tersebut agar property heap terpenuhi (node diatas harus lebih besar dibanding anak-anaknya)

heap visualization

Kita lanjutkan prosesnya, yaitu ke index 1, menurun dari sebelumnya kita cek index 2, ternyata node tersebut tidak mempunyai anak yang lebih besar valuenya, maka kita tidak akan melakukan apa-apa.

heap visualization

Proses selanjutnya, di index terakhir yaitu 0, kita lihat bahwa anaknya mempunyai value yang lebih besar yaitu 8, maka kita tukar kedua node tersebut.

heap visualization
heap visualization

Jika kita menukar node, kita akan melakukan proses rekursif ke node dibawahnya lagi, oleh karena itu, kita lihat bahwa node dengan value 3 dan 4 dibawah tertukar posisinya, kita lakukan proses pindah tempat lagi.

heap visualization

Jadilah sebuah heap dengan value tertinggi pada root node (node paling atas)!

heap visualization

Implementasi

#include <stdio.h>
#include <stdlib.h>

#define MAX_HEAP_SIZE 100

// Heap
typedef struct heap {
    int size;
    int arr[MAX_HEAP_SIZE];
} heap;

// Utility function to swap two elements in the heap
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// Utility function to maintain the max-heap property after deleting the root node
void max_heapify(heap *h, int i) {
    int l = 2 * i + 1;
    int r = 2 * i + 2;
    int largest = i;
    if (l < h->size && h->arr[l] > h->arr[largest]) {
        largest = l;
    }
    if (r < h->size && h->arr[r] > h->arr[largest]) {
        largest = r;
    }
    if (largest != i) {
        swap(&h->arr[i], &h->arr[largest]);
        max_heapify(h, largest);
    }
}

// Utility function to build a max-heap from an array
void build_max_heap(heap *h, int *arr, int n) {
    h->size = n;
    for (int i = 0; i < n; i++) {
        h->arr[i] = arr[i];
    }
    for (int i = h->size / 2 - 1; i >= 0; i--) {
        max_heapify(h, i);
    }
}

// Utility function to insert an element into the heap
void heap_insert(heap *h, int key) {
    if (h->size == MAX_HEAP_SIZE) {
        printf("Error: heap overflow!\n");
        return;
    }
    int i = h->size++;
    h->arr[i] = key;
    while (i > 0 && h->arr[(i - 1) / 2] < h->arr[i]) {
        swap(&h->arr[i], &h->arr[(i - 1) / 2]);
        i = (i - 1) / 2;
    }
}

int heap_max(heap *h) {
    return h->arr[0];
}

// Utility function to delete the root node (maximum element) from the heap
int heap_delete(heap *h) {
    if (h->size == 0) {
        printf("Error: heap underflow!\n");
        return -1;
    }
    int max = h->arr[0];
    h->arr[0] = h->arr[--h->size];
    max_heapify(h, 0);
    return max;
}

// Utility function to print the contents of the heap
void print_heap(heap *h) {
    printf("Heap contents: ");
    for (int i = 0; i < h->size; i++) {
        printf("%d ", h->arr[i]);
    }
    printf("\n");
}

// Main function
int main() {
    heap h;
    int arr[] = {12, 11, 13, 5, 6, 7};
    build_max_heap(&h, arr, 6);
    print_heap(&h);
    heap_insert(&h, 10);
    print_heap(&h);
    int max = heap_max(&h);
    printf("Max element: %d\n", max);
    heap_delete(&h);
    printf("After delete max element\n");
    print_heap(&h);
    return 0;
}

Output

Heap contents: 13 11 12 5 6 7
Heap contents: 13 11 12 5 6 7 10
Max element: 13
After delete max element
Heap contents: 12 11 10 5 6 7