霍夫曼树之计算压缩比

昨天做了那道霍夫曼树的题目(HDU1053)之后,发现如果只需要计算编码后的长度则无需真正建树.

#include <algorithm>
using namespace std;

char buffer[1024]={0};
int q[1024]={0};

int main()
{
    while(scanf("%s",buffer)!=EOF && strcmp("END",buffer)!=0)
    {
        int huff[255]={0},len=0,ans=0;
        for(int i=0;i<strlen(buffer);i++)
        {
            if(buffer[i])
            {
                huff[buffer[i]]++;
            }
        }
        int h=0,f=0;
        for(int i=0;i<255;i++)
        {
            if(huff[i])
            {
                q[f++]=huff[i];
            }
        }
        
        if(f-h==1)
        {
            ans=q[h];
        }
        
        while(f-h>1)
        {
            sort(&q[h],&q[h]+(f-h));
            int tmp=0;
            for(int i=0;i<2;i++)
            {
                tmp+=q[h++];
            }
            q[f++]=tmp;
            ans+=tmp;
        }
        printf("%d %d %.1lf\n",strlen(buffer)*8,ans,strlen(buffer)*8.0/ans);
    }
    return 0;
}

 

附上HDU 2527 AC Code:

#include <algorithm>
#include <functional>
#include <set>
using namespace std;

char buffer[10240]={0};
int n;

int huffman(char* str,int clen)
{
    int count[255]={0};
    multiset<int> que;
    for(int i=0;i<strlen(str);i++)
    {
        count[str[i]]++;
    }
    for(int i=0;i<255;i++)
    {
        if(count[i])
        {
            //printf("%c:%d\n",i,count[i]);
            que.insert(count[i]);
        }
    }
    
    if(que.size()==1)
    {
        return *que.begin();
    }
    else
    {
        int sum=0;
        while(que.size()>1)
        {
            int tmp=0;
            for(int i=0;i<clen;i++)
            {
                tmp+=*que.begin();
                que.erase(que.begin());
            }
            que.insert(tmp);
            sum+=tmp;
        }
        return sum;
    }
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            int a;
            scanf("%d",&a);
            scanf("%s",buffer);
            printf("%s\n",huffman(buffer,2)<a?"yes":"no");
        }
    }
    return 0;
}
posted @ 2012-07-03 16:34  Eslizn  阅读(843)  评论(0编辑  收藏  举报