Apakah ada variasi runtime reguler dari Big-O-Notation?

9

Ada beberapa O -Notasi, seperti O(n) atau O(n2) dan seterusnya. Saya bertanya-tanya, apakah ada variasi dari mereka dalam kenyataan seperti O(2n2) atau O(logn2) , atau apakah itu secara matematis salah.

Atau akankah hal yang benar untuk mengatakan bahwa adalah mungkin untuk meningkatkan O(5n2) menjadi O(3n2) ? Saya tidak bisa dan tidak perlu mencari tahu runtimes belum dan saya tidak perlu memperbaiki apa pun, tapi saya perlu tahu apakah ini bagaimana Anda menggambarkan fungsi Anda dalam kenyataan.

bv_Martn
sumber
1
Tidak ada perbedaan material antara O (5n ^ 2) hingga O (3n ^ 2) selama analisis asimptotik. Keduanya O (n ^ 2), dan hanya berbeda dengan konstanta. Bahkan, dalam sebuah bukti, Anda bahkan dapat mengurangi O (5n ^ 2) menjadi O (3n ^ 2) atau O (n ^ 2) untuk membuat matematika lebih bersih karena mereka setara. Saat menulis bukti Anda, Anda membuat catatan di bilah samping yang setara. Bahkan, Anda bahkan dapat menukar O (log n) dengan O (n) dan perhatikan bahwa O (log n) <= O (n) di bilah sisi. Catatan di bilah sisi memberi tahu pembaca bahwa itu disengaja, dan bukan salah ketik. (Setidaknya itulah yang saya lakukan ketika saya mengambil Analisis Algoritma di perguruan tinggi).
jww
2
Jika Anda menggunakan notasi untuk menghilangkan faktor-faktor kecil, Anda selalu dapat menulis sesuatu seperti "... meningkatkan waktu berjalan dari 5 n 2 + o ( n 2 ) ke 3 n 2 + o ( n 2 ) ", dll. Atau, ekuivalen, ( 5 + o ( 1 ) ) n 2 dan ( 3 + o ( 1 ) ) n 2O()5n2+o(n2)3n2+o(n2)(5+o(1))n2(3+o(1))n2. Beberapa penulis lebih suka menulis sebagai singkatan untuk yang pertama. Lihat, misalnya, buku teks oleh Trefethen dan Bau. 5n2
Yonatan N

Jawaban:

21

Saya bertanya-tanya, apakah ada variasi dari mereka dalam kenyataan seperti O(2n2) atau O(log(n2)) , atau apakah itu secara matematis salah.

Ya, O(2n2) atau O(log(n2)) adalah variasi yang valid.

Namun, Anda akan jarang melihatnya jika Anda akan melihatnya sama sekali, terutama pada hasil akhirnya. Alasannya adalah bahwa O(2n2) adalah O(n2) . Demikian pula, O(log(n2)) adalah O(logn) . Itu mungkin mengejutkan bagi pemula. Namun, persamaan tersebut kurang lebih merupakan alasan mengapa notasi- O besar diperkenalkan, untuk menyembunyikan faktor konstanta multiplikatif yang seringkali sulit dijabarkan dan relatif tidak signifikan.

Apakah akan benar untuk mengatakan bahwa mungkin untuk meningkatkan O(5n2) menjadi O(3n2) ?

Ini sama sekali bukan peningkatan jika kompleksitas waktu dari suatu algoritma diubah dari O(5n2) menjadi O(3n2) atau dari Ω(5n2) menjadi Ω(3n2) , karena O(5n2) adalah O(3n2) sementara Ω(5n2) adalah Ω(3n2) . Jadi tidak benar untuk mengatakan kompleksitas waktu ditingkatkan dariO(5n2) menjadiO(3n2) . Memang benar untuk mengatakan kompleksitas waktu dari suatu algoritma ditingkatkan dari5n2 menjadi3n2 , tentu saja.


Latihan 1. Tunjukkan bahwa O(5n2)=O(3n2)=O(n2) .

Latihan 2. Tunjukkan bahwa O(logn)=O(log(n2)) .

Latihan 3. Tunjukkan bahwa Ω(n2+n)=Ω(n2) .

John L.
sumber
1
@bv_Martn Berikut ini tautan yang baik untuk memahami apa yang notasi didefinisikan sebagai (hanya kalkulus batas sederhana!): math.stackexchange.com/questions/925053/…O(n)
Akshat Mahajan
2
Satu-satunya saat saya melihat faktor konstan dalam notasi O-besar adalah ketika seseorang ingin menegaskan bahwa, meskipun dua algoritma memiliki kelas kompleksitas yang sama, salah satunya sangat cepat lebih cepat daripada yang lain.
Markus
7
@AkshatMahajan Satu-satunya jawaban untuk pertanyaan itu /math/925053 jelas salah. Ada banyak sumber yang dapat dipercaya tentang notasi besar. O
John L.
1
"Memang benar untuk mengatakan kompleksitas waktu dari suatu algoritma ditingkatkan dari 5n ^ 2 ke 3n ^ 2" - meskipun waktu berjalan yang tepat sering bervariasi untuk ukuran dan nilai input yang berbeda. Juga, ini melibatkan pembobotan semua operasi / fokus pada satu operasi, yang mungkin tidak banyak bicara tentang faktor konstan yang akan Anda dapatkan di dunia nyata atau dapat dibandingkan dengan algoritma lain menggunakan bobot yang berbeda. Jadi, sementara itu mungkin memiliki beberapa kasus penggunaan yang valid, mengatakan sesuatu seperti di atas adalah kegunaan terbatas (yang mungkin mengapa itu jarang terlihat).
Dukeling
1
@ Mark: Itu salah.
user21820
13

f(n)f(n)g(n)f(n)

Alih-alih memperlakukan notasi Big Oh sebagai sihir misterius di mana Anda harus berkonsultasi dengan penyihir untuk bertanya apakah Anda dapat melakukan sesuatu, Anda harus melihat definisinya . Hormati definisi, dan kemudian lakukan apa pun yang Anda butuhkan untuk menyelesaikan pekerjaan Anda.

Juho
sumber
Yah saya belum membutuhkannya dalam latihan. Atau secara teori sebenarnya, saya hanya perlu tahu apakah definisi wikipedia yang diberikan O (1) -O (n!) Adalah satu-satunya yang ada, atau jika dalam kenyataannya Anda dapat menggambarkan mereka secara berbeda jika mereka berbeda, seperti O (7N). Ketakutan saya adalah bahwa jika saya menggunakan itu seorang profesor matematika akan kehilangan sayapnya
bv_Martn
1
O(1)O(n!)
6
@ bv_Martn Profesor matematika jauh lebih mungkin untuk mundur karena Anda melihat daftar contoh sebagai daftar definisi. Begitu banyak titik matematika adalah untuk mendefinisikan sesuatu dengan cara yang membuat mereka bekerja secara umum, bukan hanya dalam kasus-kasus tertentu. Pertanyaan Anda pada dasarnya adalah versi yang lebih maju dari "Wikipedia mengatakan bahwa saya dapat menambahkan satu dan menambah dua dan menambah tujuh belas. Tetapi dapatkah saya menambahkan nomor lain juga?"
David Richerby
7

O(n)=O(2n)

Notasi O Besar menggambarkan skalabilitas

Pada intinya, Notasi Big-O bukanlah deskripsi tentang berapa lama suatu algoritma perlu dijalankan. Juga bukan deskripsi tentang berapa banyak langkah, baris kode, atau perbandingan yang dibuat algoritma. Ini paling berguna ketika digunakan untuk menggambarkan bagaimana suatu algoritma timbangan dengan jumlah input.

O(logn). Logaritma adalah basis 2, tetapi itu tidak masalah - inti dari hubungan adalah bahwa mengalikan daftar dengan nilai konstan hanya menambah nilai konstan ke waktu.

nnO(n)O(2n)O(n)

Saya menghargai bahwa banyak dari jawaban ini pada dasarnya memberitahu Anda untuk sampai pada kesimpulan ini sendiri dengan membaca definisi Big-O. Tetapi pemahaman intuitif ini membutuhkan waktu cukup lama untuk membungkus kepala saya dan saya memberikannya kepada Anda sejelas mungkin.

menyebarkan
sumber
5
O(n)
3
@ Juho Instruktif, mungkin, tetapi pada akhirnya tidak berguna bagi sebagian besar ilmuwan komputer.
berhamburan
4
Dengan ini saya harus tidak setuju. Memberi label diri sebagai ilmuwan komputer seharusnya bukan alasan untuk tidak memahami arti dari sepotong notasi yang digunakan seseorang, yaitu, melompati semua matematika.
Juho
3
Ya. Saya tidak keberatan programmer tidak memahami hal ini tetapi jika Anda ingin menyebut diri Anda seorang ilmuwan komputer , maka ini adalah materi inti.
David Richerby
2
@dkaeae Tidak, saya merujuk pada orang-orang yang bekerja di bidang karir lain, seperti pengembang perangkat lunak.
bubar
5

O(f)fg(n)=O(f(n))cg(n)cf(n)nf

g(n)=O(f(n))g(n)=O(2f(n))g(n)cf(n)ng(n)c22f(n)g(n)=O(2f(n))c/2

logn2log(n2)2logn

O

David Richerby
sumber
4

Lihatlah definisi O (f (n)), dan Anda melihat bahwa misalnya O (2n ^ 2) dan O (n ^ 2) persis sama. Mengubah algoritma dari operasi 5n ^ 2 ke 3n ^ 2 adalah peningkatan 40 persen. Mengubah dari O (5n ^ 2) ke O (3n ^ 2) sebenarnya tidak ada perubahan, mereka sama.

Sekali lagi, baca definisi O (f (n)).

gnasher729
sumber
4

O(f(n))={g(n)|n,c>0:m>n:c×g(m)f(m)}

=

O(n)=O(2n)

aneh ratchet
sumber
4
log(n!)=nlognn+O(logn)O(f)