前言
假设需要在计算机中保存一段由a,b,c,d,e,f组成的长字符串,最直接的编码方式为将a,b,c…一次编码为000,001,010,011,100,101,即每个字符的编码长度都相等为3。那么则需要保存
3
∗
1
0
6
3*10^6
3∗106位0或1。这样的编码方式被称为固定长度编码
。那么是否存在更加节省空间的编码方式?
Huffman Coding
可变长度编码
如果我们可以提前统计这段长字符串中各个字符出现的次数,那么比较直接的想法是:为出现次数较多的字符对应更短的编码长度,而对出现次数少的字符使用较长的编码就可以有效地缩短总的编码长度。这种编码方式被称为可变长度编码
。
- 注:可变长度编码必须满足一个条件’前缀编码’,即没有一个编码是其他编码的前缀(防止出现歧义)。
Huffman Coding
那么如何获得每个字符的编码呢?
- 将a,b,c,d,e,f 按照出现次数从小到大排列在队列中(单位:千次)
- 将队列中第一位取出作为一个二叉树的左子节点,第二位作为右子节点,将左右子节点的频数相加作为根子节点的频数
- 将Z重新放回队列中(仍保持频次从小到大),再取出最小的两位取出作为新节点的左右子节点,相加后作为根节点的频次,再次插入队列
- 重复循环获得完整的二叉树
- 以二叉树路径,按照左0右1的规则获得不同字符的编码。以上方的二叉树为例,获得的编码为:
- a:0
- b:101
- c:100
- d:111
- e:1101
- f:1100
结语
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码(实际上也是所需存储空间最少的编码方式),一般就叫做Huffman编码(有时也称为霍夫曼编码)。
参考视频:
https://www.bilibili.com/video/BV18V411v7px/?spm_id_from=333.337.search-card.all.click&vd_source=061f796607009d1b58b8851972722015