//目录

Poj(1521),哈夫曼编码

题目链接:http://poj.org/problem?id=1521

这里,网上有很多博客都有写,很多人没有建树,直接就是求一下这个哈夫曼编码的长度,的确很巧妙,我也用的这个方法,但是,几乎所有博客都没有解释sum+=a+b;这个的原因。也许是我太菜了吧,脑子转不过来,好久才想通。

比如说B,C,D出现2次,BC组成一个新的节点,4+2=6,组成一个新的节点6,6+A就是结果。

原因是:

sum+=2+2;

sum+=4+2;

sum+=6+5;

理由是,B,C分别编码是3位,这里依次加到了sum里面,位数就是2*3;

代码都差不多,主要是这两种的转换。

#include <stdio.h>
#include <queue>
#include <string.h>

using namespace std;

char str[1000];
int num[1000];

int main()
{

    while(scanf("%s",str))
    {

        memset(num,0,sizeof(num));
        if(!strcmp(str,"END"))
            break;

        int len = strlen(str);

        for(int i=0;i<len;i++)
            num[str[i]]++;

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

        for(int i=0;i<1000;i++)
        {
            if(num[i])
                Q.push(num[i]);
        }

        int sum = 0;
        while(Q.size()>1)
        {
            int a,b;
            a=Q.top();
            Q.pop();
            b=Q.top();
            Q.pop();
            sum+=a+b;
            Q.push(a+b);
        }
        if(sum==0)
            sum =len;
        printf("%d %d %.1f\n",len*8,sum,double(8*len)/sum);

    }
    return 0;
}

 

posted @ 2016-07-28 22:50  小草的大树梦  阅读(682)  评论(0编辑  收藏  举报