Menu
CoddyTech

Heap (Binary Heap)

Terakhir diperbarui

Binary heap adalah complete binary tree yang menyimpan nilai terkecil (min-heap) atau terbesar (max-heap) di root. Visualisasi ini adalah min-heap: setiap induk lebih kecil atau sama dengan anak-anaknya. Untuk menambahkan sebuah nilai, kamu menaruhnya di slot kosong berikutnya, lalu "menaikkannya" (sift up), yaitu menukarnya dengan induknya selama nilainya lebih kecil, sampai sifat heap terpenuhi lagi. Tekan Putar di atas untuk melihat setiap nilai baru naik ke tempatnya.

Karena heap adalah complete tree, heap bisa disimpan secara ringkas di dalam array: anak dari node i ada di 2i+1 dan 2i+2. Penyisipan dan pengambilan nilai minimum bernilai O(log n) (satu jalur dari root ke leaf), sedangkan melihat nilai minimum bernilai O(1), dan itulah persis yang dibutuhkan priority queue.

Kompleksitas waktu dan ruang

OperasiKompleksitasCatatan
Lihat min/max (peek)O(1)Selalu ada di root
Sisipkan (push)O(log n)Sift up sepanjang satu jalur
Ambil min/maxO(log n)Sift down sepanjang satu jalur
Bangun heapO(n)Heapify sekaligus
RuangO(n)Berbasis array, tanpa pointer

Langkah demi langkah (push)

LangkahApa yang terjadi
1Tambahkan nilai baru di akhir (leaf kosong berikutnya).
2Bandingkan nilai itu dengan induknya.
3Jika lebih kecil (min-heap), tukar ke atas.
4Ulangi sampai nilainya tidak lagi lebih kecil daripada induknya, atau sudah mencapai root.

Contoh penerapan

Membangun min-heap dengan melakukan push [5, 3, 8, 1, 4] satu nilai demi satu nilai:

PushArray setelah sift-upAksi
5[5]Nilai pertama menjadi root.
3[3, 5]3 < induk 5, jadi tukar ke atas menjadi root.
8[3, 5, 8]8 > induk 5, jadi tetap menjadi leaf.
1[1, 3, 8, 5]1 < induk 5, tukar; lalu 1 < induk 3, tukar menjadi root.
4[1, 3, 8, 5, 4]4 > induk 3, jadi tetap di tempat; nilai minimum 1 tetap di root.

Kapan memakai heap

Pakai saatHindari saat
Kamu berulang kali butuh item terkecil atau terbesar dari kumpulan data yang terus berubah.Kamu perlu mencari nilai sembarang, bukan hanya nilai ekstremnya: pakai BST atau hash set.
Kamu sedang mengimplementasikan priority queue untuk Dijkstra, A*, atau penjadwal tugas.Kamu butuh data yang selalu terurut sepenuhnya setiap saat.
Kamu ingin penyisipan dan pengambilan nilai minimum O(log n) dengan tata letak array yang ringkas.Kamu butuh pencarian atau penghapusan cepat untuk elemen tertentu (yang bukan root).
Kamu perlu menggabungkan aliran item dan mengeluarkannya berdasarkan prioritas.Datanya sangat kecil dan pemindaian linear lebih sederhana serta sudah cukup cepat.

Kode Heap (Priority Queue)

Implementasi Heap (Priority Queue) yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Heap (Priority Queue) dalam Python

Python
1class MinHeap:2    def __init__(self):3        self.data = []4
5    def push(self, value):6        # Append at the end, then bubble up to restore order7        self.data.append(value)8        i = len(self.data) - 19        while i > 0:10            parent = (i - 1) // 211            if self.data[parent] <= self.data[i]:12                break13            self.data[i], self.data[parent] = self.data[parent], self.data[i]14            i = parent15
16    def pop(self):17        # Move the last leaf to the root, then sift it down18        top = self.data[0]19        last = self.data.pop()20        if self.data:21            self.data[0] = last22            self._sift_down(0)23        return top24
25    def _sift_down(self, i):26        n = len(self.data)27        while True:28            smallest = i29            left, right = 2 * i + 1, 2 * i + 230            if left < n and self.data[left] < self.data[smallest]:31                smallest = left32            if right < n and self.data[right] < self.data[smallest]:33                smallest = right34            if smallest == i:35                return36            self.data[i], self.data[smallest] = self.data[smallest], self.data[i]37            i = smallest38
39
40heap = MinHeap()41for value in [5, 3, 8, 1, 9, 2]:42    heap.push(value)43
44print("Heap array:     ", heap.data)45print("Popped in order:", [heap.pop() for _ in range(6)])
Jalankan kode ini di Playground Python

FAQ Heap

Untuk apa heap dipakai?

Heap dipakai untuk mengimplementasikan priority queue, yang menggerakkan algoritma jalur terpendek Dijkstra, penjadwal tugas, dan simulasi event. Heap juga menjadi mesin di balik heapsort. Setiap kali kamu berulang kali butuh item terkecil atau terbesar dari kumpulan data yang terus berubah, heap adalah alatnya.

Apa perbedaan heap dan binary search tree?

Keduanya adalah binary tree, tetapi BST menjaga urutan terurut penuh dari kiri ke kanan (sehingga memungkinkan pencarian berurutan), sedangkan heap hanya menjamin hubungan induk dan anak (nilai min atau max di root). Heap memberi akses O(1) ke nilai ekstrem; BST memberi pencarian O(log n) untuk nilai apa pun.

Mengapa heap disimpan di dalam array?
Karena heap selalu berupa complete binary tree, node-nya terpetakan sempurna ke indeks array: anak dari indeks i ada di 2i+1 dan 2i+2, dan induknya ada di (i-1)/2. Cara ini menghindari penyimpanan pointer anak dan memberi performa cache yang sangat baik.
Apakah heap sama dengan array terurut?
Tidak. Heap hanya menjamin setiap induk lebih kecil (min-heap) atau lebih besar (max-heap) daripada anak-anaknya, jadi node yang bersaudara atau bersepupu tidak punya urutan tertentu. Array terurut tersusun penuh, tetapi penyisipannya berbiaya O(n), sedangkan heap menyisipkan dalam O(log n) sambil tetap memberi akses instan ke nilai ekstrem.
Kapan sebaiknya memakai heap, bukan sekadar mengurutkan array?
Pakai heap saat datanya terus berubah dan kamu hanya butuh nilai minimum atau maksimum saat ini: setiap penyisipan dan pengambilan berbiaya O(log n), dibandingkan mengurutkan ulang seluruh array. Jika datamu statis dan kamu ingin setiap elemen terurut, satu kali pengurutan O(n log n) lebih sederhana dan sering lebih cepat.
Apakah membangun heap dari n item butuh O(n log n)?
Tidak, jika kamu membangunnya sekaligus. Menyisipkan n item satu per satu bernilai O(n log n), tetapi heapify dari bawah ke atas, yang melakukan sift down mulai dari induk terakhir sampai root, secara keseluruhan berjalan dalam O(n), karena sebagian besar node berada di dekat dasar dan hanya turun sejauh jarak yang pendek.
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai