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
哈夫曼编码就是将所有的字符各自出现的次数罗列出来按从小到大排序,每次都将最小的两个数相加得a,此时sum=sum+a,(sum初始值为0),然后将a代替原来的两个最小值填入数组,重新从小到大排序,进行相同的操作,知道数组中只剩下最后一个数为止。
代码:
#include <bits/stdc++.h> using namespace std; int cnt, k, n; char a[51]; int main() { while(~scanf("%s", a)) { int la = 0, lh = 0; int len = strlen(a); la = len * 8; int b[500], i, quee[500]; memset(b, 0, sizeof(b)); for(i=0; i<len; i++) //记录每个字符出现的次数; { b[a[i]]++; } int k = 0, g = 0; for(i=0; i<500; i++) //把所有的次数重新存一个数组,目的是将原来为空项去除; { if(b[i]!=0) { quee[k++]=b[i]; } } while(k-g>1) //当循环到仅剩一个数的时候停止 { sort(quee+g, quee+k); quee[g+1]=quee[g]+quee[g+1]; lh=lh+quee[g+1]; g++; } printf("%d %d %.1lf\n", la, lh, (la+0.0)/(lh+0.0)); } return 0; }