Apa arti algoritma yang lebih cepat dalam ilmu komputer teoretis?

18

Jika ada algoritma yang berjalan dalam waktu untuk beberapa masalah A, dan seseorang muncul dengan algoritma yang berjalan dalam waktu, , di mana , apakah ini dianggap perbaikan dari algoritma sebelumnya?O ( f ( n ) / g ( n ) ) g ( n ) = o ( f ( n ) )O(f(n))HAI(f(n)/g(n))g(n)=Hai(f(n))

Apakah masuk akal, dalam konteks ilmu komputer teoretis, untuk menghasilkan algoritma seperti itu?

sayang
sumber
4
Yang dimaksud dengan "algoritme yang lebih cepat", yang kami maksud adalah "algoritme yang lebih cepat secara asimptot".
Yuval Filmus
@YuvalFilmus apa yang Anda maksud dengan "tanpa gejala"
undefined
1
Berjalan dalam waktu o(f(n)) .
Yuval Filmus

Jawaban:

26

Tidak, suatu algoritma yang berjalan dalam waktu O(f(n)/g(n)) , di mana g(n)=Hai(f(n)) , tidak selalu dianggap sebagai peningkatan. Sebagai contoh, anggaplah bahwa f(n)=n dan g(n)=1/n . Kemudian HAI(f(n)/g(n))=HAI(n2) adalah batas waktu yang lebih buruk daripadaHAI(f(n))=HAI(n) .

Untuk meningkatkan algoritme yang berjalan dalam waktu f(n) , Anda perlu membuat algoritma yang berjalan dalam waktu Hai(f(n)) , yaitu, dalam waktu g(n) untuk beberapa fungsi g(n)=Hai(f(n)) .

Jika yang Anda tahu adalah bahwa suatu algoritma berjalan dalam waktu , maka tidak jelas apakah suatu algoritma yang berjalan dalam waktu O ( g ( n ) ) adalah peningkatan, apa pun f ( n ) , g ( n ) adalah. Ini karena O besar hanya batas atas pada waktu berjalan. Sebaliknya, itu adalah umum untuk mempertimbangkan kasus terburuk waktu kompleksitas, dan untuk memperkirakan sebagai besar Θ bukan hanya sebagai besar O .HAI(f(n))HAI(g(n))f(n),g(n)ΘHAI

Yuval Filmus
sumber
21
Mungkin lebih baik untuk mengambil pada paragraf pertama Anda. Menggunakan fungsi penurunan terasa sedikit curang-y. g(n)=1
David Richerby
1
@ DavidVicherby: Mungkin sedikit, tetapi OP tidak pernah mengatakan mereka memiliki algoritma yang berjalan di sehingga monotonitas tidak dapat diasumsikan. HAI(g(n))
Kevin
7
@Kevin Tentu tetapi konteksnya adalah ilmu komputer dan, dalam ilmu komputer, notasi O besar biasanya digunakan untuk fungsi yang tidak bertambah. Mungkin si penanya memikirkan istilah-istilah itu.
David Richerby
11

Ingat bahwa Notasi dimaksudkan untuk menganalisis bagaimana tugas tumbuh untuk ukuran yang berbeda dari input, dan secara khusus daun keluar faktor perkalian, jangka menurunkan-order, dan konstanta.HAI(...)

Misalkan Anda memiliki algoritma yang runtime aktualnya adalah 1 n 2 + 2 n + 1 (dengan asumsi Anda benar-benar dapat menghitung instruksi dan mengetahui waktu yang tepat dan seterusnya, yang diakui sebagai asumsi besar dalam sistem modern). Lalu anggaplah Anda datang dengan algoritma baru yang kebetulan menjadi O ( n ) , tetapi runtime yang sebenarnya adalah 1000 n + 5000 . Andaikan Anda tahu perangkat lunak untuk menggunakan algoritma ini tidak akan pernah melihat ukuran masalah n > 10 .HAI(n2)1n2+2n+1HAI(n)1000n+5000n>10

Jadi, mana yang akan Anda pilih - algoritma yang akan memakan waktu 15.000 unit, atau O ( n 2 ) yang hanya akan mengambil 121 unit? Sekarang jika perangkat lunak Anda berevolusi untuk menangani ukuran masalah n > 100000 , yang mana yang akan Anda pilih? Apa yang akan Anda lakukan jika ukuran masalah Anda sangat bervariasi?HAI(n)HAI(n2)n>100000

Twalberg
sumber
2
"tidak pernah melihat ukuran masalah n> 10" - maka kita tidak akan menggunakan notasi O sama sekali, kan ...
AnoE
5
@AnoE Angka sederhana demi argumen. Logika yang sama berlaku apakah Anda menganalisis untuk ukuran masalah 10 vs 1e5 atau menganalisis untuk 1e6 vs 1e9.
twalberg
1
@AnoE Sebagian besar program komputer tidak mencoba menangani ukuran masalah yang terus bertambah. Jadi akan ada trade-off. Itu sebabnya big-O adalah untuk ilmu komputer teoretis , dan konsep-konsepnya dapat diterapkan untuk meningkatkan program yang sebenarnya.
mbomb007
Tepatnya, @ mbomb007. Judul pertanyaannya adalah "Apa arti algoritma yang lebih cepat dalam ilmu komputer teoretis ?" dan dia memiliki ini di dalam tubuh: "Apakah masuk akal, dalam konteks ilmu komputer teoretis ...".
AnoE
@AnoE Dari pengalaman, O notasi digunakan ketika n <10 sepanjang waktu! Bukannya itu ide yang bagus ... tapi itu benar-benar sesuatu yang dilakukan!
Cort Ammon - Pasang kembali Monica
5

Secara umum, apa artinya itu adalah, untuk ukuran input apa pun yang cukup besar, waktu berjalan terburuk dari algoritma lama lebih lambat daripada yang baru. Itu setara dengan formalisme , di mana g adalah kompleksitas waktu dari algoritma baru dan f kompleksitas waktu yang lama.g(n)Hai(f(n))gf

Namun, kadang-kadang, para ilmuwan komputer peduli dengan kinerja rata-rata. Contoh klasiknya adalah Quicksort: runtime kasus terburuknya adalah sedangkan kita mengenal orang lain yang berjalan dalam waktu Θ ( n log n ) , tetapi dalam praktiknya banyak digunakan karena waktu berjalan rata-rata yang baik. Selain itu dapat diubah untuk berjalan sangat cepat dalam kasus-kasus yang paling sering terjadi di alam liar, seperti array yang sebagian besar dalam urutan yang benar.Θ(n2)Θ(ncatatann)

Dan kadang-kadang, bahkan para ilmuwan komputer teoretis menggunakan "lebih cepat" seperti orang normal. Sebagai contoh, sebagian besar implementasi kelas String memiliki Optimasi String Pendek (juga disebut Optimasi String Kecil), meskipun hanya mempercepat untuk string pendek dan overhead murni untuk yang lebih lama. Ketika ukuran input semakin besar dan semakin besar, waktu operasi String yang dijalankan dengan SSO akan semakin tinggi dengan istilah konstanta yang kecil, jadi menurut definisi yang saya berikan di paragraf pertama, menghapus SSO dari kelas String membuatnya lebih cepat . ”Namun dalam praktiknya, sebagian besar string berukuran kecil, sehingga SSO membuat sebagian besar program yang menggunakannya lebih cepat, dan sebagian besar profesor ilmu komputer tahu lebih baik daripada berkeliling menuntut bahwa orang hanya berbicara tentang pesanan kompleksitas waktu asimptotik .

Davislor
sumber
1

Tidak ada satu definisi terpadu tentang apa "algoritma yang lebih cepat" itu. Tidak ada badan pengatur yang memutuskan apakah suatu algoritma lebih cepat dari yang lain.

Untuk menunjukkan mengapa ini terjadi, saya ingin menawarkan dua skenario berbeda yang menunjukkan konsep keruh ini.

Contoh pertama adalah algoritme yang mencari daftar data unordered yang tertaut. Jika saya dapat melakukan operasi yang sama dengan sebuah array, saya tidak memiliki perubahan pada ukuran kinerja Oh yang besar. Kedua pencarian adalah O (n). Jika saya hanya melihat nilai-nilai Oh yang besar, saya bisa mengatakan bahwa saya tidak membuat perbaikan sama sekali. Namun, diketahui bahwa pencarian array lebih cepat daripada berjalan dalam daftar tertaut di sebagian besar kasus, jadi orang dapat memutuskan bahwa itu membuat algoritma "lebih cepat," meskipun Oh besar tidak berubah.

Jika saya dapat menggunakan contoh tradisional pemrograman robot untuk membuat sandwich PBJ, saya bisa menunjukkan apa yang saya maksud dengan cara lain. Pertimbangkan saja titik di mana seseorang membuka toples selai kacang.

Pick up the jar
Grab the lid
Unscrew the lid

Melawan

Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Grab the lid
Unscrew the lid

Bahkan dalam pengaturan teoretis paling akademis yang dapat saya pikirkan, Anda akan menemukan bahwa orang menerima bahwa algoritma pertama lebih cepat daripada yang kedua, meskipun hasil notasi Oh besar adalah sama.

Sebaliknya, kita dapat mempertimbangkan algoritma untuk memecah enkripsi RSA. Saat ini, dianggap bahwa proses ini mungkin O (2 ^ n), di mana n adalah jumlah bit. Pertimbangkan algoritma baru yang menjalankan n ^ 100 lebih cepat Ini berarti proses baru saya berjalan di O (2 ^ n / n ^ 100). Namun, dalam dunia kriptografi, percepatan polinomial ke algoritma eksponensial secara tradisional tidak dianggap sebagai kecepatan teoretis sama sekali. Ketika melakukan bukti keamanan, diasumsikan bahwa penyerang dapat menemukan salah satu dari percepatan ini, dan itu tidak akan berpengaruh.

Jadi dalam satu keadaan, kita dapat mengubah O (n) menjadi O (n), dan menyebutnya lebih cepat. Dalam keadaan yang berbeda, kita dapat mengubah O (2 ^ n) menjadi O (2 ^ n / n ^ 100), dan mengklaim tidak ada kecepatan yang berarti sama sekali. Inilah sebabnya saya katakan tidak ada satu definisi yang disatukan untuk "algoritma yang lebih cepat." Itu selalu tergantung secara kontekstual.

Cort Ammon - Pulihkan Monica
sumber
1

A(n)O(f(n))

 0cf< sup limnSEBUAH(n)f(n)=cf

g(n)sup limng(n)=h(n)=f(n)g(n)

SEBUAH(n)HAI(h(n))SEBUAH(n)HAI(h(n))

 0ch< sup limnSEBUAH(n)h(n)=ch

Dengan menggunakan aturan batas, kita juga dapat menulis:

ch=sup limnSEBUAH(n)h(n)=sup limnSEBUAH(n)g(n)f(n)=cfsup limng(n)

ch<cf=0

cf0SEBUAH(n)HAI(h(n))

SEBUAH(n)SEBUAH(n)SEBUAH(n)Θ(f(n))g(n)

SEBUAH(n)HAI(f(n))SEBUAH(n)SEBUAH(n)HAI(h(n))

Jared Goguen
sumber
1
Batas Anda harus menjadi batas superior.
Yuval Filmus
1
@YuvalFilmus Diperbarui
Jared Goguen