Definisi tingkat pertumbuhan asimptotik apa yang harus kita ajarkan?


35

Ketika kita mengikuti buku teks standar, atau tradisi, kebanyakan dari kita mengajarkan definisi notasi besar-Oh berikut dalam beberapa kuliah pertama kelas algoritme: Mungkin kita bahkan memberikan seluruh daftar dengan semua bilangannya:

f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
  1. f=o(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  2. f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  3. f=Θ(g) iff (c>0)(d>0)(n00)(nn0)(dg(n)f(n)cg(n))
  4. f=Ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n))
  5. f=ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n)) .

Namun, karena definisi ini tidak begitu mudah untuk dikerjakan ketika harus membuktikan bahkan hal-hal sederhana seperti , kebanyakan dari kita dengan cepat bergerak untuk memperkenalkan "trik batas":5nlog4n+nlogn=o(n10/9)

  1. f=o(g) jika ada dan 0 ,0limnf(n)/g(n)0
  2. f=O(g) jika limnf(n)/g(n) ada dan bukan + ,
  3. f=Θ(g) jika limnf(n)/g(n) ada dan bukan 0 atau + ,
  4. f=Ω(g) jika limnf(n)/g(n) ada dan tidak 0 ,
  5. f=ω(g) jika limnf(n)/g(n) ada dan + .

Pertanyaanku adalah:

Apakah itu menjadi kerugian besar untuk mengajar kelas algoritma sarjana untuk mengambil kondisi batas sebagai yang definisi o , O , Θ , Ω , dan ω ? Itulah yang akhirnya kita semua gunakan dan tampaknya cukup jelas bagi saya bahwa melompati definisi kuantifikasi membuat hidup semua orang lebih mudah.

Saya akan tertarik untuk mengetahui apakah Anda telah menemukan beberapa kasus alami yang meyakinkan di mana standar -definisi sebenarnya diperlukan, dan jika tidak, apakah Anda memiliki argumen yang meyakinkan untuk menjaga standar -definisi tetap di muka. c , n 0c,n0c,n0


1
Tag harus benar-benar "mengajar" tetapi saya tidak dapat menemukan tag terkait dan saya tidak diizinkan membuat tag baru.
slimton

1
Ini pada dasarnya menyerap bilangan ke dalam definisi batas epsilon-delta. Satu-satunya kekhawatiran saya adalah bahwa banyak siswa CS belum melakukan analisis dan pemahaman mereka tentang batasan sebagian besar mekanis. Untuk memungkinkan mereka menghitung dengan cepat, itu adalah no-brainer.
Per Vognsen

6
Perhatikan bahwa dua definisi O () tidak setara (peringatan yang sama berlaku untuk Θ () dan Ω ()). Pertimbangkan kasus di mana f (n) = 2n untuk genap n dan f (n) = 1 untuk n aneh. Apakah f (n) = O (n)? Saya lebih suka menggunakan limsup daripada lim sehingga saya bisa mengatakan f (n) = Θ (n) dalam kasus ini (walaupun tidak satu pun dari definisi Anda yang mengizinkan ini). Tapi ini mungkin preferensi pribadi saya (dan bahkan praktik yang tidak standar), dan saya tidak pernah mengajar kelas.
Tsuyoshi Ito

2
@ Tsuyoshi: Saya pikir inti dari "trik batas" adalah bahwa itu adalah kondisi yang cukup tetapi tidak perlu untuk . (Untuk juga perlu.) Fungsi osilasi counterexample tidak memiliki batas. o ( )O()o()
András Salamon

1
Bukankah Anda seharusnya mengganti simbol oleh di setiap definisi dan properti? Saya menemukan penggunaan sangat mengganggu sebagai siswa. ===
Jeremy

Jawaban:


13

Saya lebih suka mengajar definisi asli dengan bilangan.

IMO, manusia umumnya mengalami kesulitan dalam memahami rumus dan definisi dengan lebih dari dua pergantian pembilang secara langsung. Memperkenalkan bilangan baru dapat memperjelas apa arti definisi tersebut. Di sini, dua bilangan terakhir hanya berarti "untuk semua n cukup besar", memperkenalkan jenis kuantifikasi ini dapat membantu.

Gambar yang saya gambar untuk menjelaskan konsep-konsep ini lebih cocok dengan versi quantifier.

Saya pikir penyederhanaan batas berguna untuk mahasiswa teknik yang hanya tertarik menghitung tingkat pertumbuhan, tetapi tidak akan berguna bagi siswa ilmu komputer. Bahkan, menggunakan penyederhanaan ini dapat menyebabkan lebih banyak kerugian daripada kebaikan.

Ide ini mirip dengan saran bahwa kita menggunakan aturan untuk menghitung turunan (polinomial, eksponensial, ..., aturan rantai, ...) sebagai ganti definisi epsilon-delta tentang itu, yang IMHO bukan ide yang baik.


Gagasan dominasi akhirnya juga bermanfaat: iff \ esits m n > m f ( n ) < g ( n ) . Sekarang f O ( g ) jika ada c > 0 st f ( x ) c g ( x ) . f(x)g(x)\ esitsmn>mf(n)<g(n)fHAI(g)c>0f(x)cg(x)
Kaveh

9

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 ) ≤ cg ( n ).
  • f ( n ) = O ( g ( n )) jika dan hanya jika untuk beberapa c > 0, untuk n yang cukup besar , f ( n ) ≤ cg ( 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 ) ≥ dg ( n ).
  • f ( n ) = ω ( g ( n )) jika dan hanya jika untuk setiap d > 0, untuk banyak n , f ( n ) ≥ dg ( 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 !


Saya juga menggunakan definisi limsup, tetapi untuk siswa yang belum melihat limsup (hampir semua dari mereka) saya harus memperluas ke quantifiers eksplisit pula.
Jeffε

@ Jeffe: Saya setuju bahwa sebagian besar siswa belum melihat limsup, jadi jika kita menggunakan definisi limsup, kita harus menggunakan quantifiers sebagai gantinya di kelas.
Tsuyoshi Ito

2
Masalah dengan versi kuantifier adalah bahwa mereka sulit diingat dan divisualisasikan. Saya lebih suka karena dapat digambarkan sebagai "batas titik tertinggi". Sebuah penjelasan yang mungkin adalah: "Ini seperti l i m , kecuali bahwa l i m . Hanya bekerja ketika urutan konvergen Jika urutan tidak bertemu, misalnya karena berosilasi algoritma antara sangat cepat untuk beberapa n dan lambat untuk lainnya n , maka kita mengambil titik batas tertinggi. " lsayamskamuhallsayamlsayamnn
Heinrich Apfelmus

Sebenarnya, apakah ada contoh alami untuk algoritma di mana waktu berjalan berosilasi?
Heinrich Apfelmus

2
@ Heinrich: Saya sudah menyebutkan waktu berjalan suatu algoritma untuk menemukan pencocokan sempurna grafik pada n simpul, tetapi apakah itu dihitung sebagai contoh alami? Saya menambahkan contoh lain di mana waktu berjalan tidak berosilasi tetapi f (n) / g (n) berosilasi. Contoh tersebut berbicara tentang kompleksitas ruang, tetapi kompleksitas waktu dari contoh yang sama memiliki properti yang sama.
Tsuyoshi Ito

8

Menggunakan batas agak membingungkan karena (1) itu gagasan yang lebih rumit (2) tidak menangkap f = O (g) dengan baik (seperti yang dapat kita lihat dalam diskusi di atas). Saya biasanya berbicara tentang fungsi dari angka Natural (sangat positif) ke angka Natural (yang cukup untuk menjalankan kali), melewatkan hal-hal kecil, dan kemudian definisi yang ringkas dan sesuai untuk undergrad tahun pertama:

Dfn: f = O (g) jika untuk beberapa C untuk semua n kita memiliki f (n) <= C * g (n)


1
Pertama saya tidak suka definisi ini karena menyatakan "all n" mengaburkan fakta penting bahwa notasi O () hanya peduli pada perilaku fungsi untuk n besar. Namun, apa pun definisi yang kita pilih, saya kira kita harus menjelaskan fakta ini bersama dengan definisi tersebut. Berpikir seperti itu, menyatakan definisi sederhana ini sepertinya cukup bagus.
Tsuyoshi Ito

Sementara ini menangkap esensi, saya tidak suka bahwa jika untuk semua n , g ( n ) = 0 untuk semua n hingga N 0 , dan g ( n ) = f ( n ) + 1 sebaliknya, maka f = O ( g ) tetapi definisi ini gagal menangkap hubungan ini. Jadi kita harus menambahkan beberapa handwaving tentang fungsi yang berperilaku baik dalam arti tertentu. f(n)=nng(n)=0nN0g(n)=f(n)+1f=HAI(g)
András Salamon

2
Titik berbicara tentang fungsi yang rentangnya adalah bilangan alami (tidak termasuk 0) adalah persis tidak jatuh ke masalah dengan g (n) = 0.
Noam

1
@Warren Victor Shoup dalam bukunya tentang Komputasi Nomor Teori menggunakan notasi bukan log yang dalam menjalankan analisis waktu, yang saya temukan rapi. len(Sebuah)logSebuah
Srivatsan Narayanan

1
@ Warren (lanjutan) Ini adalah bagaimana dia menjelaskannya: "Dalam menyatakan waktu berjalan algoritma dalam hal input , kita umumnya lebih suka menulis l e n ( a ) daripada log a . Salah satu alasannya adalah estetika: menulis l e n ( a ) menekankan fakta bahwa waktu berjalan adalah fungsi dengan panjang bit a . Alasan lainnya adalah teknis: untuk perkiraan big- O yang melibatkan fungsi pada domain arbitrer, ketidaksetaraan yang sesuai harus berlaku di seluruh domain, dan untuk alasan ini, sangat tidak nyaman untuk menggunakan fungsi, seperti logSebuahlen(Sebuah)logSebuahlen(Sebuah)SebuahHAIlog, yang lenyap atau tidak ditentukan pada beberapa masukan. "
Srivatsan Narayanan

5

Ketika saya mengambil kursus dasar, kami diberi hal sebagai definisi dan hal-hal lain sebagai teorema.c,n0...

Saya pikir yang pertama lebih alami bagi banyak orang yang berpikir diskrit daripada terus menerus, itulah kebanyakan ilmuwan komputer (dalam pengalaman saya). Hal ini juga sesuai dengan cara yang biasanya kita berbicara tentang hal-hal yang lebih baik: "Ada fungsi polinomial derajat 3 yang merupakan batas atas untuk ini hingga faktor konstan."f

Sunting : Anda dapat lebih dekat dengan cara berbicara ini jika Anda menggunakan definisi ini: (Perhatikan bahwa d = f ( n 0 ) menghubungkan definisi ini dengan yang biasanya diberikan)fHAI(g): ⇔c,d>0n0:f(n)cg(n)+dd=f(n0)

Batas barang sangat berguna untuk menghitung kelas kompleksitas, yaitu dengan pena dan kertas.

Bagaimanapun, saya pikir ini sangat berguna bagi siswa untuk belajar bahwa ada banyak definisi (semoga) yang setara. Mereka harus dapat menyadari hal itu dan memilih perbedaan jika tidak ada definisi yang sepadan.


4

Setelah mempelajari konsep-konsep ini hanya beberapa tahun yang lalu, mereka bukan yang paling sulit untuk dipahami untuk kelas saya (sebagai lawan dari konsep-konsep seperti induksi, atau kontra positif). Batas dan limsup hanya lebih "intuitif" bagi mereka yang akrab dengan kalkulus menurut saya. Tetapi siswa dengan landasan matematika seperti itu akan memiliki latar belakang teori-set, sehingga mereka dapat memproses kualifikasi diskrit.

Juga, yang lebih penting, ingatlah bahwa pada akhirnya siswa Anda akan melanjutkan (semoga) membaca buku teks teori cs lainnya, dan mungkin bahkan makalah penelitian suatu hari nanti. Dengan demikian, lebih baik bagi mereka untuk merasa nyaman dengan notasi standar di lapangan, bahkan jika itu tidak idealnya disusun pada awalnya. Tidak ada salahnya memberi mereka definisi alternatif juga, setelah mereka mengasimilasi definisi standar.


3

Untuk penjelasan yang menarik tentang masalah ini, lihat surat yang ditulis dengan baik oleh Don Knuth, "Calculus via O notation" . Dia menganjurkan pandangan sebaliknya bahwa kalkulus harus diajarkan melalui notasi 'A', 'O' dan 'o'.

xSEBUAHyx=SEBUAH(y)|x|y100SEBUAH(200)


1
  1. Definisi Tsuyoshi Ito tidak terlihat benar. Untuk little-omega dan big-omega definisi harus menggunakan liminf, bukan limsup. Definisi big-theta membutuhkan batas bawah pada liminf dan batas atas pada limsup.

  2. Salah satu definisi dari f (n) = O (g (n)) adalah bahwa terdapat fungsi lain f '(n)> = f (n) sedemikian sehingga lim f' (n) / g (n) <infinity.

  3. Mengapa pemula diizinkan untuk mengirim jawaban tetapi tidak memberikan komentar?


1
Adapun item 1, yang saya maksud adalah limsup dalam semua kasus, dan alasannya dijelaskan pada paragraf kedua dari jawaban saya.
Tsuyoshi Ito

sayangnya itu adalah mekanisme pemblokiran spam.
Suresh Venkat

Aso, Anda bisa menggunakan lateks dalam jawaban Anda.
Suresh Venkat

1

Pertama , saya mencoba mengembangkan intuisi pada siswa , sebelum menunjukkan persamaan.

  • "Gabungkan-sort vs Sisipan-Sortir" adalah titik awal yang baik.

f=HAI(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
limn

Aspek lain adalah bahwa hal itu sangat tergantung pada program studi konkret. IMHO tergantung pada mata pelajaran sebelumnya salah satu definisi akan lebih cocok - sementara IMHO masih merupakan ide bagus untuk menunjukkan keduanya dan menerima kedua jenis solusi.

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.