原理:
为了达到大的压缩率,以字符的使用频率作为权值构造一颗哈夫曼树,然后利用哈夫曼树对字符进行编码。
步骤:
①按照频率从小到大的顺序进行排列;
②每次从中选择出两个概率为最小的节点相加,形成一个新的节点,构造一个称为“Huffman树”的二叉树;
③对这个二叉树进行编码
例:对数据序列aaaa bbb cc d eeee fffffff
其概率分布为:a:4/22 b:3/22 c:2/22 d:1/22 e:5/22 f:7/22
概率大小的排序为:d, c, b, a, e, f
按步骤构造出二叉树即可:
这种方法是学《数字图像处理》时老师讲的,跟数据结构中提及的可能有一点点子不太一样,但是原理还是一样的,我个人认为这样构造二叉树更加方便,看到的同学可以了解一下哦~
求压缩比:
已知某文档仅包含6种不同的字符,其每个字符出现的频率如下表所示,采用霍夫曼编码对该文档压缩存储,则单词“face”的编码为( ),该文档的压缩比为( )。
1):【A】110001001101 【B】101000010100 【C】001101001100 【D】110101001100
(2):【A】20% 【B】25% 【C】30% 【D】40%
1)构造哈夫曼树,编码
将频率排序后,依次将频率最小的两个节点相加
得到face的编码为:1100 0 100 1101 选答案A
需要注意,两个节点之间频率较大的那个分支为1,哈夫曼树构造好了之后从右往左看得到编码(这个哈夫曼树就相当于向右旋转了90度的二叉树)
2)计算压缩比
1. 2^2=4,2^3=8,所以6个字符最少需要3位二位进数表示,即每个字符用三位表示
2. 按照出现频率计算加权平均长度:字符位数 * 出现频率
a的位数 * 45% + b的位数 * 13% + c的位数 * 12% + d的位数 * 16% + e的位数 * 9%+ f的位数 * 5%
= 1 * 45% + 3 * 13% + 3 * 12% + 3 * 16% + 4 * 9%+ 4 * 5%
= 2.24位
3. 计算压缩比
未压缩长度为 3 ,压缩后平均长度为 2.24
(3 - 2.24)/3 ≈ 25%
选答案B