Big O: ซ้อนกันสำหรับวนรอบกับการพึ่งพา


9

ฉันได้รับการบ้านด้วย Big O. ฉันติดอยู่กับรังซ้อนสำหรับลูปที่ขึ้นอยู่กับลูปก่อนหน้านี้ นี่คือคำถามการทำการบ้านของฉันเนื่องจากฉันต้องการที่จะเข้าใจจริงๆ:

sum = 0;
for (i = 0; i < n; i++ 
    for (j = 0; j < i; j++) 
        sum++;

ส่วนที่ขว้างฉันไปคือj < iส่วนหนึ่ง ดูเหมือนว่ามันจะดำเนินการเหมือนแฟคทอเรียล แต่มีการเพิ่มเติม คำแนะนำใด ๆ ที่จะได้รับการชื่นชมจริงๆ


คำอธิบายที่ดีที่นี่
saadtaame

คำตอบ:


10

ดังนั้นผมขอชี้แจงบางสิ่งที่คุณมีความสนใจในขนาดใหญ่-O สัญกรณ์ - ที่นี้หมายถึงขอบเขตบน มันก็โอเคที่จะนับขั้นตอนมากกว่าที่คุณทำจริง โดยเฉพาะคุณสามารถปรับเปลี่ยนอัลกอริทึมเป็น

 ...
    for (j = 0; j < n; j++) 
 ...

ดังนั้นคุณมีลูปซ้อนกันสองวงแต่ละวงวิ่งครั้งซึ่งให้ขอบเขตบนของnO(n2)

แน่นอนคุณต้องการประมาณการที่ดีสำหรับขอบเขตบน ดังนั้นเมื่อเสร็จแล้วเราต้องการกำหนดขอบเขตล่าง ซึ่งหมายความว่าไม่เป็นไรที่จะนับขั้นตอนน้อยลง ดังนั้นให้พิจารณาการดัดแปลง

for (i = n/2; i < n; i++)
    for (j = 0; j < n/2; j++) 
        sum++;

ที่นี่เราแสดงการวนซ้ำเพียงบางส่วนเท่านั้น อีกครั้งเรามีลูปซ้อนกันสองครั้ง แต่คราวนี้เรามีการวนซ้ำต่อลูปซึ่งแสดงว่าเรามีอย่างน้อยn/2n2/4เพิ่มเติม ในกรณีนี้เราแสดงว่าขีด จำกัด ล่างเชิงเส้นกำกับด้วยΩ(n2). ตั้งแต่ขอบเขตล่างและบนตรงเราสามารถพูดได้n2 เป็นเส้นกำกับที่แน่นและเราเขียน Θ(n2).

หากคุณต้องการทราบข้อมูลเพิ่มเติมโปรดอ่านที่นี่


6
sum = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < i; j++) 
        sum++;

ลองติดตามสิ่งนี้:

  • เมื่อ i = 0, วงในจะไม่ทำงานเลย ( 0<0 == false)
  • เมื่อ i = 1, วงภายในจะทำงานหนึ่งครั้ง (สำหรับ j == 0)
  • เมื่อ i = 2, วงภายในจะทำงานสองครั้ง (สำหรับ j == 0 และ j == 1)

อัลกอริทึมนี้จะเพิ่มsumจำนวนครั้งต่อไปนี้:

Σx=1nx-1=0+1+2+3+4 ...+n-1=n(n-1)2

เราสามารถดูได้จากการตรวจสอบว่ายอดรวมเป็น "หมายเลขสามเหลี่ยม" กระจายn ในส่วนที่เหลือของเศษเรามาถึงที่ n2-n2ซึ่งเป็นคำที่เติบโตเร็วที่สุด n2 ดังนั้นความซับซ้อนของ Bachman-Landau Big-Theta คือ θ(n2)O(n2) and Ω(n2).


3

เรามาดูกันว่าฉันสามารถอธิบายสิ่งนี้ ...

ดังนั้นถ้าวงด้านในเป็น j

ทีนี้สำหรับการวนซ้ำครั้งแรกคุณทำ n- (n-1) คูณผ่านลูปด้านใน ในครั้งที่สองที่คุณทำ n- (n-2) คูณผ่านลูปด้านใน ในเวลา Nth คุณทำ n- (nn) คูณนั่นคือ n คูณ

ถ้าคุณเฉลี่ยจำนวนครั้งที่คุณผ่านวงในก็จะ n / 2 ครั้ง

ดังนั้นคุณสามารถบอกได้ว่านี่คือ O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)

มันสมเหตุสมผลไหม


มันแปลกเล็กน้อย แต่ฉันคิดว่าฉันเข้าใจแล้ว! ขอบคุณ! อาจต้องใช้เวลาสักครู่เพื่อจะจมลงไปใน

ดังนั้นถ้าj < iส่วนนั้นเป็นจริงแล้วj < i^2ผลลัพธ์ O สำหรับส่วนนั้นจะเป็น n ^ 2/2 หรือไม่

ก่อนอื่นให้สังเกตว่า O (n ^ 2/2) = O (n ^ 2) ตอนนี้ถ้าคุณเปลี่ยนเป็น j <i ^ 2 คุณก็กำลังทำ (n- (n-1)) ^ 2 ในการทำซ้ำครั้งแรกและ n ^ 2 ในการทำซ้ำครั้งล่าสุด ฉันจำไม่ได้ว่าสัญกรณ์ใหญ่ของ O สำหรับวงในคืออะไร O (n ^ 2) เป็นขอบบนที่หลวม ดังนั้นขอบด้านบนที่หลวมสำหรับสิ่งทั้งหมดจะเป็น O (n ^ 3) แต่วงในนั้นน้อยกว่า O (n ^ 2) มันสมเหตุสมผลไหม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.