edubun
Bahasa Indonesia

Seberapa cepat? Notasi Big O

Dengan satu miliar langkah per detik, metode n² pada sejuta nilai butuh sekitar 17 menit; metode n log n hanya 0.02 detik.

Pertumbuhan lebih penting daripada hitungan tepatnya

Sejauh ini kita menghitung langkah secara tepat: 45 perbandingan, 4 pertukaran, 20 pemeriksaan. Hitungan tepat berguna untuk contoh kecil, tetapi bergantung pada detail seperti apakah bubble sort berhenti lebih awal atau bagaimana pivot dipilih. Saat masukannya menjadi besar, satu hal mengalahkan semua yang lain: bagaimana hitungan itu tumbuh seiring bertambahnya n. Algoritma yang langkahnya tumbuh seperti n² pada akhirnya akan kalah dari algoritma yang langkahnya tumbuh seperti n log n, betapa pun cermatnya algoritma pertama disetel.

Notasi Big O adalah singkatan untuk pertumbuhan itu. Menulis bahwa sebuah algoritma O(n²), dibaca "big O dari n kuadrat", berarti untuk n yang besar jumlah langkahnya paling banyak suatu konstanta dikali n². Dua aturan membuatnya mudah dipakai. Buang faktor konstanta: 3n dan n/2 sama-sama O(n). Pertahankan hanya suku yang tumbuh paling cepat: n²/2 − n/2, jumlah perbandingan selection sort, adalah O(n²), karena untuk n yang besar bagian n² hampir mencakup semuanya. Mata kuliah 6.006 di MIT memakai gagasan yang sama saat membandingkan struktur data dan algoritma pengurutan menurut waktu jalan asimptotiknya.

Laju pertumbuhan yang umum

  • O(1), konstan. Pekerjaannya tidak bergantung pada n: membaca nilai pertama dalam daftar, atau nilai di posisi yang sudah diketahui.
  • O(log n), logaritmik. Setiap langkah membagi dua masalahnya: pencarian biner. Sejuta nilai, sekitar 20 langkah.
  • O(n), linear. Setiap nilai ditangani satu kali: pencarian linear, mencari nilai terbesar, menjumlahkan isi daftar.
  • O(n log n). Merge sort, dan quicksort secara rata-rata. Yang terbaik yang bisa dicapai pengurutan berbasis perbandingan.
  • O(n²), kuadratik. Setiap pasangan diperiksa: bubble sort, selection sort, dan insertion sort dalam kasus terburuk, atau dua perulangan yang bersarang satu di dalam yang lain.
  • O(2ⁿ), eksponensial. Pekerjaannya berlipat dua untuk setiap nilai tambahan: mencoba setiap himpunan bagian dari n benda, atau memindahkan n cakram dalam Menara Hanoi.
Memuat

Seret untuk memutar. Gulir atau cubit untuk memperbesar.

Enam laju pertumbuhan digambar pada sumbu yang sama. Geser n dan nyalakan skala logaritmik; tabelnya memberikan jumlah langkah pada n pilihanmu dan waktu untuk sejuta nilai dengan satu miliar langkah per detik.

Arti angka-angka itu dalam detik

Misalkan sebuah komputer melakukan satu miliar (10⁹) langkah dasar per detik, angka bulat yang wajar untuk satu inti prosesor. Inilah arti setiap laju pertumbuhan untuk sejuta nilai. O(log n) sekitar 20 langkah, jauh di bawah satu mikrodetik. O(n) sejuta langkah, satu milidetik. O(n log n) sekitar 20 juta langkah, 0.02 detik. O(n²) adalah 10¹² langkah, seribu detik, sekitar 17 menit. O(2ⁿ) tidak bisa selesai: 2 pangkat sejuta adalah bilangan dengan lebih dari 300 000 angka. Karena itulah memilih algoritma yang tepat biasanya jauh lebih penting daripada membeli komputer yang lebih cepat. Mesin sepuluh kali lebih cepat mengubah 17 menit menjadi 1.7 menit; beralih dari O(n²) ke O(n log n) mengubahnya menjadi seperlima puluh detik.

PertumbuhanLangkah untuk n = 1 000 000Waktu pada 10⁹ langkah per detik
O(1)1sekitar satu nanodetik
O(log n)sekitar 20sekitar 20 nanodetik
O(n)1,000,0001 milidetik
O(n log n)sekitar 20 000 000sekitar 0.02 detik
O(n²)1,000,000,000,000sekitar 17 menit
O(2ⁿ)panjangnya lebih dari 300 000 angkatidak pernah selesai

Membaca Big O dari kode

Laju pertumbuhan sering bisa dibaca langsung dari bentuk kodenya. Satu perulangan atas daftar adalah O(n). Dua perulangan, satu di dalam yang lain, keduanya atas daftar, adalah O(n²): untuk setiap putaran dari n putaran luar, perulangan dalam melakukan paling banyak n putaran. Perulangan yang membagi dua sebuah bilangan setiap kali, seperti while (n > 1) n = Math.floor(n / 2), adalah O(log n): mulai dari 1000 perulangan itu berjalan 9 kali, dari sejuta 19 kali. Langkah-langkah yang terjadi berurutan dijumlahkan, dan suku yang lebih besar menang: perulangan O(n) yang diikuti perulangan O(n²) secara keseluruhan adalah O(n²).

// O(n): satu lintasan
let total = 0;
for (const x of list) total += x;

// O(n²): setiap pasangan
for (let i = 0; i < list.length; i++)
  for (let j = i + 1; j < list.length; j++)
    if (list[i] === list[j]) console.log("duplicate", list[i]);

// O(log n): membagi dua
let k = list.length, rounds = 0;
while (k > 1) { k = Math.floor(k / 2); rounds++; }

Kasus terbaik, rata-rata, dan terburuk

Satu algoritma bisa berperilaku sangat berbeda pada masukan yang berbeda. Insertion sort adalah O(n) pada daftar yang sudah terurut dan O(n²) pada daftar terbalik. Quicksort adalah O(n log n) secara rata-rata dan O(n²) kalau pivotnya terus-menerus buruk. Ketika orang menyebut satu angka Big O tanpa menyebut kasusnya, biasanya yang dimaksud kasus terburuk, karena itu sebuah jaminan: algoritmanya tidak akan pernah lebih buruk dari itu. Big O juga mengabaikan beberapa hal. Faktor konstanta diabaikan, jadi untuk masukan kecil, metode O(n²) dengan langkah yang sangat sederhana bisa mengalahkan metode O(n log n). Itulah sebabnya banyak rutin pengurutan sungguhan beralih ke insertion sort untuk potongan daftar yang pendek.

Big O bisa menggambarkan memori selain waktu. Merge sort memakai memori tambahan O(n) untuk daftar keduanya; insertion sort memakai memori tambahan O(1), hanya beberapa variabel.
Big OBagaimana jumlah langkah tumbuh seiring n, dengan mengabaikan faktor konstanta
O(1)Konstan: pekerjaan yang sama untuk n berapa pun
O(log n)Logaritmik: membagi dua di setiap langkah, seperti pada pencarian biner
O(n)Linear: satu lintasan atas masukan
O(n log n)Merge sort; yang terbaik untuk pengurutan berbasis perbandingan
O(n²)Kuadratik: setiap pasangan, dua perulangan bersarang
O(2ⁿ)Eksponensial: berlipat dua untuk setiap benda tambahan
kasus terburukSebuah jaminan: algoritmanya tidak pernah melakukan lebih dari ini
  1. Apa bentuk 3n² + 5n + 2 dalam notasi Big O?
    • O(n)
    • O(n²)
    • O(3n²)
    • O(n² + n)
  2. Dua perulangan bersarang satu di dalam yang lain, masing-masing berjalan atas n nilai. Big O-nya?
    • O(n)
    • O(2n)
    • O(n²)
    • O(log n)
  3. Pencarian biner termasuk
    • O(1)
    • O(log n)
    • O(n)
    • O(n log n)
  4. Metode O(n²) butuh 2 detik untuk 1000 nilai. Kira-kira berapa detik untuk 10 000 nilai?
  5. Metode O(n) butuh 2 detik untuk 1000 nilai. Kira-kira berapa detik untuk 10 000 nilai?
  6. Pada 10⁹ langkah per detik, berapa detik yang dibutuhkan 10¹² langkah (metode n² pada sejuta nilai)?
  7. Berapa kali while (n > 1) n = Math.floor(n / 2) berjalan kalau n mula-mula 64?
  8. Sebuah program menjalankan perulangan O(n) lalu perulangan O(n²). Secara keseluruhan program itu
    • O(n)
    • O(n²)
    • O(n³)
    • O(n + 2)
  9. Insertion sort pada daftar yang sudah terurut termasuk
    • O(1)
    • O(n)
    • O(n log n)
    • O(n²)
  10. Mengapa metode O(n²) bisa mengalahkan metode O(n log n) pada masukan kecil?
    • Big O mengabaikan faktor konstanta, dan metode yang lebih sederhana mungkin bekerja lebih sedikit di setiap langkah
    • Big O salah untuk n yang kecil
    • n² lebih kecil daripada n log n untuk setiap n
    • Masukan kecil selalu sudah terurut
  11. Memori tambahan merge sort adalah
    • O(1)
    • O(log n)
    • O(n)
    • O(n²)
  12. Urutkan laju pertumbuhan ini dari yang tumbuh paling lambat sampai yang paling cepat.
Poin penting
  • Big O menggambarkan bagaimana langkah tumbuh seiring n, dengan mengabaikan faktor konstanta dan suku yang lebih kecil.
  • Laju yang umum: 1, log n, n, n log n, n², 2ⁿ.
  • Sejuta nilai pada 10⁹ langkah/s: n log n sekitar 0.02 s, n² sekitar 17 menit.
  • Satu perulangan adalah O(n); dua perulangan bersarang O(n²); membagi dua O(log n).
  • Satu angka Big O yang disebut biasanya berarti kasus terburuk.
Sumber kursus ini (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
  • Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
  • with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
  • MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
  • D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
  • Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
  • Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
  • Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
  • Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
  • Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.

Diperiksa: 2026-10-17