哈弗曼树及编码
哈弗曼树算法
第一步:
初始化n个单节点的树,并为它们表上字母中的字符。把每个字符的概率记在树的根中,用来指出树的权重(更一般地说,树的权重等于树中所有叶子的概率之和)。
第二部:
重复下面的操作,直到只剩下一颗单独的树。找到两颗权重最小的树(对于权重相同的树,可任意选择其一)。把它们作为新树中的左右子树,并把其权重之和作为新的权重记录在新树的根中。
上面的算法构造的树称为哈弗曼树,它按照刚才的描述定义了一套哈夫曼编码。
例:
字符 | A | B | C | D | _ |
---|---|---|---|---|---|
出现概率 | 0.35 | 0.1 | 0.2 | 0.2 | 0.15 |
代码字 | 11 | 100 | 00 | 01 | 101 |
因此,DAD被编码为011101,而10011011011101编码以后就是BAD_AD。
构造哈弗曼编码树的一个例子图:
在这套编码中,每个字符的平均位长是
可见,我们可以指望一个文本的哈夫曼编码要比其定长编码少占用25%的存储空间。
哈夫曼编码是一种最重要的文件压缩方法。
例图:
问题a
对于下面的数据构造一套哈弗曼编码:
字符 | A | B | C | D | _ |
---|---|---|---|---|---|
出现概率 | 0.4 | 0.1 | 0.2 | 0.15 | 0.15 |
答案a
问题b
用a中的编码对文本ABACABAD进行编码。
答案b
问题c
对于100010111001010用a中的编码进行解码
答案c
小结:
哈弗曼树是一颗二叉树,它使得从根出发到包含一组预定义权重的叶子之间的加权路径长度达到最小。
哈弗曼树最重要应用是哈弗曼编码。
哈弗曼编码是一种最优的自由前缀变长编码方案,它基于字符在给定文本中的出现频率,把位串赋给字符。这是通过贪心思想构造一颗二叉树来完成的,二叉树的叶子代表字母表中的字符,而树中的边则标记为0或者1。
来源:CSDN
作者:Rp_
链接:https://blog.csdn.net/weixin_41738030/article/details/89402695