繁体   English   中英

为什么 std::priority_queue 使用最大堆而不是最小堆?

[英]Why does std::priority_queue use max heap instead of min heap?

我一直想知道为什么 STL 优先级队列默认使用最大堆而不是最小堆。 我想到的两个明显用例是寻路 (Dijkstra) 和构建霍夫曼代码。 两种算法都需要先拉取最小元素。 由于排序 (std::sort) 默认使用升序,我想知道 priority_queue 背后的设计原因是什么,因为我更喜欢默认情况下的最小堆。

Priority_queue 改编自 make_heap/pop_heap/push_heap/sort_heap。 当您使用 less 进行 make_heap 时,元素按升序排列。 最后一个元素被视为根元素。 所以它是最大堆。 我想有两个原因:

  1. 我们总是在所有默认的 STL 排序中使用 less。
  2. push_back() 或 pop_back() 比 push_front() 或 pop_front() 高效得多。

这是有原因的,但这与 C++ 的互连特性有关。

priority_queue被设计为一个易于使用的封装make_heappop_heappush_heap 堆函数将最大值保留在前面是有意义的,因为这是您能够实现sort_heap ,它也使用堆函数。

当然,您始终可以使用greater而不是less来实例化priority_queue以获得您想要的行为。

在英语中,优先级更高的事情应该先发生。 因此,在优先级队列中,优先级高的东西应该先被弹出。

基本上你的问题的答案是因为优先级这个词的定义强烈暗示从大到小排序。

想象一下像医院大厅这样的优先队列。 优先级最高的患者(紧急情况)应该排在治疗队列的最前面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM