数据结构实验之二叉树六:哈夫曼编码
Problem Description
字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%~90%之间。你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼编码长度的比值。
Input
Output
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;
typedef struct Tree
{
char data;
Tree *left,*right;
}*P;
char ch[128];
int a[128],b[128];
int main()
{
while(cin>>ch)
{
int len=strlen(ch);
int i,j,t,num=0;
for(i=0;i<128;i++)
{
a[i]=0;
}
for(i=0;i<len;i++)
{
a[ch[i]]++;
}
for(i=0;i<128;i++)
{
if(a[i]!=0)
{
b[num++]=a[i];
}
}
int sum=0,k=0;
while(k<num-1)
{
/*for(i=k;i<num-1;i++)
{
for(j=k;j<num-i-1;j++)
{
if(b[j]>b[j+1])
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
for(i=k;i<num;i++)
{
cout<<b[i]<<" ";
}*/
sort(b+k,b+num);
int x1=b[k++];
int x2=b[k++];
b[num++]=x1+x2;
sum+=x1+x2;
}
float x=(float)(len+0.0)*8/(sum+0.0);//强制转换
printf("%d %d %.1f\n",len*8,sum,x);
}
return 0;
}