Entropy
题意
题目描述较长,其实意思就是输入一个字符串,分别用普通ASCII编码(每个字符8bit)和Huffman编码,输出编码后的长度,并输出压缩比。
代码
#include<iostream>
#include<queue>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
string s;
priority_queue< int,vector<int>,greater<int> > Q;
while(getline(cin,s)&&s!="END"){
int t=1;
sort(s.begin(),s.end()); //先排序,确保相同字符相邻
for(int i=0;i<s.length();i++){
if(s[i]!=s[i+1]){
Q.push(t);
t=1;
}
else{
++t;
}
}//统计每个字符出现的频次,并放进优先队列
int ans=0;//ans为Huffman编码总长度
if(Q.size()==1) ans=Q.top();//不要忘了只有1个的情况
while(Q.size()>1){
int a=Q.top();Q.pop();
int b=Q.top();Q.pop();//提取队列最小的两个
Q.push(a+b);
ans += (a+b);
}
Q.pop();
printf("%d %d %.1f\n",8*s.length(),ans,8.0*s.length()/ans);
}
return 0;
}