[การวิเคราะห์อัลกอริทึม] [ตารางไดนามิก] [ไบโนเมียลฮีพ] [เลซี่ไบโนเมียลฮีพ] [ฟิโบนักซี่ฮีพ] [สคริวฮีพ][รายการอ้างอิง]
ไบโนเมียล ฮีพ
(Binomial Heap)
นิยาม ต้นไม้ไบโนเมียล Bk เป็นต้นไม้ที่มีการเรียงลำดับ โดยที่
![]() | ต้นไม้ไบโนเมียล B0 จะประกอบด้วยโหนดโหนดเดียว |
![]() | ต้นไม้ไบโนเมียล Bk จะประกอบด้วยต้นไม้ไบโนเมียล Bk-1 จำนวน 2 ต้นเชื่อมต่อกัน โดยรากของ Bk-1 ต้นหนึ่งจะมีลูกทางขวาสุดเป็นรากของ Bk-1 อีกต้นหนึ่ง |
ต้นไม้ไบโนเมียล B0 ถึง B3 แสดงได้ดังรูป
นิยาม ไบโนเมียล ฮีพ H เป็นรายการสะสมของต้นไม้ไบโนเมียล ที่มีคุณสมบัติ ดังนี้
![]() | ข้อมูลในโหนดต่างๆของต้นไม้ไบโนเมียลแต่ละต้นในฮีพ H จะต้องมีการเรียงลำดับค่าแล้ว กล่าวคือค่าของโหนดใดๆ จะต้องมีค่ามากกว่าหรือเท่ากับค่าของโหนดพ่อของโหนดนั้นๆ |
![]() | มีต้นไม้ไบโนเมียล Bk สำหรับ k ใดๆ ได้อย่างมากเพียงหนึ่งต้นในฮีพ H |
สำหรับการวิเคราะห์ถัวเฉลี่ยจะขอใช้วิธีศักย์ โดยที่ฟังก์ชันศักย์คิดจากจำนวนของต้นไม้
การปฏิบัติการบนไบโนเมียล ฮีพ
BINOMAIL-HEAP-MINIMUM ( H ) | |||
1. y <-- NIL | |||
2. x <-- head[H] | |||
3. min <--![]() |
|||
4. while x <> NIL | |||
5. | do if key[x] < min | ||
6. | then min <-- key[x] | ||
7. | y <-- x | ||
8. | x <-- sibling[x] | ||
9. return y |
BINOMAIL-HEAP-UNION ( H1 , H2 ) | ||||
1. H <-- MAKE-BINOMAIL-HEAP( ) | ||||
2. head[H] <-- BINOMAIL-HEAP-MERGE ( H1 , H2 ) | ||||
3. free the objects H1 and H2 but not the lists they point to | ||||
4. if head[H] = NIL | ||||
5. | then return H | |||
6. prev-x <-- NIL | ||||
7. x <-- head[H] | ||||
8. next-x <-- sibling[x] | ||||
9. while next-x <-- NIL | ||||
10. | do if (degree[x] <> degree[next-x]) or (sibling[next-x]) <> NIL and degree[sibling[next-x]] = degree[x]) | |||
11. | then prev-x <-- x | |||
12. | x <-- next-x | |||
13. | else if key[x] < key[next-x] | |||
14. | then sibling[x] <-- sibling[next-x] | |||
15. | BINOMAIL-LINK(next-x,x) | |||
16. | else if prev-x = NIL | |||
17. | then head[H] <-- next-x | |||
18. | else sibling[prev-x] <-- next-x | |||
19. | BINOMAIL-LINK(x,next-x) | |||
20. | x <-- next-x | |||
21. | next-x <-- sibling[x] | |||
22. return H | ||||
BINOMIAL-LINK(y,z) | ||||
1. p[y] <-- z | ||||
2. sibling[y] <-- child[z] | ||||
3. child[z] <-- y | ||||
4. degree[z] <-- degree[z]+1 |
ี้BINOMIAL-HEAP-INSERT (H,x) |
1. H' <-- MAKE-BINOMIAL-HEAP( ) |
2. p[x] <-- NIL |
3. child[x] <-- NIL |
4. sibling[x] <-- NIL |
5. degree[x] <-- 0 |
6. head[H'] <-- x |
7. H <-- BINOMIAL-HEAP-UNION(H,H') |
BINOMIAL-HEAP-EXTRACT-MIN(H) |
1. find the root x with the minimum key in the root list of H, and remove x from the root list of H |
2. H' <-- MAKE-BINOMIAL-HEAP( ) |
3. Reverse the order of the linked list of x's children, and set head[H'] to point to the head of the resulting list |
4. H <-- BINOMIAL-HEAP-UNION(H,H') |
5. return x |
การจินตทัศน์
![]() | การจินตทัศน์การวิเคราะหถัวเฉลี่ย ไบโนเมียลฮีพ ในการดำเนินงานการแทรก การลบโหนดที่มีค่าน้อยที่สุด และการลดค่าคีย์ |
![]() | การจินตทัศน์การวิเคราะหถัวเฉลี่ย ไบโนเมียลฮีพ ในการดำเนินงานการรวมฮีพ |
[การวิเคราะห์อัลกอริทึม] [ตารางไดนามิก] [ไบโนเมียลฮีพ] [เลซี่ไบโนเมียลฮีพ] [ฟิโบนักซี่ฮีพ] [สคริวฮีพ][รายการอ้างอิง]