มีอะไรผิดปกติกับจำนวนเงินของเงื่อนไขรถม้าสี่ล้อ?


14

ฉันเขียน

i=1n1i=i=1nO(1)=O(n)

แต่เพื่อนของฉันบอกว่านี่มันผิด จากแผ่นโกง TCS ฉันรู้ว่าผลรวมจะเรียกว่าซึ่งมีการเจริญเติบโตในลอการิทึมn ดังนั้นขอบเขตของฉันจึงไม่คมมาก แต่ก็เพียงพอสำหรับการวิเคราะห์ที่ฉันต้องการHnn

ฉันทำอะไรผิด?

แก้ไข : เพื่อนของฉันบอกว่าด้วยเหตุผลเดียวกันเราสามารถพิสูจน์ได้

i=1ni=i=1nO(1)=O(n)

เห็นได้ชัดว่านี่ผิด! เกิดขึ้นที่นี่คืออะไร?


2
ดูการอภิปรายเกี่ยวกับแท็กของคำถามนี้ที่นี่
ราฟาเอล

อภิปรายเมตาเกี่ยวกับแท็กอัลกอริทึม
Kaveh

ดูเพิ่มเติมที่การรักษาตัวอย่างที่เป็น
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


10

สิ่งที่คุณกำลังทำคือการใช้สัญลักษณ์ในทางที่ผิด

คนเดินถนนบางคนจะบอกว่าสิ่งที่คุณเขียนนั้นไร้สาระเนื่องจากหมายถึงชุดหนึ่งและคุณไม่สามารถดำเนินการทางคณิตศาสตร์กับพวกเขาในแบบที่คุณกำลังทำอยู่O(f)

แต่เป็นความคิดที่ดีที่จะเพิกเฉยต่อคนเดินถนนเหล่านั้นและคิดว่าย่อมาจากสมาชิกบางคนในกองถ่าย ดังนั้นเมื่อเราพูด( n ) = กรัม( n ) + O ( n )สิ่งที่เราหมายถึงว่าจริงๆถ้าF ( n ) - กรัม( n ) O ( n ) (หมายเหตุ: คนเดินถนนบางคนอาจสั่นที่คำสั่งนี้เช่นกันโดยอ้างว่าf ( n )เป็นตัวเลขและfO(f)f(n)=g(n)+O(n)f(n)g(n)O(n)f(n)f เป็นฟังก์ชั่น!)

สิ่งนี้ทำให้สะดวกในการเขียนนิพจน์เช่น

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

สิ่งที่หมายถึงนี้ก็คือว่ามีบางดังกล่าวว่าfO(n1/3)

nk=1nk1/kn+f(n)

ในกรณีของคุณ

k=1n1k=k=1nO(1)=O(n)

คุณกำลังใช้งานในทางที่ผิดยิ่งขึ้นและคุณต้องระวัง

มีการตีความที่เป็นไปได้สองประการที่นี่: อ้างถึงฟังก์ชันของnหรือฟังก์ชันkหรือไม่?O(1)nk

ผมเชื่อว่าการตีความที่ถูกต้องคือการตีความว่ามันเป็นหน้าที่ของkk

หากคุณลองคิดว่ามันเป็นฟังก์ชั่นของคิดว่าไม่ถูกต้องมันอาจนำไปสู่การเข้าใจผิดที่อาจเกิดขึ้นเช่นการคิดว่าkคือO ( 1 )และพยายามเขียนn k = 1 k = n k = 1 O ( 1 )nkO(1)k=1nk=k=1nO(1)

ถ้าคุณลองคิดว่ามันเป็นฟังก์ชันของแล้วมันเป็นความจริงที่ว่าถ้าf = O ( g ) (เมื่ออาร์กิวเมนต์ไปที่ ) และgไม่เคยเป็น0นั่นkf=O(g)g0

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

โปรดทราบว่าอยู่ตรงกลางที่เราได้ใช้การละเมิดสะดวกของโน้ตหมายความว่าสำหรับฟังก์ชั่นบางชั่วโมงO ( กรัม)รวมเป็นΣ n k = 1ชั่วโมง( k ) โปรดทราบว่าฟังก์ชั่นขั้นสุดท้ายภายในOหมายถึงการทำงานของn หลักฐานที่ไม่ยาก แต่คุณต้องให้ความสำคัญกับความจริงที่ว่าคุณจะจัดการกับ asymptotic ผูกพันบน (เช่นสำหรับอาร์กิวเมนต์ขนาดใหญ่พอ) แต่รวมเริ่มต้นที่เหมาะสมใน1O(g(k))hO(g)k=1nh(k)On1

ถ้าคุณลองคิดว่ามันเป็นฟังก์ชันของแล้วมันก็เป็นความจริงที่ว่าถ้าf = O ( g ) (เมื่ออาร์กิวเมนต์ไปที่ ) แล้วnf=O(g)

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

ดังนั้นหลักฐานของคุณจึงถูกต้องทั้งในการตีความ


1
ด้านล่างบรรทัด: โปรดทราบ (ให้แน่ใจว่า) ที่ทุกคนเกิดขึ้นของรถม้าเปิดตัวสัญลักษณ์ (มี) ค่าคงที่ของตัวเอง
Raphael

8

nO(n)

i=1n1ilnn+12n=O(n)

The upper bound O(n) isn't tight, but it's correct.


4
Okay: 1/i ≤ 1 = O(1).
JeffE

1
The concern is directed at the second equality sign. How do I verify that?
Raphael

2
But that is also correct. A sum of n terms, each of which is O(1), is indeed O(n).
Suresh

2
@Suresh Only if the constants implied by the Os are independent of the summation variable, and that is the point here (seed question).
Raphael

2
The bug is not in the second equality. the bug (in the second expression) is in how you GET to that summation. Going from iO(1)=O(n) is correct. It's claiming that i=O(1) is wrong. I realize this is obvious to all concerned, but I think this is the problem with 'seeding' questions :)
Suresh

6

For the second example, you can't claim that

i=O(1)

since i varies with n. After few steps it will be the case that i>n/2. A more appropriate way is to say that i=O(n) since indeed, throughout the summation i never exceeds 1n. By this reasoning,

i=1ni=i=1nO(n)=nO(n)=O(n2)

However the right thing to do is actually use the big-O notation only at the end. Upper bound your summation as tight as you can, and only when your done use the asymptotic notations to avoid these pitfalls.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.