Cheat Sheet Kompleksitas — Struktur Data

Ringkasan kompleksitas semua struktur data — gunakan sebagai referensi cepat! Analisis kompleksitas mengukur efisiensi kode dari segi waktu (time) dan ruang…

Analisis kompleksitas artinya menebak seberapa cepat kode melambat waktu datanya membesar, dan hasilnya ditulis dengan Big-O, dengan n sebagai banyaknya data. O(1) artinya waktunya tetap berapa pun datanya, O(n) artinya datanya dua kali lipat, waktunya kira-kira dua kali lipat. Di pelajaran penutup ini ada tabel ringkas biaya tiap struktur data, lalu cara membaca function-mu sendiri untuk menebak Big-O-nya.

🧪 Tebakan cepat: for (let i = 1; i < n; i *= 2) dengan n = 1.000 jalan berapa putaran: sekitar 10, 500, atau 1.000? Tebak dulu, jawabannya ada di bagian "Dibagi dua tiap putaran: O(log n)".

Tabel ringkas: biaya tiap operasi

const n = 1000;
const arr = Array.from({ length: n }, (_, i) => i); // 0 sampai 999
const set = new Set(arr);

console.log(arr[n - 1]);        // 999, O(1): langsung ke index-nya
console.log(arr.includes(-1));  // false, O(n): 1.000 data dicek satu per satu
console.log(set.has(-1));       // false, O(1) rata-rata

Datanya sama, tapi biaya mencarinya beda jauh. Ini biaya tiap operasi untuk tiap struktur:

Struktur Akses (index) Cari Sisip Hapus
Array O(1) O(n) O(n) O(n)
Stack O(n) O(n) O(1) O(1)
Queue O(n) O(n) O(1) O(1)
Linked list O(n) O(n) O(1) O(1)
Hash map gak ada O(1)* O(1)* O(1)*
BST gak ada O(log n)* O(log n)* O(log n)*
Heap gak ada O(n) O(log n) O(log n)

Seberapa besar bedanya untuk n = 1.000: O(1) satu langkah, O(log n) sekitar 10, O(n) 1.000, O(n log n) sekitar 10.000, dan O(n²) sejuta.

Satu loop: O(n)

Untuk function-mu sendiri, tanyakan: kalau n bertambah, berapa kali baris di dalam loop dijalankan?

function total(arr) {
  let sum = 0;
  for (const x of arr) {
    sum += x;
  }
  return sum;
}

console.log(total([5, 10, 15])); // 30

Loop-nya jalan sekali untuk tiap isi: n isi, n putaran. Isinya dua kali lipat, putarannya dua kali lipat: O(n). Baris di luar loop (let sum = 0, return) cuma jalan sekali, jadi gak dihitung.

Loop di dalam loop: O(n²)

function hitungPasangan(arr) {
  let pasangan = 0;
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      pasangan++;
    }
  }
  return pasangan;
}

console.log(hitungPasangan([1, 2, 3, 4])); // 6

Untuk tiap i, loop dalam jalan sampai akhir array. Dengan 4 isi: 3 + 2 + 1 = 6 putaran. Dengan 1.000 isi: 499.500, kira-kira n × n / 2. Big-O membuang angka pengali seperti "/ 2", jadi hasilnya O(n²): isinya dua kali lipat, waktunya kira-kira empat kali lipat. Loop dalam yang mulai dari i atau dari 0 sama-sama O(n²).

Dibagi dua tiap putaran: O(log n)

function langkahBagiDua(n) {
  let langkah = 0;
  for (let i = 1; i < n; i *= 2) {
    langkah++;
  }
  return langkah;
}

console.log(langkahBagiDua(8));    // 3
console.log(langkahBagiDua(1000)); // 10

i dikali dua tiap putaran: 1, 2, 4, 8, ... Untuk n = 8, i bernilai 1, 2, 4, lalu berhenti di 8: 3 putaran. Untuk n = 1.000 cuma 10 putaran, dan untuk sejuta cuma 20. Itu jawaban tebakan tadi. Kalau sisa kerjanya dikali dua atau dibagi dua tiap putaran, seperti binary search, Big-O-nya O(log n).

Menggabungkan: jumlah, kali, buang konstanta

⚠️ Jebakan yang sering ketemu

TL;DR: Big-O menghitung berapa kali kerjanya diulang waktu n membesar. Satu loop atas n data: O(n). Loop di dalam loop: O(n²), walau loop dalamnya mulai dari i. Dikali atau dibagi dua tiap putaran: O(log n), sekitar 10 langkah untuk 1.000 data. Loop berurutan dijumlah lalu ambil yang terbesar, loop bersarang dikali, angka tetap dibuang, dan method seperti includes di dalam loop ikut dihitung. Array: akses O(1), cari O(n). Hash map dan Set: cari O(1) rata-rata. BST seimbang: O(log n). Heap: sisip dan hapus O(log n).

Yang akan kamu pelajari