Bagaimana O dan Ω berhubungan dengan kasus terburuk dan terbaik?


33

Hari ini kita membahas dalam sebuah kuliah algoritma yang sangat sederhana untuk menemukan elemen dalam array yang diurutkan menggunakan pencarian biner . Kami diminta untuk menentukan kompleksitas asimtotik untuk array elemen.n

Ide saya adalah, bahwa itu adalah , atau lebih spesifik karena adalah jumlah operasi dalam kasus terburuk. Tapi saya bisa melakukan yang lebih baik, misalnya jika saya menekan elemen yang dicari pertama kali - maka batas bawahnya adalah .O ( log 2 n ) log 2 n Ω ( 1 )O(logn)O(log2n)log2nΩ(1)

Dosen mempresentasikan solusi sebagai karena kami biasanya hanya mempertimbangkan input kasus terburuk untuk algoritma.Θ(logn)

Tetapi ketika mempertimbangkan hanya kasus terburuk, apa gunanya memiliki dan notasi ketika semua kasus terburuk dari masalah yang diberikan memiliki kompleksitas yang sama ( akan menjadi semua yang kita butuhkan, kan?).Ω ΘOΩΘ

Apa yang kulewatkan di sini?


@Ajiaji: Apa yang Anda maksud dengan "Tapi ketika mempertimbangkan hanya kasus terburuk, apa gunanya memiliki O besar dan notasi Omega besar ketika semua kasus terburuk memiliki + - kompleksitas yang sama (Theta akan menjadi semua yang kita butuhkan, kan?)." tolong jelaskan itu.
tanmoy

@ Smajl: Saya pikir pertanyaan Anda adalah: Apa perlunya notasi Big O dan Big Omega dalam analisis algoritma? Apakah saya benar?
tanmoy

5
O(log2n) tidak lebih spesifik daripada , mereka menunjukkan kelas fungsi yang sama. O(logn)
Raphael

log2(n) sama dengan oleh karena itu 2 hanya menunjukkan faktor, yang dapat dihapus (seperti faktor lain di big-O.log(b)/log(2)×logb(n)
ctrl-alt-delor

Jawaban:


39

Notasi Landau menunjukkan batas asimptotik pada fungsi . Lihat di sini untuk penjelasan tentang perbedaan antara O , Ω dan Θ .

Waktu terburuk, terbaik, rata-rata, atau Anda-nama-itu-kasus menggambarkan fungsi runtime yang berbeda: satu untuk urutan runtime tertinggi dari setiap diberikan , satu untuk yang terendah, dan seterusnya ..n

Per se, keduanya tidak ada hubungannya satu sama lain. Definisi itu independen. Sekarang kita dapat melanjutkan dan merumuskan batas asimptotik pada fungsi runtime: atas ( ), lebih rendah ( Ω ) atau keduanya ( Θ ). Kita dapat melakukannya untuk kasus terburuk, terbaik, atau lainnya.OΩΘ

Misalnya, dalam pencarian biner kita mendapatkan asimtotik runtime kasus-terbaik dari dan asimptotik kasus terburuk Θ ( log n ) .Θ(1)Θ(logn)


Hal utama yang bisa saya ambil adalah, kita bisa melakukan analisis kasus terburuk, terbaik pada segala fungsi terikat asimptotik. Bagi saya, itu menunjukkan kemandirian Big O vs analisis kasus terburuk. Terima kasih!
Patrick

1
@ Patrick Tidak cukup. Pertama, Anda memutuskan apakah Anda ingin menganalisis kasus terburuk, rata-rata, atau terbaik. Kemudian Anda datang dengan fungsi biaya (atau perkiraan sebaik yang Anda bisa). Baru setelah itu Anda mengambil asimptotik, jika sama sekali.
Raphael

17

Pertimbangkan algoritma berikut (atau prosedur, atau sepotong kode, atau apa pun):

Contrive(n)
1. if n = 0 then do something Theta(n^3)
2. else if n is even then
3.    flip a coin
4.    if heads, do something Theta(n)
5.    else if tails, do something Theta(n^2)
6. else if n is odd then
7.    flip a coin
8.    if heads, do something Theta(n^4)
9.    else if tails, do something Theta(n^5)

Apa perilaku asimptotik dari fungsi ini?

Dalam kasus terbaik (di mana adalah genap), runtime adalah Ω ( n ) dan O ( n 2 ) , tetapi tidak Θ dari apa pun.nΩ(n)O(n2)Θ

Dalam kasus terburuk (di mana aneh), runtime adalah Ω ( n 4 ) dan O ( n 5 ) , tetapi tidak Θ dari apa pun.nΩ(n4)O(n5)Θ

Dalam kasus , runtime adalah Θ ( n 3 ) .n=0Θ(n3)

Ini adalah sedikit contoh yang dibuat-buat, tetapi hanya untuk tujuan yang secara jelas menunjukkan perbedaan antara ikatan dan kasus. Anda bisa memiliki perbedaan menjadi bermakna dengan prosedur sepenuhnya deterministik, jika kegiatan Anda melakukan tidak memiliki diketahui batas.Θ


1
Untuk membuat ini deterministik, pisahkan bersama case. nmod4
vonbrand

4

Belum tentu. Dalam hal ini, yaitu pencarian biner pada array yang diurutkan, Anda dapat melihat bahwa: (a) pencarian biner mengambil paling banyak langkah-langkah; (B) ada input yang benar-benar memaksa banyak langkah ini. Jadi jika adalah waktu berjalan pada input kasus terburuk untuk pencarian biner, Anda dapat mengatakan bahwa .[logn+1]T ( n ) = Θ ( log n )T(n)T(n)=Θ(logn)

Di sisi lain, untuk algoritme lain, Anda mungkin tidak dapat bekerja dengan tepat , dalam hal ini Anda mungkin memiliki celah antara batas atas dan bawah untuk waktu berjalan pada input case terburuk.T(n)

Sekarang, untuk mencari array yang diurutkan, sesuatu yang lebih benar, yaitu algoritma apa pun untuk mencari array yang diurutkan perlu memeriksa . Untuk jenis batas bawah ini, Anda perlu menganalisis masalahnya sendiri. (Inilah idenya: kapan saja, algoritma pencarian tidak mengesampingkan beberapa set posisi di mana elemen yang dicari bisa. Input yang dibuat dengan hati-hati kemudian dapat menjamin bahwa adalah dikurangi paling banyak faktor )S [ n ] | S | 2[logn+1]S[n]|S|2


1

Anda benar, banyak orang sembarangan menggunakan ketika mereka harus menggunakan . Sebagai contoh, seorang analis algoritma dapat berakhir dengan fungsi waktu dan segera menyimpulkan bahwa , yang secara teknis benar , tetapi pernyataan yang lebih tajam adalah . Saya mengaitkan perilaku tidak sadar ini dengan dua alasan. Pertama, banyak yang melihat menjadi lebih populer dan dapat diterima, mungkin karena sejarahnya yang panjang. Ingatlah bahwa itu diperkenalkan lebih dari seabad yang lalu, sedangkan (dan ) diperkenalkan hanya pada tahun 1976 (oleh Donald Knuth). Kedua, bisa jadi karenaOΘT(n)=n2+n+2T(n)=O(n2)T(n)=Θ(n2)OΘΩOsudah tersedia di keyboard, sedangkan tidak!Θ

Dari sudut pandang teknis, bagaimanapun, alasan utama analis yang berhati-hati lebih suka menggunakan daripada adalah bahwa yang pertama mencakup "wilayah yang lebih besar" daripada yang terakhir. Jika kami mengambil contoh pencarian biner Anda dan ingin menggunakan , kami harus membuat dua pernyataan: \ satu untuk kasus terbaik, yaitu , dan satu lagi untuk kasus terburuk, yaitu . DenganOΘΘΘ(1)Θ(logn)OO(logn)ΘO


O(logn)Θ(logn)

@ Raphael Saya merujuk Anda ke definisi kedua notasi. Lebih jauh lagi, sadari bahwa mereka digunakan untuk mengklasifikasikan "tingkat pertumbuhan" asimptotik dari waktu berjalan, bukan waktu berjalan itu sendiri yang disebarkan oleh berbagai jawaban dan komentar Anda.
Hamed Nassar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.