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


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 เป็นฟังก์ชั่น!)

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

n≤∑k=1nk1/k≤n+O(n1/3)

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

n≤∑k=1nk1/k≤n+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))h∈O(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=1n1i≤ln⁡n+1≤2n=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 1⋅n. 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.