1. 编码含义
编码:给每一个对象标记一个二进制位串来表示一组对象。例:ASCII,指令系统。
2. 编码分类
- 等长编码:表示一组对象的二进制位串的长度相等
- 不等长编码:表示一组对象的二进制位串的长度不相等
3. 编码问题
- 等长编码什么情况下空间效率高?
等长编码越短,占据空间越小 - 不等长编码什么情况下空间效率高?
出现频率高的采用比较短的编码,出现频率低的采用比较长的编码。参考霍夫曼树的特性,符合霍夫曼树的性质的二叉树,即WPL最小权值路径条件的就是最短编码空间的占用情况,也是不等长编码最优的空间效率使用。 - 不等长编码如何保证解码的唯一性?
编码不重复,没有二义性。参考霍夫曼树的特性,树干即编码,路径长度即编码长度,根据二叉树特性通过树干路径进行编码,它构成前缀编码的形式,即一组编码中任一编码都不是其他任何一个编码的前缀,前缀编码保证了在解码时不会出现有多种可能的情况,能够保证编码的唯一性。
等长编码和不等长编码的对比
编码分类 | 空间效率 | 优点 | 不足 |
---|---|---|---|
等长编码 | 等长编码越短,占据空间越小,空间效率利用最高 | 字符编码等长 | 不支持前缀编码方式 编码长度随字符数量膨胀剧增 |
不等长编码 | 出现频率高的采用比较短的编码,出现频率低的采用比较长的编码,空间利用效率最高 | 空间占用小 | 编码不等长 |
3.1 等长编码
如上图,若按照等长编码形式进行编码则可得到如下:
字符 | 等长编码值 |
---|---|
A | 000 |
B | 001 |
C | 010 |
D | 011 |
E | 100 |
F | 101 |
G | 110 |
H | 111 |
在数据传输格式上,等长编码需要进行分割,例如,ABC则用000,001,010表示,或用000 001 010表示,以上缺点是分隔符占用额外空间,且A到H共8个字符中如A可用二进制0表示,而不需要000,因此也是浪费空间,以此类推其他字符二进制表示方法的空间占用。
3.2 不等长编码
若要提高空间利用率减少空间占用,可以从减少额外分隔符、压缩单个字符不等长编码表示方式等入手,可优化如下:
字符 | 不等长编码值 |
---|---|
A | 0 |
B | 1 |
C | 10 |
D | 11 |
E | 100 |
F | 101 |
G | 110 |
H | 111 |
若按照不等长编码方式去除分隔符的话,则编码出现不唯一情况,如表示ABC为0110,按照不等长编码值可有如下结果,即解密出现多种情况。
解密可能的字符值 | 编码值 |
---|---|
AG | 0 110 |
ABC | 0 1 10 |
ADA | 0 11 0 |
总结可知,等长编码无法实现编码压缩节约空间的目的,且需要间隔来避免编解码不唯一的问题。
3.3 哈夫曼编码
有没有可以压缩字符编码、不需要额外分隔符、解码保证唯一性的编码方式呢?
答案就是 ———— 哈夫曼树编码
如有 {A、B、C、D、E、F、G} 字符,出现次数为 {9、5、2、3、11、7、8} ,我们将字符出现次数设置为哈夫曼树中权值结点的权值,此时权值结点即字符,然后根据概念进行哈夫曼树的构建(哈夫曼树具体构建方式可点击此处)如下:
如上图,可得到字符与编码值的对应表如下:
字符 | 不等长编码值 |
---|---|
A | 00 |
B | 010 |
C | 0110 |
D | 0111 |
E | 10 |
F | 110 |
G | 111 |
我们再来按照去除分隔符的方式表示ABC,则为 000100110
解密可能的字符值 | 编码值 |
---|---|
ABC | 00 010 0110 |
以上只有一种解码可能,所以是解码具有唯一性,没有存在二义性,是可靠的。
不难发现,无论是从Root根结点到权值子结点,还是从权值子结点到Root根结点的编码,A至G的不等长编码值中任一字符的编码都不是其它字符的编码的前缀,满足该情况的编码则认为具有前缀编码特性,哈夫曼树编码则拥有该特性。
4. 编码压缩
上面我们了解了哈夫曼编码 ,下面来看看它是如何对编码进行压缩来减少空间占用的。示例对字符 ABCDEFG 进行二进制编码,如下
编码形式 | 分隔符 | 编码值 | 编码可靠 | 占位 |
---|---|---|---|---|
等长编码 | 有 | 000,001,010,011,100,101,110 | 唯一无二义性 | 27 |
不等长编码 | 有 | 0,1,10,11,100,101,110 | 唯一无二义性 | 21 |
不等长编码 | 无 | 011011100101110 | 不唯一有二义性 | 15 |
ASCII码 | 有 | 01000001 01000010 01000011 01000100 01000101 01000110 01000111 | 唯一无二义性 | 61 |
哈夫曼编码 | 无 | 000100110011110110111 | 唯一无二义性 | 21 |
5. 总结
哈夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就称Huffman编码。在变字长编码中,如果码字长度严格按照对应符号出现的概率大小逆序排列,则其平均码字长度为最小。
6. 参考
https://baike.baidu.com/item/%E5%93%88%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81
https://www.cnblogs.com/hujiapeng/p/6208843.html
https://blog.csdn.net/xgf415/article/details/52628073
https://www.bilibili.com/video/BV1ke411s7Nk
https://blog.csdn.net/u013161278/article/details/111942554