为什么std :: priority_queue使用max heap而不是min heap?

时间:2014-08-31 09:13:59

标签: c++ stl priority-queue

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

3 个答案:

答案 0 :(得分:1)

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

  1. 我们在所有默认STL排序中总是使用较少。
  2. push_back()或pop_back()比push_front()或pop_front()更有效。

答案 1 :(得分:0)

有一个原因,但它与C ++的互连功能有关。

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

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

答案 2 :(得分:0)

在英语中,应优先处理优先级较高的内容。因此,在优先级队列中,应首先弹出优先级较高的内容。

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

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

相关问题