哈夫曼树

来源:互联网 发布:淘宝网图片保护网址 编辑:程序博客网 时间:2024/06/18 10:49
数据结构实验之二叉树六:哈夫曼编码

Time Limit: 1000MS Memory Limit: 65536KB 

Submit Statistic 

Problem Description

字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%~90%之间。你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼编码长度的比值。

Input

输入数据有多组,每组数据一行,表示要编码的字符串。

Output

对应字符的ASCII编码长度la,huffman编码长度lh和la/lh的值(保留一位小数),数据之间以空格间隔。

Example Input

AAAAABCD
THE_CAT_IN_THE_HAT

Example Output

64 13 4.9
144 51 2.8

c语音
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
void k(int a[], int l, int r)
{
    int i=l, j=r;
    int x=a[l];
    if(l>=r)
        return ;
    while(i<j)
    {
        while(i<j&&a[j]>=x)
            j--;
        a[i]=a[j];
        while(i<j&&a[i]<=x)
            i++;
        a[j]=a[i];
    }
    a[i]=x;
    k(a, l, i-1);
    k(a, i+1, r);
}
int main()
{
    char s[1010];
    int i, a[1010], sum1, sum2, b[1010];
    int x, y;
    while(~scanf("%s", s))
    {
        int n=strlen(s);
        int tail=0, top=0;
        sum1=sum2=0;
        memset(a, 0, sizeof(a));
        for(i=0; i<n; i++)
        {
            a[s[i]]++;
        }
        for(i=0; i<500; i++)
        {
            if(a[i])
              b[tail++]=a[i];
        }
        k(b, 0, tail-1);
        sum1=n*8;
        while(top<tail)
        {
            x=b[top++];
            if(top<tail)
            {
                y=b[top++];
                sum2 += (x+y);
                b[tail++]=x+y;
                k(b, top, tail-1);
            }
        }
        printf("%d %d %.1lf\n", sum1, sum2, sum1*1.0/(sum2*1.0));
    }
    return 0;
}
原创粉丝点击