Sunting: Revisi utama dalam revisi 3.
Karena saya belum pernah mengajar kelas, saya tidak berpikir bahwa saya dapat mengklaim sesuatu dengan meyakinkan tentang apa yang harus kita ajarkan. Namun demikian, inilah yang saya pikirkan.
Ada contoh alami di mana "trik batas" seperti yang ditulis tidak dapat diterapkan. Sebagai contoh, misalkan Anda menerapkan "vektor panjang variabel" (seperti vektor <T> dalam C ++) dengan menggunakan array panjang tetap dengan pengganda ukuran (yaitu, setiap kali Anda akan melebihi ukuran array, Anda realokasi array dua kali lebih besar dari sekarang dan salin semua elemen). Ukuran S ( n ) dari array ketika kita menyimpan elemen n dalam vektor adalah kekuatan terkecil 2 lebih besar dari atau sama dengan n . Kami ingin mengatakan bahwa S ( n ) = O ( n ), tetapi menggunakan "batas trik" seperti yang tertulis sebagai definisi tidak akan memungkinkan kami untuk melakukannya karena S ( n) / n terombang-ambing dalam kisaran [1,2). Hal yang sama berlaku untuk Ω () dan Θ ().
Sebagai masalah yang agak terpisah, ketika kami menggunakan notasi ini untuk menggambarkan kompleksitas suatu algoritma, saya pikir definisi Anda tentang Ω () kadang-kadang tidak nyaman (walaupun saya kira definisi itu umum) Lebih mudah untuk mendefinisikan bahwa f ( n ) = Ω ( g ( n )) jika dan hanya jika limsup f ( n ) / g ( n )> 0. Ini karena beberapa masalah sepele untuk banyak nilai tak terhingga n ( seperti masalah maching sempurna pada grafik dengan jumlah ganjil n simpul). Hal yang sama berlaku untuk Θ () dan ω ().
Oleh karena itu, saya pribadi menemukan bahwa definisi berikut yang paling mudah digunakan untuk menggambarkan kompleksitas suatu algoritma: untuk fungsi f , g : ℕ → ℝ > 0 ,
- f ( n ) = o ( g ( n )) jika dan hanya jika limsup f ( n ) / g ( n ) = 0. (Ini sama dengan lim f ( n ) / g ( n ) = 0.)
- f ( n ) = O ( g ( n )) jika dan hanya jika limsup f ( n ) / g ( n ) <∞.
- f ( n ) = Θ ( g ( n )) jika dan hanya jika 0 <limsup f ( n ) / g ( n ) <∞.
- f ( n ) = Ω ( g ( n )) jika dan hanya jika limsup f ( n ) / g ( n )> 0. (Ini sama dengan f ( n ) bukan o ( g ( n )).)
- f ( n ) = ω ( g ( n )) jika dan hanya jika limsup f ( n ) / g ( n ) = ∞. (Ini setara dengan yang f ( n ) bukan O ( g ( n )).)
atau yang setara,
- f ( n ) = o ( g ( n )) jika dan hanya jika untuk setiap c > 0, untuk n yang cukup besar , f ( n ) ≤ c ⋅ g ( n ).
- f ( n ) = O ( g ( n )) jika dan hanya jika untuk beberapa c > 0, untuk n yang cukup besar , f ( n ) ≤ c ⋅ g ( n ).
- f ( n ) = Θ ( g ( n )) jika dan hanya jika f ( n ) = O ( g ( n )) dan f ( n ) = Ω ( g ( n )).
- f ( n ) = Ω ( g ( n )) jika dan hanya jika untuk beberapa d > 0, untuk banyak n , f ( n ) ≥ d ⋅ g ( n ).
- f ( n ) = ω ( g ( n )) jika dan hanya jika untuk setiap d > 0, untuk banyak n , f ( n ) ≥ d ⋅ g ( n ).
Tapi saya tidak tahu apakah ini praktik yang biasa atau tidak. Saya juga tidak tahu apakah itu cocok untuk mengajar. Masalahnya adalah bahwa kita terkadang ingin mendefinisikan Ω () dengan liminf sebagai gantinya (seperti yang Anda lakukan pada definisi pertama). Sebagai contoh, ketika kita mengatakan "Probabilitas kesalahan dari algoritma acak ini adalah 2 −Ω ( n ) ," kami tidak berarti bahwa probabilitas kesalahan secara eksponensial kecil hanya untuk banyak n !