【问题标题】:Does priority_queue really produce a Heap? [closed]priority_queue 真的会产生 Heap 吗? [关闭]
【发布时间】:2018-03-17 06:58:45
【问题描述】:

我对 C++ STL 中的 Heap 和 priority_queue 有点困惑。 priority_queue 真的会产生 Heap 吗?

如果我们按顺序插入元素 - 5、1、10、30、20 maxHeap 的输出将为:30、20、5、1、10 而priority_queue 的输出将是:30、20、10、5、1

这背后的原因是什么?

priority_queue 是否总是排序的?

【问题讨论】:

  • “输出将是”是什么意思? priority_queue 不产生输出。它是一种数据结构。你是如何产生输出的?
  • 输出是指打印priority_queue的内容。
  • 如果 internal 内容作为优先队列履行其合同,你为什么要关心它的外观?
  • 您仍然没有告诉我们您所说的“输出”或“打印内容”是什么意思。优先级队列的内容不可访问,但您必须删除顶部元素才能获得下一个元素。删除操作也改变了数据结构的内部表示。

标签: c++ stl heap priority-queue


【解决方案1】:

让我们看看标准的要求:

[priqueue.cons.alloc]/4:

template <class Alloc> priority_queue(const Compare& compare, const Container& cont, const Alloc& a);

效果:用cont作为第一个参数,a作为第二个参数初始化c,用compare初始化comp致电make_heap(c.begin(), c.end(), comp)

[强调添加]

同样,在 [priqueue.members]/1:

void push(const value_type&amp; x);

效果:好像是:
c.push_back(x);
push_heap(c.begin(), c.end(), comp);

[强调添加]

...等等。

总结

priority_queue 是根据对集合应用堆操作来定义的。

【讨论】:

    【解决方案2】:

    在内部,priority_queue 中的元素存储为堆。 Jerry Coffin 的回答提供了保证这一点的规范中的确切措辞。

    但是,每当您从队列中删除一个元素时,它都会从堆中删除最大的元素并将其返回给您,因此您看到的顺序与元素最初排序的顺序不同。

    从这个意义上说,internal 堆排序是存在的,因此队列可以有效地生成按排序顺序的元素的 external 排序。堆只是一个原则上你不应该看到的实现细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2016-07-05
      • 2010-10-19
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      相关资源
      最近更新 更多