出险原因
这篇博客就介绍一下最基本的压缩编码方法——赫夫曼编码
原理
赫夫曼编码的原理是赫夫曼树,这里我们先介绍赫夫曼树。
从数中一个节点到另一个节点之间的分支构成两个节点之间的路径,路径上的分支数目就是路径长度。
树的路径长度就是从树根节点到每一节点的路径长度之和。
例如:
二叉树a中根节点到节点D的路径长度为4.
二叉树的路径长度为:1+1+2+2+3+3+4+4=20.
节点的带权路径长度为从该节点到树根之间的路径长度与节点上权的乘积。
同理,树的带权路径长度为树中所有叶子节点的带全路径长度之和。
其中带权路径长度QPL最小的二叉树称为赫夫曼树(最优二叉树)。
二叉树a的WPL=5*1+15*2+40*3+30*4+10*4=315
构造哈夫曼树
- 先把有权值的叶子节点按照从小到大的顺序排列成一个有序序列:
- 取头两个最小权值的结点作为一个新节点N1的两个子节点,注意相对较小的是左孩子:
- 将15代替5和10,依旧按照从小到大的顺序排列:
- 重复步骤2,直到排列完成为止。
步骤总结:
- 根据节点的权值按从小到大排列节点的顺序。
- 合并两个最小的权值。
- 新合成的节点代替两个最小的权值进行按从小到大排列节点。
- 重复2-3直到排列完成。
赫夫曼编码
赫夫曼编码为了解决当年远距离通信的数据传输最优化问题。
比如传输队列为:
BADC-ADFE-ED
使用而二进制表示:
这样传输的真正编码为:
001-000-011-010-000-100-101-100-100-011
若要设置长度不等的编码,则必须保证任一字符的编码不是另一个字符的编码的前缀,这种编码称做前缀编码。