您的位置:首页 > 其它

deflate树与deflate编码

2016-01-25 23:57 155 查看

http://www.cnblogs.com/zengzy/p/5156130.html

关于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
/   \
K   L
/  \
M  N


          A
/             \
B              C
/       \       /         \
D        G      F          E
/   \       /   \
I   J      H    G
/   \
K   L
/  \
M  N


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


作者:zengzy

出处: http://www.cnblogs.com/zengzy
分类: 数据结构与算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: