C++ 为什么std::priority_队列使用最大堆而不是最小堆?
我一直想知道为什么STL优先级队列默认使用最大堆而不是最小堆。 我想到的两个明显的用例是寻路(Dijkstra)和构建哈夫曼代码。 这两种算法都需要先提取最小元素。 由于排序(std::sort)默认使用升序, 我想知道优先级队列背后的设计原因是什么,C++ 为什么std::priority_队列使用最大堆而不是最小堆?,c++,stl,priority-queue,C++,Stl,Priority Queue,我一直想知道为什么STL优先级队列默认使用最大堆而不是最小堆。 我想到的两个明显的用例是寻路(Dijkstra)和构建哈夫曼代码。 这两种算法都需要先提取最小元素。 由于排序(std::sort)默认使用升序, 我想知道优先级队列背后的设计原因是什么, 因为默认情况下我更喜欢一个MIN堆。是有原因的,但它是与C++的连接特性有关的。 priority\u queue被设计成一个围绕make\u heap、pop\u heap和push\u heap的易于使用的包装器。堆函数将最大值放在前面是有意
因为默认情况下我更喜欢一个MIN堆。
是有原因的,但它是与C++的连接特性有关的。
priority\u queue
被设计成一个围绕make\u heap
、pop\u heap
和push\u heap
的易于使用的包装器。堆函数将最大值放在前面是有意义的,因为这是实现sort\u heap
所需要的,它也使用堆函数
当然,您始终可以使用
更大的而不是更少的来实例化优先级队列
,以获得所需的行为。优先级队列是从make\u heap/pop\u heap/push\u heap/sort\u heap改编而来的。当您使用更少的元素创建_堆时,元素将按升序排序。最后一个元素被视为根元素。所以这就是max heap。我想有两个原因:
在所有默认STL排序中,我们总是使用较少的
push_back()或pop_back()比push_front()或pop_front()更有效
在英语中,优先权更大的事情应该首先发生。因此,在优先级队列中,应该首先弹出具有更高优先级的内容
基本上,你的问题的答案是因为单词priority的定义强烈地暗示了从最大到最小的顺序
想象一下像医院大厅一样的优先队列。最优先(紧急情况)的患者应排在治疗队列的最前面 因为它基本上是一个优先级队列,而不是一个堆。可能是因为在优先级队列中,您希望优先级更高的项目排在第一位,但我同意这不是一个经过深思熟虑的设计(因为它实际上要求每个人向后实现其比较器)。让某种优先级对象实现它的比较运算符,使较高优先级的值“小于”较低优先级的值,这会更有意义。@MichaelAaronSafyan:甚至“优先级”也令人困惑,因为人们说“此任务是优先级1”,他们的意思是“先做”而不是“最后做”外行对优先权的理解是,“最高”优先权是最小的数字,“第二”优先权紧随其后。。。。我同意OP的说法,在STL中所做的选择似乎很愚蠢,但也许这里没有人真正知道为什么会这样做。那么,为什么默认情况下make_heap
make max heap而不是min heap?实际上,sort\u heap
可以通过max heap或min heap实现。