您的位置:首页 > 理论基础 > 数据结构算法

sdutoj 3345 数据结构实验之二叉树六:哈夫曼编码

2016-06-07 14:41 260 查看
题目链接:点击打开链接

题目描述

字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%~90%之间。你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼编码长度的比值。

输入

 输入数据有多组,每组数据一行,表示要编码的字符串。

输出

 对应字符的ASCII编码长度la,huffman编码长度lh和la/lh的值(保留一位小数),数据之间以空格间隔。

示例输入

AAAAABCD
THE_CAT_IN_THE_HAT


示例输出

64 13 4.9
144 51 2.8

ps:因为每次都要更新排序,所以用的multiset存的

<span style="font-size:18px;">///数据结构实验之二叉树六:哈夫曼编码
#include <iostream>
#include<cstdio>
#include<set>
#include<algorithm>
#include<cstring>

using namespace std;
char a[100000];
char b[1000];
int main()
{
while(cin>>a)
{
int len=strlen(a);
int n=len*8;
memset(b,0,sizeof(b));
for(int i=0; i<len; i++)
{
b[(int)a[i]]++;
}

multiset<int >q;
multiset<int >::iterator cp;

for(int i=0; i<=500; i++)
{
if(b[i]!=0)
{
q.insert(b[i]);
}
}
int x1,x2;
int k=0;
while(!q.empty())
{
x1=*(q.begin());
q.erase(q.begin());
if(!q.empty())
{
x2=*(q.begin());
q.erase(q.begin());
q.insert(x1+x2);
k=k+(x1+x2);
}
}
double mn;
mn=(double)n/k;
printf("%d %d %.1lf\n",n,k,mn);
}
return 0;
}
</span>



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: