Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

การดำเนินการคิวลำดับความสำคัญ Meldable


ฮีป Meldable แบบสุ่ม (เรียกอีกอย่างว่า Meldable Priority Queue) รองรับการดำเนินการทั่วไปจำนวนหนึ่ง สิ่งเหล่านี้เรียกว่าการแทรก การลบ และการดำเนินการค้นหา findMin การดำเนินการแทรกและการลบจะดำเนินการในแง่ของการดำเนินการเพิ่มเติมเฉพาะสำหรับฮีปที่หลอมได้ Meld(A1, A2)

เมล

เป้าหมายพื้นฐานของการดำเนินการ Meld (เรียกอีกอย่างว่าการรวม) คือการรับสองฮีป (โดยนำแต่ละโหนดรูทฮีป) A1 และ A2 และรวมเข้าด้วยกัน ส่งผลให้โหนดฮีปเดียวกลับมา โหนดฮีปนี้เป็นโหนดรูทของฮีปที่มีองค์ประกอบทั้งหมดจากทรีย่อยทั้งสองที่รูทที่ A1 และ A2

คุณลักษณะที่ยอดเยี่ยมของการทำงานแบบผสมผสานนี้คือสามารถกำหนดแบบเรียกซ้ำได้ หากฮีปใดเชื่อมโยงกับค่า null การผสานจะสำเร็จด้วยชุดว่าง และวิธีการส่งคืนโหนดรูทของฮีปที่ไม่ว่างเปล่า หากทั้ง A1 และ A2 ไม่เป็นศูนย์ ให้ตรวจสอบว่า A1> A2 ถ้าใช่ให้สลับทั้งสองอย่าง ดังนั้นจึงมั่นใจได้ว่า A1

function Meld(Node A1, Node A2)
if A1 is nil => return A2
if A2 is nil => return A1
if A1 > A2 => swap A1 and A2
if coin_toss is 0 => A1.left = Meld(A1.left, A2)
else A1.right = Meld(A1.right, A2)
return A1

แทรก

เมื่อการดำเนินการ Meld เสร็จสมบูรณ์ การแทรกลงในฮีปที่หลอมได้นั้นง่ายมาก ขั้นแรก โหนดใหม่ a จะถูกสร้างขึ้นโดยมีค่า p โหนดใหม่นี้จะถูกรวมเข้ากับโหนดรูทของฮีปอย่างง่ายดาย

function Insert(p)
Node a = new Node
a.p = p
root = Meld(a, root)
root.parent = nil
increment node count

เอาออก

เหมือนกับการดำเนินการแทรกที่ง่าย Remove() ใช้การดำเนินการ Meld เพื่อกำจัดโหนดรูทออกจากฮีป ซึ่งทำได้โดยเพียงแค่รวมลูกสองคนของโหนดรูทเข้าด้วยกันและทำให้โหนดที่ส่งคืนเป็นรูทใหม่

function Remove()
rootNode = Meld(rootNode.left, rootNode.right)
if rootNode is not nil => rootNode.parent = nil
decrement node count

FindMin

อาจเป็นการดำเนินการที่ง่ายที่สุดสำหรับฮีปที่หลอมได้แบบสุ่ม FindMin() เพียงแค่ส่งคืนองค์ประกอบปัจจุบันที่เก็บไว้ในโหนดรูทของฮีป

ปฏิบัติการเพิ่มเติม

การดำเนินการพิเศษบางอย่างที่สามารถนำไปใช้กับฮีปที่หลอมได้ซึ่งมี O(logn) อย่างมีประสิทธิภาพกรณีที่เลวร้ายที่สุดคือ -

  • Remove(a) - ลบโหนด a และคีย์ออกจากฮีป
  • ดูดซับ(P) - รวมองค์ประกอบทั้งหมดของฮีปที่หลอมได้ P เข้ากับฮีปนี้ ล้าง P ในกระบวนการ
  • DecreaseKey(a, q) - ลดคีย์ในโหนด a ถึง q (เงื่อนไขล่วงหน้า:q <=a.p)