ปัญหาฮีป d-ary จาก CLRS


10

ฉันสับสนในขณะที่แก้ปัญหาต่อไปนี้ (คำถาม 1-3)

คำถาม

dกอง -ary เป็นเหมือนกองไบนารี แต่ (ยกเว้นที่เป็นไปได้อย่างใดอย่างหนึ่ง) โหนดที่ไม่ใช่ใบมีdเด็กแทนเด็ก 2

  1. คุณจะเป็นตัวแทนของกองd -ary ในอาร์เรย์ได้อย่างไร?

  2. ความสูงของคืออะไรdกอง -ary ของnองค์ประกอบในแง่ของnและd ?

  3. ให้การใช้งาน EXTRACT-MAX อย่างมีประสิทธิภาพในd -ary max-heap วิเคราะห์เวลาในการทำงานในแง่ของdและn

  4. นำ INSERT ไปใช้อย่างมีประสิทธิภาพด้วยd -ary max-heap วิเคราะห์เวลาในการทำงานในแง่ของdและn

  5. ให้การนำไปใช้อย่างมีประสิทธิภาพของ INCREASE-KEY ( A , i , k ) ซึ่งทำเครื่องหมายข้อผิดพลาดหากk <A [i] = k จากนั้นอัพเดตโครงสร้างd -ary matrix heap อย่างเหมาะสม วิเคราะห์เวลาในการทำงานในแง่ของdและn

โซลูชันของฉัน

  1. ให้อาเรย์A[a1..an]

    root:a1level 1:a2a2+d1level 2:a2+da2+d+d21level k:a2+i=1k1dia2+i=1kdi1

    สัญกรณ์ของฉันดูเหมือนจะซับซ้อนเล็กน้อย มีคนอื่นที่เรียบง่ายกว่านี้ไหม?

  2. ให้hหมายถึงความสูงของกองd -ary

    สมมติว่า heap เป็นต้นไม้สมบูรณ์d -ary

    1+d+d2+..+dh=ndh+11d1=nh=logd[nd1+1]1
  3. นี่คือการดำเนินการของฉัน:

    EXTRACT-MAX(A)
    1  if A.heapsize < 1
    2      error "heap underflow"
    3  max = A[1]
    4  A[1] = A[A.heapsize]
    5  A.heap-size = A.heap-size - 1
    6  MAX-HEAPIFY(A, 1)
    7  return max
    
    MAX-HEAPIFY(A, i)
    1  assign depthk-children to AUX[1..d]
    2  for k=1 to d
    3      compare A[i] with AUX[k]
    4      if A[i] <= AUX[k]
    5          exchange A[i] with AUX[k]
    6          k = largest
    7  assign AUX[1..d] back to A[depthk-children]
    8  if largest != i
    9      MAX-HEAPIFY(A, (2+(1+d+d^2+..+d^{k-1})+(largest-1) )
    
    • เวลาทำงานของ MAX-HEAPIFY:

      TM=d(c8d+(c9+..+c13)d+c14d)
      โดยที่หมายถึงต้นทุนของบรรทัดi -th ด้านบนci
    • EXTRACT-MAX:

      TE=(c1+..+c7)+TMCdh=Cd(logd[n(d1)+1]1)=O(dlogd[n(d1)])

    นี่เป็นวิธีที่มีประสิทธิภาพหรือไม่ หรือมีบางอย่างผิดปกติในโซลูชันของฉัน


ฉันคิดว่ามีข้อผิดพลาดเล็กน้อยในคำถามเช่นเดียวกับคำอธิบาย: ความสูงของกอง d-ary มาถึง h = (log [nd - n + 1]) - 1 // หมายเหตุ "-n" ของมันและไม่ใช่ "-1" และไม่ใช่h = (log [nd−1+1])− 1ดังนั้นเหนือคำอธิบายสำหรับความสูงจะไม่ถือเป็นจริง h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] ถึงอย่างไรก็ตามความสูงของต้นไม้จะถูกเขียนเป็นΘ(log(n)).หมายเหตุ: บันทึกจะเป็นฐาน d เสมอสำหรับ d-ary heap .
Surabhi Raje

คำตอบ:


10
  1. โซลูชันของคุณถูกต้องและเป็นไปตามคำจำกัดความของd -ary heap แต่เมื่อคุณชี้ให้เห็นสัญกรณ์ของคุณค่อนข้างซับซ้อน

    คุณอาจใช้ทั้งสองฟังก์ชันต่อไปนี้เพื่อดึงพาเรนต์ขององค์ประกอบi -th และj -th ย่อยขององค์ประกอบi -th

    d-ary-parent(i)    return (i2)/d+1

    d-ary-child(i,j)    return d(i1)+j+1

    เห็นได้ชัดว่าd คุณสามารถตรวจสอบฟังก์ชั่นเหล่านั้นได้โดยตรวจสอบว่า1jdd-ary-parent(d-ary-child(i,j))=i

    นอกจากนี้ยังมองเห็นได้ง่ายคือ heap แบบไบนารีเป็นแบบพิเศษของ -ary heap โดยที่หากคุณแทนที่ด้วยคุณจะเห็นว่าฟังก์ชันตรงกับฟังก์ชันผู้ปกครอง, ซ้ายและขวาที่ระบุไว้ในหนังสือdd=2d2

  2. ถ้าผมเข้าใจคำตอบของคุณอย่างถูกต้องคุณใช้ความก้าวหน้าทางเรขาคณิต ในกรณีของคุณคุณจะได้ไปซึ่งเห็นได้ชัดซึ่งอันที่จริงแล้วเป็นโซลูชันที่ถูกต้องและถูกต้อง แต่เพียงเพื่อประโยชน์ของการจัดการความผันผวนอย่างต่อเนื่องคุณอาจต้องการที่จะเขียน(n))h=logd(nd1+1)1logd(nd)1=logd(n)+logd(d)1=logd(n)+11=logd(n)Θ(logd(n))

    เหตุผลนี้คือฮีปบางตัวอาจไม่สมดุลดังนั้นพา ธ ที่ยาวที่สุดและพา ธ ที่สั้นที่สุดของพวกเขาจะแปรผันตามค่าคงที่โดยใช้สัญลักษณ์คุณจะกำจัดปัญหานี้cΘ

  3. คุณไม่จำเป็นต้องดำเนินการตามขั้นตอนที่กำหนดในตำราเรียนอีกครั้ง แต่คุณต้องแก้ไขเล็กน้อยเช่นกำหนดให้เด็กทุกคนในตารางโดยใช้และฟังก์ชั่น.AUXd-ary-parentd-ary-child

    เพราะไม่ได้เปลี่ยนแปลงก็ขึ้นอยู่กับเวลาการทำงานของ{MAX-HEAPIFY} ในการวิเคราะห์ของคุณตอนนี้คุณต้องใช้เวลากรณีเลวร้ายที่สุดตามสัดส่วนสูงและจำนวนลูกที่แต่ละโหนดจะต้องตรวจสอบ (ซึ่งมากที่สุด ) การวิเคราะห์ของคุณแม่นยำอีกครั้งในตอนท้ายคุณจะได้ซึ่งสามารถเปลี่ยนเป็น:EXTRACT-MAXMAX-HEAPIFYO(d logd(n(d1)))

    O(d logd(n(d1)))=O(d(logd(n)+log(d1)))=O(d logd(n)+d logd(d1))

    สำหรับเหตุผลในทางปฏิบัติเรามักจะสามารถสรุปได้ว่าเพื่อให้เราสามารถสูญเสียเป็นส่วนหนึ่งของOโน้ตแล้วเราจะได้รับ(n)) ซึ่งเป็นโซลูชันที่ถูกต้อง แต่ไม่น่าแปลกใจที่คุณยังสามารถวิเคราะห์เวลาทำงานฟังก์ชั่นการใช้ทฤษฎีบทโทซึ่งจะแสดงให้เห็นว่าไม่ได้เป็นเพียงแต่แม้\dndlogd(d1)O(dlogd(n))MAX-HEAPIFYOΘ

  4. หนังสือ CLRS มีขั้นตอน INSERT แล้ว ซึ่งมีลักษณะเช่นนี้:

    INSERT(A,key)    A.heap_size=A.heap_size+1    A[A.heap_size]=    INCREASE-KEY(A,A.heap_size,key)

    มันสามารถพิสูจน์ได้ง่าย แต่สามัญสำนึกสั่งที่ซับซ้อนที่เวลามันคือ(n)) อาจเป็นเพราะกองอาจเข้าไปในรูตทั้งหมดO(logd(n))

  5. เช่นเดียวกับ INSERT INCREASE-KEY ก็ถูกกำหนดไว้ในตำราเรียนด้วยเช่นกัน:

    INCREASE-KEY(A,i,key)    if key<A[i]        error"new key is smaller then current"    A[i]=key    while i>1 and A[i]>A[d-ary-parent(i)]        A[i]A[d-ary-parent(i)]        i=d-ary-parent(i)

    ความซับซ้อนคือ (ดูจุดก่อนหน้า)O(logd(n))


ขอบคุณ! วิธีการเกี่ยวกับการนำไปใช้งานของ INCREASE-KEY และ INSERT? ฉันพยายามที่จะเขียนมัน แต่มันเรียกซ้ำสองครั้งของ MAX-HEAPIFY มีวิธีแก้ปัญหาที่ดีกว่านี้ไหม? ฉันพบข้อมูลเล็ก ๆ น้อย ๆ เกี่ยวกับเว็บและวิกิ
lucasKo

นั่นคือการออกกำลังกายที่เหลือ? ถ้าเป็นเช่นนั้นโปรดอัปเดตคำถามของคุณและฉันยินดีที่จะตอบธีม
Bartosz Przybylski

ฉันวางคำถามเหล่านั้นไว้ในโพสต์ที่แก้ไขแล้ว
lucasKo

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

คำอธิบายนั้นค่อนข้างโชคร้ายดูการแก้ไขเพื่อการชี้แจง
Bartosz Przybylski

1

นี่ไม่ใช่คำตอบที่สมบูรณ์ ส่วน b) โซลูชันไม่ใช่ มัน ตามที่ผู้ใช้ 55463 ชี้ (เพราะเขาไม่สามารถแสดงความคิดเห็น แต่ตอบ) แต่ downvoted เพราะขาดคำอธิบาย . คำตอบที่อัปโหลดได้แก้ไขไปอย่างผิดพลาดเช่นกัน คำตอบจะยังคงเป็น ที่มา: ปัญหา 2-2 การวิเคราะห์ d -ary heaps ส่วน b)

h=logd[nd1+1]1
h = Θ ( log d ( n ) )
1+d+d2+..+dh=ndh+11d1=nh=logd[n(d1)+1]1
h=Θ(logd(n))

-1

คำตอบสำหรับคำถามที่สองคือ h = log d (n (d-1) + 1) - 1 ดังนั้น h = log d (nd - n + 1) - 1


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