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;
}