哈夫曼
一、最优树的定义:
结点的路径长度定义为:从根结点到该结点的路径上分支的数目。
树的路径长度定义为:树中每个结点的路径长度之和。
树的带权路径长度定义为:树中所有叶子结点的带权路径长度之和
WPL(T) = (对所有叶子结点)
在所有含有n个叶子结点、并带有相同权值的m叉树中,必存在一棵其带权路径长度取最小值的树,称为最优树。
二、如何构造最优树:
哈夫曼算法,以二叉树为例:
(1)根据给定的n个权值{W1,W2,W3...Wn},构造n棵二叉树的集合F={T1,T2...Tn},
其中每棵二叉树中均只含一个带权值为Wi的根结点,其左、右树为空树。
(2)在F中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造
一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和。
(3)从F中删去这两棵树,同时加入刚生成的新树。
(4)重复(2)和(3)两步,直至F中只含一棵树为止。
三、哈夫曼编码思想:
1、将构成电文的每个不同字符作为叶子结点,其权值为电文中字符的使用频率或次数,构造哈夫曼树;
2、此哈夫曼树中从根到每个叶子结点都有一条唯一的路径,对路径上各分支约定,做分支标识为0码,右标识为1码;
3、则从根结点到叶子结点的路径上分支的0、1码组成的字符串即为该叶子结点的哈夫曼编码。
四、指令的变长编码:
若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符编码的前缀,这种编码称作前缀编码。
哈夫曼编码就是使电文长度最短的前缀编码。
五:试题:
用二进制来编码字符串“abcdabeaa”,需要能够根据编码,解码回原来的字符串,最少需要多长的二进制字符串?
A、17
B、18
C、19
D、29
解题步骤:
a出现4次,b出现2次,c出现1次,d出现1次,e出现1次。
画哈夫曼树:
9
5 4(a)
2 3
1(c) 1(d) 1(e) 2(b)
即:
a:1 b:011 c:000 d:001 e:010
长度:a是4次,长度为4,其他长度都是3,其他字符有5个,
所以:4*1+5*3=19。