Pertama mari kita pahami apa itu O besar, Theta besar, dan Omega besar. Mereka semua adalah set fungsi.
Big O memberi batas asimptotik atas , sedangkan Omega besar memberi batas bawah. Theta Besar memberi keduanya.
Segala sesuatu yang ada Ө(f(n))
juga O(f(n))
, tetapi tidak sebaliknya.
T(n)
dikatakan berada di Ө(f(n))
jika itu baik di dalam O(f(n))
dan di Omega(f(n))
.
Dalam terminologi set, Ө(f(n))
adalah persimpangan dari O(f(n))
danOmega(f(n))
Sebagai contoh, menggabungkan kasus terburuk adalah keduanya O(n*log(n))
dan Omega(n*log(n))
- dan juga demikian Ө(n*log(n))
, tetapi juga O(n^2)
, karena n^2
secara asimptotik "lebih besar" daripada itu. Namun, itu bukan Ө(n^2)
, Karena algoritma tidak Omega(n^2)
.
Penjelasan matematika sedikit lebih dalam
O(n)
adalah batas atas asimptotik. Jika T(n)
iya O(f(n))
, itu berarti bahwa dari yang tertentu n0
, ada yang konstan C
seperti itu T(n) <= C * f(n)
. Di sisi lain, Omega besar mengatakan ada konstanta yang C2
demikian T(n) >= C2 * f(n))
).
Jangan bingung!
Jangan bingung dengan analisis kasus terburuk, terbaik, dan rata-rata: ketiga notasi (Omega, O, Theta) tidak terkait dengan analisis algoritma kasus terbaik, terburuk, dan rata-rata. Masing-masing dapat diterapkan untuk masing-masing analisis.
Kami biasanya menggunakannya untuk menganalisis kompleksitas algoritma (seperti contoh pengurutan gabungan di atas). Ketika kita mengatakan "Algoritma A adalah O(f(n))
", apa yang sebenarnya kita maksudkan adalah "Kompleksitas algoritme dalam analisis kasus 1 terburuk adalah O(f(n))
" - artinya - ini berskala "serupa" (atau secara formal, tidak lebih buruk dari) fungsinya f(n)
.
Mengapa kami peduli dengan ikatan asimptotik dari suatu algoritma?
Yah, ada banyak alasan untuk itu, tetapi saya percaya yang paling penting adalah:
- Jauh lebih sulit untuk menentukan fungsi kerumitan yang tepat , sehingga kami "berkompromi" pada notasi O-besar / besar-Theta, yang cukup informatif secara teoritis.
- Jumlah persis ops juga tergantung platform . Misalnya, jika kita memiliki vektor (daftar) 16 angka. Berapa banyak ops yang dibutuhkan? Jawabannya adalah, tergantung. Beberapa CPU memungkinkan penambahan vektor, sementara yang lain tidak, jadi jawabannya bervariasi antara implementasi yang berbeda dan mesin yang berbeda, yang merupakan properti yang tidak diinginkan. Notasi O besar jauh lebih konstan antara mesin dan implementasi.
Untuk menunjukkan masalah ini, lihat grafik berikut:
Jelas bahwa f(n) = 2*n
"lebih buruk" daripada f(n) = n
. Tetapi perbedaannya tidak sedrastis dari fungsi lainnya. Kita dapat melihat bahwa f(n)=logn
dengan cepat menjadi jauh lebih rendah daripada fungsi-fungsi lainnya, dan f(n) = n^2
dengan cepat menjadi jauh lebih tinggi daripada yang lain.
Jadi - karena alasan di atas, kita "mengabaikan" faktor konstan (2 * dalam contoh grafik), dan hanya mengambil notasi O-besar.
Dalam contoh di atas, f(n)=n, f(n)=2*n
akan ada di O(n)
dan di Omega(n)
- dan dengan demikian juga akan di Theta(n)
.
Di sisi lain - f(n)=logn
akan berada di O(n)
(itu "lebih baik" dari f(n)=n
), tetapi TIDAK akan di Omega(n)
- dan dengan demikian juga TIDAK akan berada di Theta(n)
.
Secara simetris, f(n)=n^2
akan berada di Omega(n)
, tetapi TIDAK di O(n)
, dan dengan demikian - juga TIDAK Theta(n)
.
1 Biasanya, meskipun tidak selalu. ketika kelas analisis (terburuk, rata-rata dan terbaik) hilang, kami benar-benar bermaksud kasus terburuk.