我总是想知道为什么STL优先级队列默认使用max heap而不是min heap。 想到的两个明显的用例是寻路(Dijkstra)和建立霍夫曼码。 两种算法都需要先拉最小元素。 由于排序(std :: sort)默认使用升序, 我想知道priority_queue背后的设计推理是什么, 因为我非常喜欢默认的最小堆。
答案 0 :(得分:1)
Priority_queue改编自make_heap / pop_heap / push_heap / sort_heap。当make_heap with less时,元素按升序排序。最后一个元素被视为根元素。所以它是最大堆。我想有两个原因:
答案 1 :(得分:0)
有一个原因,但它与C ++的互连功能有关。
priority_queue
旨在成为围绕make_heap
,pop_heap
和push_heap
的易于使用的包装器。堆函数在前面保留最大值是有意义的,因为这是你需要能够实现sort_heap
的东西,它也使用堆函数。
当然,您始终可以使用priority_queue
而不是greater
来实例化less
,以获得您想要的行为。
答案 2 :(得分:0)
在英语中,应优先处理优先级较高的内容。因此,在优先级队列中,应首先弹出优先级较高的内容。
基本上,您的问题的答案是因为优先级一词的定义强烈暗示着从大到小的顺序。
想象一下像医院大厅这样的优先队列。具有最高优先级的患者(紧急病例)应排在治疗队列的前列。