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

it2024-11-08  16

哈夫曼编码方法:

统计字符集中每个字符在电文中出现的平均频率(概率越大,要求编码最短)利用哈夫曼树的特点:权越大的叶子离根越近在哈夫曼树的每个分支上标上0,1。结点左分支为0,右分支为1,把从根到每个叶子的路径上的标号连接起来,作为该叶子代表的编码。

规律: 哈夫曼树的编码长度等于各个叶节点权值与路径长度乘积之和,同时这个值等于非叶节点之和。

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

Input 输入数据有多组,每组数据一行,表示要编码的字符串。 Output 对应字符的ASCII编码长度la,huffman编码长度lh和la/lh的值(保留一位小数),数据之间以空格间隔。 Sample Input AAAAABCD THE_CAT_IN_THE_HAT Output 64 13 4.9 144 51 2.8 优先队列实现 示例:将元素5,3,2,4,6依次push到优先队列中,print其输出。

标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。 priority_queue< int > pq;

通过<操作符可知在整数中元素大的优先级高。 故示例1中输出结果为: 6 5 4 3 2

数据越小,优先级越高 priority_queue<int, vector<int>, greater<int> >pq;

其中 第二个参数为容器类型。 第三个参数为比较函数。 greater 表示T类型>运算。 和代码中的自定义cmp函数效果一样。 故示例2中输出结果为:2 3 4 5 6

第二个样例截图:

#include <bits/stdc++.h> using namespace std; int pp[10086]; char str[10086]; int n,i; int main() { while(scanf("%s",str)!=EOF) { memset(pp,0,sizeof(pp)); priority_queue<int,vector<int>,greater<int> >Q; int len = strlen(str); for(i=0;i<len;i++) { pp[str[i]]++; } for(i=0;i<140;i++) { if(pp[i]) { Q.push(pp[i]); } } int sum=0; while(!Q.empty()) { int ans = 0; int a = Q.top(); Q.pop(); if(!Q.empty()) { int b = Q.top(); Q.pop(); ans += a+b; sum+=ans; Q.push(ans); } } cout<<len*8<<" "<<sum<<" "<<setprecision(2)<<len*1.0*8/sum<<endl;//一个字符占8个bits } return 0; }

参考博客: https://blog.csdn.net/zheng__jun/article/details/52154921

最新回复(0)