#include<bits/stdc++.h>
using namespace std;
int main()
{
string a;
int la,lh;
int v[1000];
while (cin>>a)
{
memset(v,0,sizeof(v));
la=8*a.size();//ASCII编码为定长编码,约定用一个ASCII码值占一个字节(8个二进制位);
priority_queue<int,vector<int>,greater<int> > q;
//优先队列,优先队列不是按照入队的顺序出队,而是按照队列中元素的优先权顺序
//出队(默认为大者优先,也可以通过指定算子来指定自己的优先顺序)。
for (int i=0;i<a.length();i++)
{
v[a[i]]++;
}
for (int i=0;i<200;i++)
{
if (v[i]!=0)
q.push(v[i]);
}
lh=0;//赫夫曼编码长度即为树的带权路径长度,搞清楚赫夫曼树、赫夫曼编码的解释
while (!q.empty())
{
int n=q.top();
q.pop();
if (!q.empty())
{
int m=q.top();
q.pop();
lh+=n+m;
q.push(n+m);
}
}
printf("%d %d %.1lf\n",la,lh,la*1.0/lh);
}
return 0;
}
3345 数据结构实验之二叉树六:哈夫曼编码
最新推荐文章于 2018-10-12 21:12:30 发布