当前位置: 首页 > 知识库问答 >
问题:

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

松思源
2023-03-14

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

共有3个答案

太叔栋
2023-03-14

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

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

试想医院大堂的优先轮候队伍,最优先(急症)的病人应该排在轮候治疗的最前面。

岑俊明
2023-03-14

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

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

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

施华奥
2023-03-14

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

    < li >在所有默认STL排序中,我们总是使用较少的。 < li>push_back()或pop_back()比push_front()或pop_front()效率高得多。
 类似资料:
  • 为什么 首先返回最大的元素(即是最大优先级队列),即使它使用 作为比较类型? 当我想创建一个最小队列时,这尤其让我感到困惑,这将由 是您的最大值。如果您使用创建优先级队列,那么前面是最小的值。我意识到优先级队列使用堆,但我觉得这是有充分理由的。

  • 我想知道为什么使用创建min堆时,应该使用? 对我来说,因为最小的值总是位于堆的顶部,所以使用的类应该是 更新:另一方面,由于(max heap)的默认行为是在顶部保留最大值,因此在我看来,应该用于最大堆创建,而不是最小堆创建

  • 问题内容: 这是 不是 增加Java的堆的最大尺寸的虚拟机启动后。技术原因是什么?垃圾回收算法是否取决于要使用固定数量的内存?还是出于安全原因,通过消耗所有可用内存来防止Java应用程序从DOS的系统中移至其他应用程序? 问题答案: 最后我知道在Sun的JVM中,必须在连续的地址空间中分配整个堆。我想对于大堆值,很难在启动后将其添加到您的地址空间中,同时又要确保它保持连续。您可能需要在启动时获取它

  • 对于堆排序,如果我们想按升序对数组排序,那么应该在最大堆还是最小堆中转换堆?

  • 我已经在eclipse中安装了以及用于打开IBM format堆转储的插件。 当我试图从eclipse中用打开堆转储时,我得到一个消息框错误,它说: “从'C:\UserData\heapdump.44124802.212242.6876.0003.phd'解析堆转储”过程中出现内部错误。Java堆空间

  • 如果我逃跑 在铬33上,我得到 为什么?