Tiap struktur data jago di satu jenis kerjaan. Memilih struktur data artinya mencocokkan operasi yang paling sering kamu lakukan dengan struktur yang paling cepat untuk operasi itu. Mirip memilih alat di kotak perkakas: obeng bisa dipakai memukul paku, tapi palu jauh lebih cocok.
🧪 Tebakan cepat: kamu bikin tombol undo di editor teks. Aksi mana yang dibatalkan duluan, yang paling awal atau yang paling akhir? Jadi struktur apa yang cocok? Tebak dulu, jawabannya ada di bagian "Kalau kamu butuh X, pakai Y".
Kalau kamu butuh X, pakai Y
Kolom kedua juga menyebut biayanya dalam Big-O. O(1) artinya waktunya tetap, berapa pun banyak datanya. O(log n) tumbuh pelan sekali: 1.000 data, sekitar 10 langkah. O(n) artinya datanya dua kali lipat, waktunya kira-kira dua kali lipat.
| Kalau kamu butuh... | Pakai | Contoh sehari-hari |
|---|---|---|
| ambil data lewat nomor urut (index) | Array, O(1) | lagu ke-3 di playlist |
| sering sisip atau hapus di tengah | Linked list, O(1) di node yang sudah dipegang | sambung atau lepas gerbong kereta |
| yang terakhir masuk keluar duluan (LIFO) | Stack, O(1) | tombol undo, tombol back di browser |
| yang pertama masuk keluar duluan (FIFO) | Queue, O(1) | antrean cetak di printer |
| cari nilai lewat key (nama, id, kata) | Hash map (Map), rata-rata O(1) |
buku telepon: cari nomor lewat nama |
| cuma perlu tahu ada atau gak, tanpa duplikat | Set, rata-rata O(1) |
cek username sudah dipakai |
| data selalu terurut, sering dicari rentangnya | BST seimbang, O(log n) | jadwal dari jam 9 sampai jam 12 |
| yang terkecil atau terbesar diambil duluan | Heap, O(log n) | tugas paling mendesak dikerjakan duluan |
| cari kata lewat awalannya | Trie, O(panjang awalan) | kontak HP muncul setelah 3 huruf diketik |
| data bertingkat, tiap anak punya satu induk | Tree | folder di komputer |
| jaringan bebas, hubungannya bisa melingkar | Graph | pertemanan, peta jalan |
Dua baris yang paling sering dipakai, dalam kode:
// Undo: Stack, yang terakhir masuk keluar duluan
const riwayat = [];
riwayat.push("ketik judul");
riwayat.push("tebalkan judul");
console.log(riwayat.pop()); // "tebalkan judul": undo aksi terakhir
// Hitung kata: hash map, kata jadi key, jumlahnya jadi value
const jumlah = new Map();
for (const kata of ["kopi", "teh", "kopi"]) {
jumlah.set(kata, (jumlah.get(kata) || 0) + 1);
}
console.log(jumlah.get("kopi")); // 2
pushmenaruh aksi di ujung array,popmengambil yang paling akhir. Undo membatalkan aksi terakhir dulu, jadi jawaban tebakan tadi: Stack (LIFO).jumlah.get(kata) || 0memberi 0 untuk kata yang belum pernah muncul, lalu ditambah 1. Tiap kata rata-rata O(1), jadi sejuta baris teks tetap O(n). Kalau tiap kata dicari di array dulu, tiap pencarian O(n), dan totalnya O(n × n).
Cara memilih: dua pertanyaan
- Datanya paling sering dipakai buat apa? Disimpan berurutan (array, linked list, stack, queue), dicari dengan cepat (hash map, Set, BST, heap, trie), atau saling terhubung (tree, graph).
- Operasi apa yang paling sering? Ambil lewat index, cari, sisip, hapus, atau ambil yang terkecil. Pilih struktur yang paling murah untuk operasi itu, walau operasi lain jadi lebih mahal.
Kalau ragu, mulai dari array, Map, atau Set. Kebanyakan kode sehari-hari cukup dengan tiga itu. Ganti struktur kalau ada operasi yang sering dan terasa lambat.
⚠️ Jebakan yang sering ketemu
includesdi dalam loop.arr.includes(x)mengecek satu per satu, O(n). Di dalam loop jadi O(n × n). Buatnew Set(arr)sekali, lalu pakaihas.shift()untuk antrean yang besar.shift()menggeser semua isi array, O(n). Untuk antrean panjang, pakai queue beneran.- Linked list padahal array cukup. Sisip O(1) cuma berlaku di node yang sudah kamu pegang; mencarinya tetap O(n).
- BST yang gak seimbang. Kalau data masuk sudah urut, BST jadi memanjang kayak linked list, dan cari jadi O(n).
TL;DR: Pilih struktur dari operasi yang paling sering. Index: array. Terakhir masuk keluar duluan, misalnya undo: stack. Pertama masuk keluar duluan: queue. Cari lewat key atau menghitung kata: hash map. Cek ada atau gak: Set. Terurut dan rentang: BST seimbang. Terkecil atau terbesar duluan: heap. Awalan kata: trie. Bertingkat: tree. Jaringan: graph. Kalau ragu, mulai dari array, Map, dan Set.