题目描述
字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%~90%之间。你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼编码长度的比值。
输入
输出
示例输入
AAAAABCD THE_CAT_IN_THE_HAT
示例输出
64 13 4.9144 51 2.8
#include <stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; char Tree[500];//字符串 int num[500];//统计字符个数 /*bool cmp(int x,int y)//将字符串个数s升序排序 {return x<y; }
*/ int main() {while(~scanf("%s",Tree)){int l;l=strlen(Tree);int sum=0,sum1=0;//哈弗曼码数 //ASCLL编码数量sum1=l*8;int queue[100];//用一个队列来保存数组中相加的数int k=0,count=0;memset(num,0,sizeof(num));//将计数的数组初始化全部为0;for(int i=0;i<l;i++)//统计字符个数num[Tree[i]]++;for(int i=0;i<500;i++)//将字符个数保存起来if(num[i]!=0)queue[k++]=num[i];while(k-count>=2) //注意边界循环条件最小生成树的条件;{sort(queue+count,queue+k);//排序的范围将字符个数升序排列;int a=queue[count];count++;int b=queue[count];count++;queue[k++]=a+b;sum+=a+b;}printf("%d %d %.1lf\n",sum1,sum,(sum1*1.0)/(sum*1.0));//输出时强制类型转换}return 0; }
#include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; int main() { int num[500]; char s1[500]; while(~scanf("%s",s1)) { priority_queue<int,vector<int>,greater<int> >q; int l=strlen(s1); int sum=0,sum1=l*8; memset(num,0,sizeof(num)); for(int i=0;i<l;i++) num[s1[i]]++; for(int i=0;i<500;i++) if(num[i]) q.push(num[i]); while(q.size()>=2) { int a=q.top(); q.pop(); int b=q.top(); q.pop(); q.push(a+b); sum+=a+b; } printf("%d %d %.1lf\n",sum1,sum,sum1*1.0/sum); } }