数据结构实验之二叉树六:哈夫曼编码
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
字符的编码方式有多种,除了大家熟悉的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
#include<bits/stdc++.h> using namespace std; struct node { int num; char data; }; int main() { char s[1000]; while(cin>>s) { int x=0; int flag; int la; int lh=0; int len=strlen(s); int temp1,temp2; priority_queue<int ,vector<int>,greater<int> >q; la=8*len; printf("%d ",la); node a[1000]; for(int i=0;i<1000;i++) { a[i].num=0; } a[0].data=s[0]; a[0].num++; x++; for(int i=1;i<len;i++) { flag=0; for(int j=0;j<x;j++) { if(s[i]==a[j].data) { a[j].num++; flag=1; break; } } if(!flag) { a[x].data=s[i]; a[x].num++; x++; } } for(int i=0;i<x;i++) q.push(a[i].num); while(!q.empty()) { temp1=q.top(); q.pop(); if(q.empty())break; else { temp2=q.top(); lh+=temp2+temp1; q.pop(); q.push(temp1+temp2); } } printf("%d ",lh); printf("%.1f\n",la*1.0/lh); } }