概述:一个字符用8位表示,给出一个字符串,求出这个字符串的所占的位和压缩后所占的位以及压缩比。
思路:哈夫曼树问题,建立哈夫曼模型,求解即可。
感想:这题真的好难好难,自己做根本做不出来,后来问了其他同学,才知道这是个哈夫曼树的典型例题,当时一听就蒙了,这是个什么东东??于是我查询了一下资料并且上网学习了一下才豁然开朗。。哎,学无止境。
#include<string>
#include<cstdio>
#include<iostream>
#include<queue>
#include<functional>
using namespace std;
string s;
int str[1000];
priority_queue<int,vector<int>,greater<int> >Q;
int main()
{
int i,sum;
while(cin>>s&&s!="END")
{
while(!Q.empty())
Q.pop();
for(i=0;i<s.length();i++)
str[s[i]]++;
for(i=0;i<200;i++)
{
if(str[i])
Q.push(str[i]);
str[i]=0;
}
sum=0;
while(Q.size()>1)
{
int keyOne=Q.top();
Q.pop ();
int keyTwo=Q.top();
Q.pop();
sum+=keyOne+keyTwo;
Q.push(keyOne+keyTwo);
}
if(sum==0)
sum=s.length();
printf("%d %d %.1f\n",8 * s.length(),sum,double((double)8 * s.length() / sum));
}
return 0;
}