哈夫曼编码
• 编码
普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit
• 变长编码
变长编码比固定编码好一些,即对频率高的字符赋以短编码,对频率低的字符赋以长编码。
|
a |
b |
c |
d |
e |
f |
频率 |
45 |
13 |
12 |
16 |
9 |
5 |
固定 |
000 |
001 |
010 |
011 |
100 |
101 |
变长 |
0 |
101 |
100 |
111 |
1101 |
1100 |
• 前缀编码
即较短的编码不能是任何较长的编码的前缀,这样解析的时候才不会混淆
• 前缀码生成方式(二叉树)
把要编码的字符放在二叉树的叶子上,所有的左节点是0,右节点是1,从根浏览到叶子上,因为字符只能出现在树叶上,任何一个字符的路径都不会是另一字符路径的前缀路径,符合前缀原则编码就可以得到。
• 压缩效率
• 可以看出,构造更优的二叉树,原则就是权重越大的叶子,距离根应该越近,而我们的终级目标是生成“最优”的二叉树,最优二叉树必须符合下面两个条件:
所有上层节点都大于等于下层节点。
某节点,设其较大的子节点为m,较小的子节点为n,m下的任一层的所有节点都应大于等于n下的该层的所有节点。
• 从各个节点中找出最小的两个节点,给它们建一个父节点,值为这两个节点之和。
• 从节点序列中去除这两个节点,加入它们的父节点到序列中。
• 重复上面两个步骤,直到节点序列中只剩下唯一一个节点。这时一棵最优二叉树就已经建成了,它的根就是剩下的这个节点。
• 列出原始的节点数据
• 将最小的两个节点C和E结合起来
• 再将新的节点和A组合起来
• 再将D节点加入