我一直想知道为什么STL优先级队列默认使用最大堆而不是最小堆。我想到的两个明显的用例是寻路(Dijkstra)和构建霍夫曼代码。这两种算法都需要首先拉取最小元素。由于排序(std::sort)默认使用升序,我想知道priority_queue背后的设计原因是什么,因为我非常喜欢默认的最小堆。
在英语中,优先权更大的事情应该首先发生。因此,在优先级队列中,应首先弹出具有更高优先级的内容。
基本上,你的问题的答案是因为“优先级”这个词的定义强烈地暗示了从大到小的顺序。
试想医院大堂的优先轮候队伍,最优先(急症)的病人应该排在轮候治疗的最前面。
这是有原因的,但这与C语言的互连特性有关。
priority_queue
被设计成一个易于使用的包装器,围绕make_heap
、pop_heap
和push_heap
。堆函数将最大值保留在前面是有意义的,因为这是您需要能够实现sort_heap
的东西,它也使用堆函数。
当然,您始终可以使用更大的
而不是更少的
来实例化priority_queue
以获得您想要的行为。
Priority_queue改编自make_heap/pop_heap/push_heap/sort_heap。当你make_heap更少时,元素按升序排序。最后一个元素被视为根元素。所以它是最大堆。我想有两个原因:
为什么 首先返回最大的元素(即是最大优先级队列),即使它使用 作为比较类型? 当我想创建一个最小队列时,这尤其让我感到困惑,这将由 是您的最大值。如果您使用创建优先级队列,那么前面是最小的值。我意识到优先级队列使用堆,但我觉得这是有充分理由的。
我想知道为什么使用创建min堆时,应该使用? 对我来说,因为最小的值总是位于堆的顶部,所以使用的类应该是 更新:另一方面,由于(max heap)的默认行为是在顶部保留最大值,因此在我看来,应该用于最大堆创建,而不是最小堆创建
问题内容: 这是 不是 增加Java的堆的最大尺寸的虚拟机启动后。技术原因是什么?垃圾回收算法是否取决于要使用固定数量的内存?还是出于安全原因,通过消耗所有可用内存来防止Java应用程序从DOS的系统中移至其他应用程序? 问题答案: 最后我知道在Sun的JVM中,必须在连续的地址空间中分配整个堆。我想对于大堆值,很难在启动后将其添加到您的地址空间中,同时又要确保它保持连续。您可能需要在启动时获取它
对于堆排序,如果我们想按升序对数组排序,那么应该在最大堆还是最小堆中转换堆?
我已经在eclipse中安装了以及用于打开IBM format堆转储的插件。 当我试图从eclipse中用打开堆转储时,我得到一个消息框错误,它说: “从'C:\UserData\heapdump.44124802.212242.6876.0003.phd'解析堆转储”过程中出现内部错误。Java堆空间
如果我逃跑 在铬33上,我得到 为什么?