รันไทม์บิ๊กทีต้าของลูปเชิงเส้นที่ซ้อนกันสองลูป โดยการทำงานภายในจะครึ่งหนึ่งของจำนวนครั้งสำหรับการวนซ้ำด้านนอกแต่ละครั้ง

ฉันมีปัญหามากกับปัญหาอัลกอริทึมนี้ ฉันควรจะค้นหาการวิเคราะห์ขนาดใหญ่ของอัลกอริทึมต่อไปนี้:

function example(n):
    int j=n
    for i=0;i<n;i++:
        doSomethingA()
        for k=0;k<=j;k++:
            doSomethingB()
        j/=2

แนวทางของฉันคือแบ่งการดำเนินการทั้งหมดของอัลกอริทึมออกเป็นสองส่วน ส่วนหนึ่งที่มีการเรียก doSomethingA() และ doSomethingB() ทั้งคู่ และส่วนที่สองหลังจาก j กลายเป็น 0 และเรียกเฉพาะ doSomethingA() เท่านั้นจนกว่าโปรแกรมจะหยุดทำงาน

ด้วยแนวทางนี้ คุณจะมีส่วนที่ 1 เกิดขึ้นสำหรับการวนซ้ำ Logn ของลูปภายนอก ส่วนส่วนที่ 2 จะเกิดขึ้นสำหรับการวนซ้ำ n-logn ของลูปภายนอก

จำนวนครั้งที่การวิ่งวงในลดลงครึ่งหนึ่งสำหรับการวิ่งแต่ละครั้ง ดังนั้นจำนวนครั้งที่การวิ่งควรเป็น 2n-1. ดังนั้นรันไทม์สำหรับส่วนที่ 1 ควรเป็น (2n-1)*c ซึ่งเป็นค่าคงที่ ฉันไม่แน่ใจว่าสิ่งนี้ถูกต้องหรือไม่

สำหรับส่วนที่ 2 งานภายในลูปจะคงที่เสมอ และการวนซ้ำจะเกิดซ้ำ (n-logn)

เราก็ได้ ((2n-1)+(n-logn))*c

ฉันไม่แน่ใจว่างานที่ฉันทำมานี้ถูกต้องหรือไม่ และไม่แน่ใจว่าจะดำเนินการต่ออย่างไร สัญชาตญาณบอกฉันว่านี่คือ O(n) แต่ฉันไม่แน่ใจว่าจะหาเหตุผลเข้าข้างตนเองในบิ๊กทีต้าได้อย่างไร นอกเหนือจากนั้น อาจเป็นไปได้ว่าแนวทางทั้งหมดของฉันมีข้อบกพร่อง ฉันจะโจมตีคำถามเช่นนี้ได้อย่างไร หากแนวทางของฉันถูกต้อง ฉันควรทำอย่างไรให้เสร็จสิ้น?

ขอบคุณ.


person Conor James Thomas Warford Hen    schedule 15.02.2018    source แหล่งที่มา
comment
มันคือ Big O no thetas :) นอกจากนี้ Big O ก็เป็นเพียงสัญกรณ์ (ใช้กันอย่างแพร่หลายในวิชาคณิตศาสตร์): สิ่งที่คุณกำลังวิเคราะห์คือความซับซ้อนของเวลา   -  person giorgiga    schedule 15.02.2018
comment
ฉันสับสน. Big-O และ Big-Theta มีแนวคิดที่แตกต่างกันใช่ไหม ฉันถูกขอให้ตามหาบิ๊กเทต้า ไม่ใช่บิ๊กโอ   -  person Conor James Thomas Warford Hen    schedule 15.02.2018
comment
ใช่ O และ Theta เป็นแนวคิดที่แตกต่างกัน Theta เหมือนกับ (O และ Omega) โดยคร่าวๆ แล้ว O จะเป็นขอบเขตบน ส่วนโอเมก้าเป็นขอบเขตล่าง ดังนั้นทีต้าจึงเป็นพฤติกรรมซีมโทติกเหมือนกันทุกประการ   -  person Henry    schedule 15.02.2018
comment
ข้อเสียของฉัน: ฉันลืมไปหมดแล้วว่ามีอยู่จริง - ห่างจากสถาบันการศึกษามากเกินไป ฉันคิดว่า :-)   -  person giorgiga    schedule 15.02.2018
comment
อย่างน้อยวงในจะทำงานหนึ่งครั้งในระหว่างการวนซ้ำของวงรอบนอกแต่ละครั้ง (แม้ว่า j จะถึง 0 แต่ก็จะทำงานครั้งเดียว)   -  person Henry    schedule 15.02.2018


คำตอบ (1)


เป็นการง่ายกว่าที่จะตรวจสอบว่า doSomethingA และ doSomethingB ถูกดำเนินการบ่อยแค่ไหน

สำหรับ doSomethingA เห็นได้ชัดว่ามี n ครั้ง

สำหรับ doSomethingB เราจะได้ (n+1) + (n/2+1) + (n/4+1) + ... + 1 ดังนั้นประมาณ 2n + n 2n จาก n+n/2+n/4+... และ n จากการบวก 1s

เมื่อรวมกันแล้วจะได้ O(n) และ Theta(n) เนื่องจากคุณต้องการ Omega(n) เป็นอย่างน้อย ดังที่เห็นได้จาก n คูณ doSomethingA ที่ถูกดำเนินการ

person Henry    schedule 15.02.2018