English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

nu

tamu
1 / ?
kembali ke pelajaran

Laju Pertumbuhan, Bukan Biaya Absolut

Big O: Mengukur Bagaimana Biaya Tumbuh

Notasi Big O mengukur laju pertumbuhan biaya algoritma — bukan biaya absolut.

Pertanyaan Big O: apakah pekerjaan menggandakan, empat kali lipat, atau tetap flat saat ukuran input N menggandakan?

Huruf 'O' berasal dari 'order of magnitude.' Ekspresi di dalam tanda kurung menggambarkan bentuk kurva pertumbuhan.

Tabel Pertumbuhan Big O: operasi pada N=10, 100, dan 1,000 untuk O(1), O(N), dan O(N²)

Kelas kompleksitas:

- O(1) — konstan: biaya tidak tumbuh. Contoh: mencari nilai dengan indeks dalam array. Apakah array memiliki 10 item atau 10 juta, satu pencarian tetap satu pencarian.

- O(N) — linear: biaya tumbuh dengan input. Contoh: membaca setiap item dalam daftar sekali. Dua kali lipat daftar, dua kali lipat bacaan.

- O(N²) — kuadrat: biaya tumbuh sebagai kuadrat dari input. Contoh: membandingkan setiap item dengan setiap item lainnya. Dua kali lipat N, empat kali lipat pekerjaan.

Tabel perbandingan pertumbuhan:

| N | O(1) | O(N) | O(N²) |

|---|------|------|-------|

| 10 | 1 | 10 | 100 |

| 100 | 1 | 100 | 10,000 |

| 1,000 | 1 | 1,000 | 1,000,000 |

Pada N=10 perbedaan tampak kecil. Pada N=1,000 jarak menjadi besar.

Bandingkan O(N) dengan O(N²)

Gunakan tabel perbandingan pertumbuhan di atas.

Pada N=1,000: O(N) membutuhkan 1,000 operasi. O(N²) membutuhkan 1,000,000 operasi.

Pada N=1,000, berapa kali lebih banyak operasi yang diperlukan O(N²) dibanding O(N)? Tunjukkan langkah kerja Anda.

Bagaimana Struktur Kode Menunjukkan Kemudahan

Bagaimana Cara Mengidentifikasi Big O dari Kode

Big O tersembunyi dalam bentuk kode Anda. Empat pola menutupi sebagian besar kasus:

Pengulangan tunggal melalui N item: O(N)

# O(N): satu kali melalui daftar
for item in list_of_n_items:
    process(item)

Pengulangan bergandengan, masing-masing melalui N item: O(N²)

# O(N²): setiap item dipair dengan setiap item lainnya
for item_a in list_of_n_items:
    for item_b in list_of_n_items:
        compare(item_a, item_b)

Pencarian konstan: O(1)

Akses indeks array, pencarian dalam tabel hash — satu langkah terlepas dari ukuran.

Membagi dan menaklukkan (memotong masalah menjadi setengah setiap langkah): O(log N)

Pencarian biner: setiap cek mengurangi jumlah item yang tersisa.

---

O(N² tersembunyi): daftar di dalam loop

# Ini terlihat seperti O(N) tetapi sebenarnya O(N²)
visited = []
for item in list_of_n_items:
    if item not in visited:   # memindai semua dari visited: O(N)
        visited.append(item)  # loop keseluruhan: O(N²)

Baris if item not in visited memindai setiap elemen dari visited setiap iterasi. Scan daftar menghabiskan O(N). Sebuah loop yang berjalan N kali, setiap melakukan O(N) kerja: O(N) × O(N) = O(N²).

Polanya muncul di 1.000+ proyek sumber terbuka. Perbaikan hanya membutuhkan satu karakter: gantilah visited = [] dengan visited = set(). Tes anggota setelan menghabiskan O(1), bukan O(N). Perubahan satu. Hasil yang sama. 1.000× lebih cepat pada N=1.000.

Klasifikasi & Perbaikan Kode Ini

Baca kode ini:

result = []
for name in student_names:
    if name not in result:
        result.append(name)
Apa kompleksitas Big O dari kode ini? Jelaskan mengapa baris `if name not in result` membuatnya mahal. Kemudian tulis kembali kode untuk membuatnya O(N).

Teori Bertemu Dengan Praktek

Big O di Dunia Nyata

Big O tidak hanya teori. Ini memisahkan program yang selesai dalam detik dari program yang membutuhkan 17 menit - pada tugas yang sama persis.

Contoh nyata: deteksi siklus ketergantungan dalam sistem build.

Ketika Anda menginstal perangkat lunak, komputer Anda menyelesaikan grafik ketergantungan: paket A membutuhkan B, B membutuhkan C, dan seterusnya. Sistem build mengecek grafik ini untuk siklus.

Algoritma deteksi siklus O(N²) berfungsi baik pada N=100 paket. Pada N=50,000 paket (proyek nyata): itu membutuhkan 17 menit. Perbaikan O(N): 10 detik.

Defek ini persis ada dalam GHC (kompiler Haskell), pip (manajer paket Python), Maven (sistem build Java), Cargo (manajer paket Rust), & 1.000+ proyek lainnya.

Bukan karena penulisnya tidak teliti. visited = [] ditulis ketika N kecil. Kode mengeras. N tumbuh. Tidak ada yang melihat sampai build memakan setengah jam.

Big O adalah bahasa yang memungkinkan Anda menamai apa yang terjadi - & memperbaikinya.

---

Ingin menggali lebih dalam? Kursus Unhamming kami mencakup bab penuh tentang Big O, MOAD-0001 (defek O(N²) nyata yang ditemukan di 1.000+ proyek sumber terbuka), & mengapa menamai pola memungkinkan Anda menemukannya di mana-mana. Lihat [Bab yang Hilang: Kompleksitas Algoritma](/en/un/unhamming_algorithmic_complexity).

Prediksi Waktu Build

Sistem build menggunakan deteksi siklus O(N²).

Waktu build yang diukur:

- N=100 paket: 0.01 detik

- N=1,000 paket: 1 detik

Untuk O(N²): waktu berkorespondensi dengan (N_new / N_old)².

Untuk O(N): waktu berkorespondensi dengan (N_new / N_old).

Menggunakan rumus-rumus tersebut & data yang diukur: (A) pada N=10,000, berapa lama versi O(N²) membutuhkan? (B) setelah perbaikan O(N), menggunakan N=1,000 sebagai titik acuan, berapa lama versi O(N) pada N=10,000? Tunjukkan kerja Anda untuk kedua-duanya.