ความซับซ้อนของเวลาของการวนซ้ำสามชั้น


13

โปรดพิจารณาการวนซ้ำสามชั้นต่อไปนี้:

for (int i = 1; i <= n; ++i)
    for (int j = i; j <= n; ++j)
        for (int k = j; k <= n; ++k)
            // statement

คำสั่งที่นี่จะถูกดำเนินการอย่างแน่นอนn(n+1)(n+2)6ครั้ง ใครช่วยอธิบายหน่อยได้ไหมว่าสูตรนี้ได้มาอย่างไร ขอขอบคุณ.


คำตอบ:


14

คุณสามารถนับจำนวนครั้งที่วงในสุดสำหรับลูปถูกเรียกใช้งานโดยการนับจำนวนทริปเปิล(i,j,k)ที่ถูกเรียกใช้งาน

1ijkn

  • n+2
  • n+2
  • (i,j,k)
    • i
    • j
    • k

n+2(n+23)


2
คำตอบที่ดี! ค่าที่แน่นอนของ i, j, k ไม่สำคัญ เราจำเป็นต้องรู้ว่ากล่องสีฟ้าใด ๆ สามารถวางในตำแหน่งที่เป็นไปได้ n และตำแหน่งนั้นถูก จำกัด ขอบเขต: อันดับที่ 2 จะมาหลังวันที่ 1 และก่อนหน้านั้นเสมอ
Dávid Natingga

@rizwanhudda ล้างยกเว้นมีส่วนร่วมใน 2 คุณช่วยอธิบายได้มั้ย ดูเหมือนว่าหมายเลขที่ถูกต้อง +2n+2n+3
saadtaame

1
@saadtaame ใช่ คุณสามารถจินตนาการได้ว่ามีกล่องสีแดงแต่มีอิสระที่จะเลือกกล่องสีแดง 3 กล่องเพื่อทาสีสีน้ำเงินจาก "กล่องสีแดง" เนื่องจากคุณไม่สามารถระบายสีกล่องแรกเป็นสีน้ำเงินได้ (ตั้งแต่ )n+3n+2i1
rizwanhudda

3

สำหรับฉันมันง่ายกว่าที่จะสังเกตว่าการวนรอบภายในจะถูกดำเนินการครั้งและจำนวนการประหารชีวิตทั้งหมดในลูปภายในคือni

(ni)+(ni1)+(ni2)++1

สิ่งนี้สามารถเขียนใหม่เป็นและถูกดำเนินการครั้งดังนั้นจำนวนการดำเนินการทั้งหมดคือj=0ninijn

i=0nj=0ninij=n(n+1)(n+2)6

ความท้าทายสำหรับคุณ: จินตนาการว่าคุณมีห่วงซ้อน x ตามคำตอบก่อนหน้านี้มันจะดำเนินการ (n + x-1) เลือก x ครั้ง คุณจะคำนวณสูตรอย่างไร
Dávid Natingga

โชคดีที่ OP ไม่ขอ x-ซ้อนกัน! คำตอบอื่น ๆ ที่ให้ไว้จะขยายไปยังลูป x-nested อย่างไร คำตอบของฉันควรได้รับผลรวมมากขึ้นตั้งแต่ 0 ถึง n, 0 ถึง n-i_1, 0 ถึง n-i_2, ... , 0 ถึง n-i_x แต่ฉันไม่รู้วิธีคำนวณ
andy mcevoy

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