数据结构实验之二叉树六:哈夫曼编码

痞子三分冷 提交于 2020-02-22 12:31:04

Description

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

Input

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

Output

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

Sample

Input 

AAAAABCD

THE_CAT_IN_THE_HAT

Output 

64 13 4.9

144 51 2.8

Hint

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    char str[1000];
    while(scanf("%s",str)!=EOF)
    {
        char s[1000];
        int sn[1000]={0};
        int len=strlen(str);
        int k=0;
        for(int i=0; i<len; i++)
        {
            int flag=0;
            for(int j=0; j<k; j++)
            {
                if(str[i]==s[j])
                {
                    sn[j]++;
                    flag=1;
                    break;
                }
            }
            if(flag==0)
            {
                s[k]=str[i];
                sn[k]++;
                k++;
            }
        }
        int num=k;
        int sum=0;
        for(int i=0; i<k-1; i++)
        {
            sort(sn,sn+num,cmp);
            sn[num-2]+=sn[num-1];
            sum+=sn[num-2];
            num--;
        }
        double r=len*8.0/sum;
        printf("%d %d %.1lf\n",len*8,sum,r);
    }

    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!