Big O(N), O(N²), dan O(N³)
Sebelum nulis kode, selalu tanya satu hal dulu:
"Kalau datanya makin banyak, program saya makin lambat seberapa?"
Nah, Big O adalah cara menjawab pertanyaan itu.
Bukan ngukur waktu dalam detik — tapi ngukur seberapa cepat kerjaan bertambah ketika datanya membesar.
O(N) — Satu Lapis Kerjaan
Bayangkan kamu disuruh nulis namamu sendiri sebanyak N kali.
N = 3 → nulis 3 kali
N = 10 → nulis 10 kali
N = 1.000.000 → nulis 1.000.000 kaliSimpel — kerjaan bertambah sama persis dengan N. Itulah O(N).
Contoh lain: cari nama "Budi" di daftar 1 juta orang dengan baca satu per satu → butuh maksimal 1 juta langkah.
for i := 0; i < n; i++ {
fmt.Println(i)
}Satu loop = O(N).
O(N²) — Dua Lapis Kerjaan
Sekarang tugasnya berbeda. Kamu disuruh nulis namamu N kali — tapi setiap kali nulis nama, kamu juga harus nulis alamatmu N kali.
N = 3:
Budi → Jl. Merdeka, Jl. Merdeka, Jl. Merdeka
Budi → Jl. Merdeka, Jl. Merdeka, Jl. Merdeka
Budi → Jl. Merdeka, Jl. Merdeka, Jl. Merdeka
Total = 3 × 3 = 9 kerjaanKalau N = 10 → 10 × 10 = 100 kerjaan. Kalau N = 1.000 → 1.000 × 1.000 = 1.000.000 kerjaan.
Kerjaan bertambah sesuai N × N. Jauh lebih lambat dari O(N)!
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
fmt.Println(i, j)
}
}Dua loop nested = O(N²).
O(N³) — Tiga Lapis Kerjaan
Polanya sama — tinggal tambah satu lapis lagi.
N = 3 → 3 × 3 × 3 = 27 kerjaan
N = 10 → 10 × 10 × 10 = 1.000 kerjaanfor i := 0; i < n; i++ {
for j := 0; j < n; j++ {
for k := 0; k < n; k++ {
fmt.Println(i, j, k)
}
}
}Tiga loop nested = O(N³).
Satu Hal yang Sering Bikin Bingung
Bagaimana kalau loop keduanya batasnya bukan N, tapi angka tetap seperti 5?
for i := 0; i < n; i++ {
for j := 0; j < 5; j++ { // selalu 5, tidak ikut N
fmt.Println(i, j)
}
}Jawabannya tetap O(N) — bukan O(N²)!
Kenapa? Karena loop kedua selalu jalan 5 kali saja, tidak peduli N sebesar apapun. Jadi kerjaan totalnya tetap tumbuh sesuai N, bukan N × N.
N = 10 → 10 × 5 = 50 kerjaan
N = 1000 → 1000 × 5 = 5000 kerjaanTumbuhnya tetap sesuai N. Makanya tetap O(N).
Aturan Simpel
1 loop = O(N)
2 loop nested = O(N²)
3 loop nested = O(N³)
2 loop terpisah = O(N)
loop kedua batasnya tetap = O(N)