[关闭]
@sensitive-cs 2017-08-25T09:17:34.000000Z 字数 977 阅读 737

哈夫曼编码


预备知识:
二叉树:二叉树是每个节点最多有两个子树的树结构

满二叉树:除叶子结点外的所有结点均有两个子结点

完美二叉树:所有叶子节点的深度均相同,且是一颗满二叉树

完全二叉树:完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐。

树的带权路径长度:树中所有的叶结点的权值乘上其到根结点的路径长度

最优二叉树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也叫哈夫曼树

前缀编码:在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀。

示例:
满二叉树:
83025aafa40f4bfbbb260360094f78f0f736180b.jpg-4.7kB

完美二叉树:
1094457-20170225183610632-1388959691.png-32.8kB

完全二叉树:
1094457-20170225183236538-961758163.png-2.3kB

树的带权路径长度:
1094457-20170225194740741-9886325.png-50.8kB

前缀编码:
0 ,10,110,1110

哈夫曼树:
哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。
树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。

哈夫曼编码的步骤:
1、对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。)
2.在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
3.从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
4.重复二和三两步,直到集合F中只有一棵二叉树为止。

示例1:
1364269280_1093.jpg-18.4kB

1364295178_5098.jpg-36.7kB

示例2:
假如我有A,B,C,D,E五个字符,出现的频率(即权值)分别为5,4,3,2,1
A : 5
B : 4
C : 3
D : 2
E : 1

第一步先取两个最小权值作为左右子树构造一个新树,即取1,2构成新树,其结点为1+2=3
201112231832078695.png-18.7kB

虚线为新生成的结点,第二步再把新生成的权值为3的结点放到剩下的集合中,所以集合变成{5,4,3,3},再根据第二步,取最小的两个权值构成新树
201112231832087092.png-26.7kB

201112231832084301.jpg-17.6kB

其中各个权值替换对应的字符即为下图
201112231832086286.jpg-17.6kB

所以各字符对应的编码为:A->11,B->10,C->00,D->011,E->010

示例4:
272122409653995.gif-64kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注