优先队列的STL运用与哈夫曼树的实现

来源:互联网 发布:网络被运营商劫持举报 编辑:程序博客网 时间:2024/05/21 08:40

priority_queue是优先队列,简称堆,哈夫曼树的实现需要依靠于堆的操作

堆是一颗二叉树,看似队列又非队列,其具有一定的排列性,我们将从STL库中的priority_queue来进行讲解

需要使用priority_queue时候需要#include <queue> using namespace std;

创建一个优先队列的操作是priority_queue <int> q,默认是优先级高的最先进行

随后其操作有以下几种:

push(x)//在优先队列中插入数字并对其进行初始化操作(局部排序)

pop()//弹出优先队列

size() //返回堆的长度

top() //弹出优先级较高的元素


STL库中还有一个定义方式

priority_queue <int,vector<int>,greater <int> > q;

其实是将数字较低的转置为优先级高的从而实现STL库的使用

其中如果int改为char,double,float等,那么相应地vector中的元素也需要进行相应的改变


我们都直到哈夫曼树是最优二叉树的一种通俗叫法,我们利用STL库的堆的操作来对其进行代码的撰写

常用的例子有搬东西的例子

也就是说有1,2,8,10斤大米,每斤大米对应的体力值是1,如何搬运消耗的体力值最少

我们首先选取1,2,可以得到树的权为3,随后在3,8,10中选择,其中3+8<3+10<8+10,故选择3和8,得到11,随后搬运11和10,得到权数是20,体力值是其之和,同时也是消耗体力最少的方法,如下我们将给出代码

#include <iostream>
#include <queue>
using namespace std;
priority_queue <int,vector<int>,greater <int> > q;
int main()
{
int n;
int ans=0,x,y,temp;//ans代表权值
cin>>n;//输入个数
for(int i=0;i<n;i++)
{
cin>>temp;//输入权数
q.push(temp);
}
while(q.size()>1)//必须有两个元素才可以对其进行操作
{
x=q.top();
q.pop();
y=q.top();
q.pop();
q.push(x+y);
ans=x+y;
}
cout<<x+y<<endl;
return 0;
}