deflate树与deflate编码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了deflate树与deflate编码相关的知识,希望对你有一定的参考价值。
关于deflate树,能搜到的资料非常少,这个概念来自gzip的压缩算法,是由huffman树转变过来的。这里简单记录下deflate树的生成过程以及deflate编码。
假设以5 8 9 10 14 15,建立一颗huffman树,可以是这个样子的:
61
/ \
27 34
/ \ / \
14 13 15 19
/ \ / \
5 8 9 10
也可以交换任意结点的两棵子树
61
/ \
34
27
/ \ / \
15 19 14 13
/ \ / \
9 10 5 8
交换的过程虽然会改变叶子结点的huffman编码,但是,不会改变huffman树的带权路径和,也不会改变每个叶子结点的编码长度。基于这一点,我们可以做个更特殊的变换,每一层,让非叶子结点排在右边,叶子结点排在非叶子结点的左边。上面这棵树的变换之后如下:
61
/ \
34
27
/ \ / \
15 14 19 13
/ \ / \
9 10 5 8
A
/ \
B
C
/ \ / \
D E F G
/ \ / \
G
H I J
A
/ \
B
C
/ \ / \
D G F E
/ \ / \
I
J H G
61
/ \
34
27
/ \ / \
15 19 14 13
/ \ / \
9 10 5 8
61
/ \
34
27
/ \ / \
15 14 19 13
/ \ / \
9 10 5 8
现在再来说一下,有了这个码表如何解码,解码是编码的逆过程,所以,先看deflate树的编码
deflate树,编码方式为:
第n层的最左边的叶子结点的编码=((第n-1层的最左边的叶子结点的编码 )+ (第n-1层的叶子结点数))<< 1 。
第n层,后一个叶子结点的编码 = 前一个叶子结点的编码+1
还以下面这颗树为例:
61
/ \
34
27
/ \ / \
15 14 19 13
/ \ / \
9 10 5 8
以上是关于deflate树与deflate编码的主要内容,如果未能解决你的问题,请参考以下文章
为啥现实世界的服务器更喜欢 gzip 而不是 deflate 编码?
PHP编码gzdeflate与Golang解码DEFLATE