【发布时间】:2016-05-07 15:14:42
【问题描述】:
我正在处理优先级队列,我想检查在弹出操作期间如何维护堆属性。这是我的代码。
#include <iostream>
#include <queue>
using namespace std;
class g {
public:
bool operator() (int a, int b) {
cout<<a<<" "<<b<<endl;
return (a > b);
}
};
int main() {
priority_queue<int,vector<int>,g> p;
p.push(2);
cout<<"CHECK1"<<endl;
p.push(4);
cout<<"CHECK2"<<endl;
p.push(8);
cout<<"CHECK3"<<endl;
p.push(1);
cout<<"CHECK4"<<endl;
while(!p.empty()) {
cout<<p.top()<<endl;
p.pop();
}
}
输出是
CHECK1
2 4
CHECK2
2 8
CHECK3
4 1
2 1
CHECK4
1
8 2
2 4
2
4 8
4
8
这是构建的二进制堆:
1
2 8
4
我看到当 1 被弹出时,它被替换为 4,然后 2 被替换为 4 以维护堆属性和二进制堆
2
4 8
然后在弹出 2 时将 8 替换为 2,然后将 4 替换为 8 以保持堆属性,然后在弹出 4 时将 4 替换为 8,最后弹出 8。因此,根据我的输出是
CHECK1
2 4
CHECK2
2 8
CHECK3
4 1
2 1
CHECK4
1
4 2
2 8
2
8 4
4
8
我哪里错了?
【问题讨论】:
-
我不清楚你的问题是什么。您是否尝试实现最小堆?
-
是的,我为 minheap 编写了代码并得到了我首先编写的输出。但我不明白那个输出是怎么来的,并期望我最后给出的输出。而且我还解释了为什么我期望第二个输出。
标签: c++ stl heap priority-queue