【问题标题】:Why does std::priority_queue use max heap instead of min heap?为什么 std::priority_queue 使用最大堆而不是最小堆?
【发布时间】:2014-10-24 18:43:12
【问题描述】:

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

【问题讨论】:

  • 因为它本质上是一个优先队列,而不是堆。
  • 可能是因为在优先级队列中您希望优先级更高的项目排在第一位,但我同意这不是一个经过深思熟虑的设计(因为它实际上要求每个人都向后实现他们的比较器)。拥有某种优先级对象来实现其比较运算符会更有意义,这样较高优先级值“小于”较低优先级值。
  • @MichaelAaronSafyan:甚至“优先级”也令人困惑,因为人们说“这个任务是优先级 1”之类的话,他们的意思是“先做”而不是“最后做”。外行对优先级的理解是“最高”优先级是最小的数字,其次是“第二”优先级....我同意OP的观点,即在STL中做出的选择似乎很愚蠢,但也许这里没有人真正知道为什么会这样。

标签: c++ stl priority-queue


【解决方案1】:

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

priority_queue 旨在成为make_heappop_heappush_heap 的易于使用的包装器。堆函数将最大值保持在最前面是有意义的,因为这是您需要能够实现sort_heap,它也使用堆函数。

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

【讨论】:

  • 那么,为什么make_heap默认使用最大堆而不是最小堆呢?其实sort_heap可以用max heap或者min heap来实现。
【解决方案2】:

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() 效率更高。

【讨论】:

  • 你也回答了我的疑惑
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 2015-12-21
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2012-04-16
    • 2011-01-07
    • 2018-11-23
    相关资源
    最近更新 更多