ทำไมภาษาส่วนใหญ่จึงให้ min-heap แทนที่จะใช้ max-heap


19

ฉันเพิ่งสังเกตเห็นบางสิ่งบางอย่างและฉันสงสัยว่ามีเหตุผลใดที่ ยกเว้น C ++ (std :: priority_queue เป็น max heap) ฉันไม่รู้ภาษาอื่นที่ให้ heap สูงสุด

โมดูล heapq ของ Python ใช้ min-heap แบบไบนารีที่ด้านบนของรายการ

ไลบรารีของ Java มีคลาส PriorityQueue ซึ่งใช้ขั้นต่ำลำดับความสำคัญคิว

ไลบรารีของ Go ประกอบด้วยโมดูล container / heap ซึ่งใช้ min-heap ที่อยู่ด้านบนของโครงสร้างข้อมูลที่เข้ากันได้

เฟรมเวิร์กหลักของ Apple ประกอบด้วยโครงสร้าง CFBinaryHeap ซึ่งใช้ min-heap

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


พวกเขาไม่เหมือนกันหรือ ฉันลงคะแนนให้ปิดเป็นการโต้แย้ง

2
เพียงไม่กี่วันที่ผ่านมาฉันต้องการ heap ขั้นต่ำใน C ++ และค่อนข้างน่ารำคาญเล็กน้อยที่ค่าเริ่มต้น priority_queue เป็น heap สูงสุด มันบังคับให้ฉันต้องกำหนดโอเปอเรเตอร์> ในคลาสที่กำหนดเองซึ่งมีโอเปอเรเตอร์ <แล้ว เมื่อทำงานกับกราฟโดยทั่วไปคุณต้องการจัดลำดับความสำคัญของขอบที่สั้นที่สุดดังนั้นคุณต้องใช้ฮีปขั้นต่ำ
LaC

2
@LaC: std::not2(std::less<T>())คุณสามารถใช้

คำตอบ:


9

อย่างที่คนอื่น ๆ สังเกตถ้าฮีปยอมรับตัวเปรียบเทียบมันก็ไม่ยากเกินกว่าที่จะรับพฤติกรรมหนึ่งหรืออีกอย่างหนึ่ง อย่างไรก็ตามการอ่านรหัส Google อย่างรวดเร็วแสดงให้เห็นว่า min-heap นั้นแพร่หลายมากในรหัสจริงเนื่องจากมีสองแอปพลิเคชั่นที่เกิดขึ้นซ้ำแล้วซ้ำอีก

  • Dijkstra / A * / อัลกอริทึมเส้นทางที่สั้นที่สุดอื่น ๆ อีกมากมาย (เพราะเส้นทางบางส่วนได้อีกต่อไป)

  • การจำลองเหตุการณ์ (เพราะเวลาดำเนินต่อไป)

นอกจากนี้ฉันจะยืนยันว่าเนื่องจากการเรียงลำดับเริ่มต้นส่งคืนรายการที่มีขนาดเล็กถึงขนาดใหญ่ดังนั้นควรฮีปเริ่มต้น


2
ฉันมักจะเขียนโปรแกรมใน C ++ และสงสัยว่าตรงกันข้าม: ทำไม C ++ ไม่ใช้ min-heap อย่างที่คุณพูดอัลกอริธึมส่วนใหญ่ใช้ min-heap
Martín Fixman

5

มันเป็นเพียงเรื่องของรสนิยม ฉันไม่คิดว่าจะมีเหตุผลเฉพาะใด ๆ มันก็เหมือนกับบางคนชอบที่จะแสดงปัญหาการเพิ่มประสิทธิภาพเป็นลดต้นทุนในขณะที่คนอื่นชอบพูดว่าการเพิ่มผลกำไร


3

ภาษาส่วนใหญ่ที่ฉันรู้อนุญาตให้ส่งพารามิเตอร์เพื่อตัดสินใจว่าควรเป็น min- หรือ max-heap ดังนั้นค่าเริ่มต้นค่อนข้างจะไม่มีข้อ จำกัด ฉันเดาว่าภาษาส่วนใหญ่เป็นคำถามของความสอดคล้องเพื่อกำหนดสิ่งที่ผู้ประกอบการเริ่มต้นคือ สำหรับ C ++ ใน stl ค่าเริ่มต้นจะstd::lessนำไปสู่ ​​min-heap

ความสอดคล้องของการใช้std::lessสำหรับค่าเริ่มต้นทุกที่หมายความว่าคุณจะต้องใช้การเปรียบเทียบนี้เมื่อคุณใช้โครงสร้างข้อมูลชนิดใดและคุณไม่ต้องตัดสินใจว่าโครงสร้างข้อมูลใดที่คุณจะใช้ในภายหลังเมื่อคุณออกแบบคลาสของคุณ ฉันเดาว่ามันคงเหมือนกันสำหรับภาษาอื่นที่มีความแตกต่างเพียงอย่างเดียวที่การเปรียบเทียบที่มากกว่านั้นเป็นมาตรฐาน


3
ฉันไม่คิดว่าจะมีการเชื่อมต่อเช่นนั้น คุณสามารถใช้ heap ชนิดใดก็ได้โดยใช้ <หรือ> แท้จริง std :: less เป็นค่าเริ่มต้นใน STL แต่ใช้ heap สูงสุดแทนที่จะเป็น heap ขั้นต่ำ
LaC

1

โดยทั่วไปค่าดัชนีจะเป็นตัวเลขใดก็ได้ หากคุณเชื่อว่าจำนวนนั้นแทนลำดับความสำคัญและจำนวนที่มากกว่านั้นเป็นลำดับความสำคัญที่สูงกว่าดังนั้นค่าสูงสุดก็จะสมเหตุสมผล แต่ถ้าตัวเลขนั้นแทนเช่นหมายเลขเบเกอรี่ที่เป็นแนวคิด ("Take a number") ดังนั้น min-heap ก็สมเหตุสมผลดีกว่า

คุณสามารถแปลงจากที่หนึ่งไปอีกที่หนึ่งได้เสมอโดยการใช้ส่วนเสริมของดัชนี 1

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