Apa yang salah dengan jumlah istilah Landau?

14

saya menulis

saya=1n1saya=saya=1nHAI(1)=HAI(n)

tetapi teman saya mengatakan ini salah. Dari lembar contekan TCS saya tahu bahwa jumlah ini juga disebut Hn yang memiliki pertumbuhan logaritmik dalam n . Jadi ikatan saya tidak terlalu tajam, tetapi cukup untuk analisis yang saya butuhkan.

Apa kesalahan yang telah aku perbuat?

Sunting : Teman saya mengatakan bahwa dengan alasan yang sama, kami dapat membuktikannya

saya=1nsaya=saya=1nHAI(1)=HAI(n)

Ini jelas salah! Apa yang terjadi disini?

Raphael
sumber
2
Lihat diskusi tentang tag pertanyaan ini di sini .
Raphael
diskusi meta tentang algoritma tag .
Kaveh
Lihat juga perlakuan yang lebih konkret dari contoh umum: Apa runtime asimptotik dari loop bersarang ini?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

10

Apa yang Anda lakukan adalah penyalahgunaan notasi yang sangat nyaman.

Beberapa pedant akan mengatakan bahwa apa yang Anda tulis adalah omong kosong, karena menunjukkan satu set dan Anda tidak dapat melakukan operasi aritmatika pada mereka seperti yang Anda lakukan.HAI(f)

Tapi itu ide yang baik untuk mengabaikan pedant itu dan menganggap bahwa adalah singkatan dari beberapa anggota set. Jadi ketika kita mengatakan f ( n ) = g ( n ) + O ( n ) , apa yang sebenarnya kita maksudkan jika itu f ( n ) - g ( n ) O ( n ) . (Catatan: beberapa pedant mungkin ngeri pada pernyataan ini juga, mengklaim bahwa f ( n ) adalah angka dan fHAI(f)f(n)=g(n)+HAI(n)f(n)-g(n)HAI(n)f(n)f adalah fungsinya!)

Ini membuatnya sangat nyaman untuk menulis ekspresi seperti

nk=1nk1/kn+HAI(n1/3)

Apa ini berarti adalah bahwa ada beberapa seperti yangfHAI(n1/3)

nk=1nk1/kn+f(n)

Dalam kasus Anda

k=1n1k=k=1nHAI(1)=HAI(n)

Anda menyalahgunakannya lebih jauh dan Anda harus berhati-hati.

Ada dua kemungkinan interpretasi di sini: Apakah merujuk ke fungsi n , atau fungsi k ?HAI(1)nk

Saya percaya interpretasi yang tepat adalah menafsirkannya sebagai fungsi dari .k

Jika Anda mencoba berpikir itu sebagai fungsi dari , pikir tidak salah, mungkin menyebabkan kesalahan-kesalahan potensial, seperti berpikir k adalah O ( 1 ) dan mencoba untuk menulis Σ n k = 1 k = Σ n k = 1 O ( 1 )nkHAI(1)k=1nk=k=1nHAI(1)

Jika Anda mencoba menganggapnya sebagai fungsi , maka memang benar bahwa, jika f = O ( g ) (seperti argumen pergi ke ) dan g tidak pernah 0 , itukf=HAI(g)g0

S(n)=k=1nf(k)=k=1nO(g(k))=O(k=1n|g(k)|)

Perhatikan bahwa di tengah, kami telah menggunakan penyalahgunaan notasi berarti untuk beberapa fungsi h OO(g(k)) jumlahnya adalah Σ n k = 1 h ( k ) . Perhatikan bahwa fungsi akhir di dalam O mengacu pada fungsi n . Buktinya tidak begitu sulit, tetapi Anda harus memenuhi kenyataan bahwa Anda berurusan dengan batas atas asimptotik (yaitu untuk argumen yang cukup besar), tetapi jumlahnya mulai tepat pada 1 .hO(g)k=1nh(k)On1

Jika Anda mencoba menganggapnya sebagai fungsi dari , maka juga benar bahwa jika f = O ( g ) (seperti argumen menuju ) makanf=HAI(g)

S(n)=k=1nf(k)=k=1nHAI(g(n))=HAI(ng(n))

Jadi bukti Anda pada dasarnya benar, dalam interpretasi mana pun.

Aryabhata
sumber
1
Intinya: Sadarilah (pastikan) bahwa setiap kemunculan simbol Landau memperkenalkan (memiliki) konstanta sendiri .
Raphael
8

Apa yang Anda tulis sepenuhnya benar. The th nomor harmonis memang di set O ( n ) .nHAI(n)

Bukti: . saya=1n1sayadalamn+12n=HAI(n)

Batas atas tidak ketat , tetapi benar.HAI(n)

JeffE
sumber
4
Oke: 1 / i ≤ 1 = O (1).
JeffE
1
Kekhawatiran diarahkan pada tanda kesetaraan kedua. Bagaimana saya memverifikasi itu?
Raphael
2
Tapi itu juga benar. Jumlah n istilah, yang masing-masing adalah O (1), memang O (n).
Suresh
2
@ Surur Hanya jika konstanta yang tersirat oleh adalah independen dari variabel penjumlahan, dan itulah intinya di sini (pertanyaan seed). HAI
Raphael
2
Bug tidak ada dalam persamaan kedua. bug (dalam ekspresi kedua) adalah bagaimana Anda MENDAPATKAN penjumlahan itu. Berasal dari sudah benar. Itu mengklaim bahwa i = O ( 1 ) salah. Saya menyadari ini jelas bagi semua yang peduli, tetapi saya pikir ini adalah masalah dengan pertanyaan 'seeding' :)sayaHAI(1)=HAI(n)saya=HAI(1)
Suresh
6

Untuk contoh kedua, Anda tidak dapat mengklaim bahwa

saya=HAI(1)

karena bervariasi dengan n . Setelah beberapa langkah, inilah i > n / 2 . Cara yang lebih tepat adalah dengan mengatakan bahwa i = O ( n ) karena memang, sepanjang penjumlahan saya tidak pernah melebihi 1 n . Dengan alasan ini, n i = 1 i = n i = 1 O ( n ) = n O ( n ) = O (sayansaya>n/2saya=HAI(n)saya1n

saya=1nsaya=saya=1nHAI(n)=nHAI(n)=HAI(n2)

Namun hal yang benar untuk dilakukan adalah menggunakan notasi O-besar hanya di akhir. Batas atas penjumlahan Anda sekencang yang Anda bisa, dan hanya ketika Anda selesai menggunakan notasi asimptotik untuk menghindari perangkap ini.

Ran G.
sumber