标签:哈夫曼树
优先队列实现完整哈夫曼树,一大段英文都是介绍哈夫曼树的。
外面用了一个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