Big O Notation — Struktur Data

Big O Notation mengukur seberapa cepat atau lambat suatu operasi seiring bertambahnya jumlah data. Notasi yang paling umum (dari tercepat ke terlambat): Big O…

Big O adalah cara menuliskan seberapa cepat jumlah langkah sebuah kode bertambah waktu datanya bertambah. Jumlah datanya disebut n, misalnya panjang sebuah array. Yang dihitung langkah, bukan detik, karena detik tergantung komputernya, sedangkan jumlah langkah sama di komputer mana pun.

🧪 Tebakan cepat: sebuah kode punya loop di dalam loop, dua-duanya jalan sepanjang array. Array-nya jadi 10 kali lebih panjang. Langkahnya jadi kira-kira berapa kali lipat: 10, 20, atau 100? Tebak dulu, jawabannya ada di bagian "Hitung langkahnya".

Hitung langkahnya

Ambil tiga pekerjaan pada array berisi n data:

Ini jumlah langkah paling banyak (kasus terburuk: yang dicari gak ada, dan gak ada isi kembar):

n getFirst findItem hasDuplicate
10 1 10 45
100 1 100 4.950
1.000 1 1.000 499.500
function getFirst(arr) {
  return arr[0]; // 1 langkah, berapa pun panjang arr
}

function findItem(arr, target) {
  for (let i = 0; i < arr.length; i++) { // paling banyak n putaran
    if (arr[i] === target) return i;
  }
  return -1;
}

function hasDuplicate(arr) {
  for (let i = 0; i < arr.length; i++) {       // n putaran
    for (let j = i + 1; j < arr.length; j++) { // tiap putaran, loop lagi
      if (arr[i] === arr[j]) return true;
    }
  }
  return false;
}

console.log(getFirst([4, 8, 15]));     // 4
console.log(findItem([4, 8, 15], 15)); // 2
console.log(hasDuplicate([4, 8, 15])); // false

Kenapa 45, bukan 100? j mulai dari i + 1, jadi tiap pasangan cuma dibandingkan sekali, sekitar setengah dari n × n. Big O membuang pengali tetap seperti "setengah" itu, karena yang dilihat cuma bentuk pertumbuhannya. Loop di dalam loop yang dua-duanya jalan n kali penuh butuh tepat n × n langkah, dan itu juga O(n²).

Enam kelas yang sering ketemu

Dari yang paling hemat sampai yang paling boros, dengan jumlah langkah kira-kira untuk n = 1.000:

Big O Nama Contoh Langkah (n = 1.000)
O(1) konstan ambil arr[0] 1
O(log n) logaritmik binary search sekitar 10
O(n) linear satu loop 1.000
O(n log n) linearitmik sorting cepat, misalnya merge sort sekitar 10.000
O(n²) kuadratik loop di dalam loop 1.000.000
O(2ⁿ) eksponensial mencoba semua kombinasi pilih atau gak pilih angka 302 digit

log n artinya berapa kali n bisa dibagi dua sampai tinggal 1. Binary search mencari di data yang sudah urut dengan membuang setengah sisa data tiap langkah, mirip mencari kata di kamus: buka tengahnya, buang separuh yang salah, ulangi. 1.000 data butuh sekitar 10 langkah, dan 1.000.000 data cuma sekitar 20 langkah. Jadi untuk data besar, O(log n) jauh lebih cepat daripada O(n), O(n log n), apalagi O(n²).

Cara cepat menebak Big O

⚠️ Jebakan yang sering ketemu

TL;DR: Big O menuliskan seberapa cepat jumlah langkah bertambah waktu jumlah data n bertambah, biasanya di kasus terburuk. Gak ada loop, misalnya arr[0]: O(1). Satu loop: O(n), datanya dua kali lipat, langkahnya dua kali lipat. Loop di dalam loop: O(n²), diketik O(n^2), datanya 10 kali lipat, langkahnya kira-kira 100 kali lipat. Membagi dua tiap langkah: O(log n), sekitar 20 langkah untuk sejuta data, jadi paling cepat untuk data besar di antara O(n²), O(n), dan O(n log n). Pengali tetap dibuang, jadi 2n tetap O(n).

Yang akan kamu pelajari