Min Heap使用STL Priority Queue解释

时间:2016-04-04 01:49:42

标签: c++ data-structures stl

我对C ++很新,我试图在C ++中使用Priority Queue STL实现Min Heap。我环顾网络,偶然发现了一个代码,我在底部添加了链接。

我理解矢量是如何工作的,我也理解了算子是什么,但是我不能理解如何回归i> j'在从最小到最大的元素排列中发挥作用。

我会在这里发布代码。

#include <queue>
#include <iostream>

using namespace std;

struct comparator {
     bool operator()(int i, int j) {
     return i > j;
    }
};

int main(int argc, char const *argv[])
{
     priority_queue<int, std::vector<int>, comparator> minHeap;

    minHeap.push(10);
    minHeap.push(5);
    minHeap.push(12);
    minHeap.push(3);
    minHeap.push(3);
    minHeap.push(4);

    while (!minHeap.empty()) {
    cout << minHeap.top() << " ";
    minHeap.pop();
    }
    return 0;
}

有人可以跟踪程序的执行情况吗?我一直试图了解这个程序在过去几个小时里是如何运作的,但没有运气。

我从here

获得了代码

1 个答案:

答案 0 :(得分:0)

根据给定的标准,优先级队列第一个元素始终是它包含的最大元素。这个标准是你的仿函数comparator。在这种情况下,它定义了对于两个给定元素,次要元素应该是第一个。

因此,在您的代码中,如果我们提取所有元素,则输出将是最小到最大的元素:

while (!minHeap.empty()) {
   cout << minHeap.top() << " ";
   minHeap.pop();
}
//output: 3,3,4,5,10,12

推送元素的算法就像堆:

  1. 将新元素放在数组中的下一个可用位置。 (树的下层)
  2. 使用提供的仿函数(comparator)将新元素与其父元素进行比较。在这种情况下,你比较是“如果 新元素较小“,然后将其与其父元素交换。
  3. 继续此过程,直到:
    • 新元素的父元素小于或 等于新元素,或
    • 新元素到达根目录(索引0) 数组)
  4. 也许更清楚地看到算法如何使用一个可视化的例子:想象一下,你已经推动了数字6,3,5,9,现在你推了2。 enter image description here