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

Tingkat Pertumbuhan, Bukan Biaya Absolut

Big O: Mengukur Seberapa Cepat Biaya Berkembang

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

Pertanyaan yang dijawab Big O: ketika ukuran input N mengganda, apakah pekerjaan mengganda? Meningkat empat kali? Tetap datar?

'O' adalah singkatan dari 'order of magnitude'. Ekspresi di dalam tanda kurung mendeskripsikan 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 kunci:

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

- O(N) — linear: biaya berkembang seiring input. Contoh: membaca setiap item dalam daftar sekali. Gandakan daftar, gandakan pembacaan.

- O(N²) — kuadratik: biaya berkembang sebagai kuadrat input. Contoh: membandingkan setiap item dengan setiap item lainnya. Gandakan N, pekerjaan meningkat empat kali lipat.

Tabel perbandingan pertumbuhan:

NO(1)O(N)O(N²)
10110100
100110010,000
1,00011,0001,000,000

Pada N=10 perbedaannya terlihat kecil. Pada N=1.000 kesenjangan menjadi sangat besar.

Bandingkan O(N) dengan O(N²)

Gunakan tabel perbandingan pertumbuhan di atas.

Pada N=1.000: O(N) memerlukan 1.000 operasi. O(N²) memerlukan 1.000.000 operasi.

Pada N=1.000, berapa kali lebih banyak operasi yang diperlukan O(N²) dibandingkan dengan O(N)? Tunjukkan pekerjaan Anda.

Bagaimana Struktur Kode Mengungkapkan Kompleksitas

Cara Mengidentifikasi Big O dari Kode

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

Loop tunggal di atas N item: O(N)

# O(N): one pass through the list
for item in list_of_n_items:
    process(item)

Loop bersarang, masing-masing di atas N item: O(N²)

# O(N²): every item paired with every other item
for item_a in list_of_n_items:
    for item_b in list_of_n_items:
        compare(item_a, item_b)

Pencarian waktu konstan: O(1)

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

Bagi-dan-taklukkan (potong masalah menjadi dua setiap langkah): O(log N)

Pencarian biner: setiap pemeriksaan membagi dua item yang tersisa.

---

Tersembunyi O(N²): daftar di dalam loop

# This looks like O(N) but it is actually O(N²)
visited = []
for item in list_of_n_items:
    if item not in visited:   # memindai semua yang dikunjungi: O(N)
        visited.append(item)  # seluruh loop: O(N²)

Baris if item not in visited memindai setiap elemen visited setiap iterasi. Pemindaian daftar memerlukan biaya O(N). Loop yang berjalan N kali, masing-masing melakukan pekerjaan O(N): O(N) × O(N) = O(N²).

Pola ini muncul di 1.000+ proyek open-source. Perbaikannya membutuhkan satu karakter: ganti visited = [] dengan visited = set(). Pengujian keanggotaan set memerlukan biaya O(1), bukan O(N). Satu perubahan. Hasil yang sama. 1.000× lebih cepat pada N=1.000.

Klasifikasi & Perbaiki 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 ulang kode untuk membuatnya O(N).

Teori Bertemu Praktik

Big O di Alam Liar

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

Contoh nyata: deteksi siklus dependensi dalam sistem pembangunan.

Ketika Anda menginstal perangkat lunak, komputer Anda menyelesaikan grafik dependensi: paket A memerlukan B, B memerlukan C, dan seterusnya. Sistem pembangunan memeriksa grafik ini untuk siklus.

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

Cacat yang persis ini ada di GHC (kompiler Haskell), pip (pengelola paket Python), Maven (sistem pembangunan Java), Cargo (pengelola paket Rust), & 1.000+ proyek lainnya.

Bukan karena penulis mereka ceroboh. visited = [] ditulis ketika N kecil. Kode mengeras. N tumbuh. Tidak ada yang memperhatikan sampai pembangunan membutuhkan waktu setengah jam.

Big O adalah kosakata yang memungkinkan Anda untuk menamai apa yang terjadi — & memperbaikinya.

---

Ingin menggali lebih dalam? Kursus unhamming kami mencakup bab lengkap tentang Big O, MOAD-0001 (cacat O(N²) nyata yang ditemukan di 1.000+ proyek open-source), & mengapa penamaan pola memungkinkan Anda menemukannya di mana-mana. Lihat Bab yang Hilang: Kompleksitas Algoritma.

Prediksi Waktu Pembangunan

Sistem pembangunan menggunakan deteksi siklus O(N²).

Waktu pembangunan terukur:

- N=100 paket: 0,01 detik

- N=1.000 paket: 1 detik

Untuk O(N²): waktu berkala sebagai (N_new / N_old)².

Untuk O(N): waktu berkala sebagai (N_new / N_old).

Menggunakan formula itu & data terukur: (A) pada N=10.000, berapa lama versi O(N²) berlangsung? (B) setelah perbaikan O(N), menggunakan N=1.000 sebagai dasar Anda, berapa lama versi O(N) berlangsung pada N=10.000? Tunjukkan pekerjaan Anda untuk keduanya.