标签:哈夫曼树
优先队列实现完整哈夫曼树,一大段英文都是介绍哈夫曼树的。
外面用了一个pre来找parent,其实可以把这个项放入结构体中。
特别注意当有一个结点的情况不能用优先队列,另外判断下
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
#define maxn 256
struct node
{
int ch;
int num;
int depth;
}nodes[512],a,b,c;
int pre[512];
class cmp
{
public:
bool operator()(struct node a,struct node b)const
{
return a.num>b.num;
}
};
int N;
char str[10000];
int main()
{
int i,j,k,LEN,maxnum;
priority_queue<struct node,vector<struct node>,cmp> q;
while(scanf("%s",str)!=EOF)
{
if(strcmp(str,"END")==0)
break;
LEN=strlen(str);
memset(nodes,0,sizeof(nodes));
memset(pre,0,sizeof(pre));
for(i=0;i<LEN;i++)
{
if(nodes[str[i]].ch==0)
nodes[str[i]].ch=str[i];
nodes[str[i]].num++;
}
maxnum=0;
for(i=0;i<256;i++)
if(nodes[i].num)
q.push(nodes[i]),maxnum++,j=nodes[i].num;
int pos=256;
if(maxnum==1)
{
printf("%d %d 8.0\n",j*8,j);
q.pop();
continue;
}
while(q.size()>1)
{
a=q.top();
q.pop();
b=q.top();
q.pop();
pre[a.ch]=pos;
pre[b.ch]=pos;
c.num=a.num+b.num;
c.ch=pos;
pos++;
q.push(c);
}
int ans=0;
for(i=0;i<256;i++)
if(nodes[i].num)
{
maxnum=0;
k=i;
while(pre[k])
k=pre[k],maxnum++;
ans+=nodes[i].num*maxnum;
}
printf("%d %d %.1f\n",LEN*8,ans,(LEN*8+0.0)/ans);
while(!q.empty()) //清空队列
q.pop();
}
return 0;
}
POJ 1521 Entropy,布布扣,bubuko.com
标签:哈夫曼树
原文地址:http://blog.csdn.net/gg_gogoing/article/details/38658907