数据结构实验之二叉树六:哈夫曼编码
Time Limit: 1000MS
Memory Limit: 65536KB
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
#include <bits/stdc++.h>
using namespace std;
char tree[500];
int counter[500];
int main()
{
while(~scanf("%s",tree))
{
int a[500];
int k=0,t=0,i,x,y,len;
int s1=0;
int s2=0;
len = strlen(tree);
s1 = 8*len;
memset(counter,0,sizeof(counter));
for(i=0;i<len;i++)
{
counter[tree[i]]++;
}
for(i=0;i<500;i++)
{
if(counter[i]!=0)
{
a[k++] = counter[i];
}
}
while(k-t>=2)
{
sort(a+t,a+k);
x = a[t++];
y = a[t++];
a[k++] = x+y;
s2 += x + y;
}
printf("%d %d %.1lf\n",s1,s2,double((s1+0.0)/(s2+0.0)));
}
return 0;
}