您的位置:首页 > 其它

树 赫夫曼树的定义及建立 、赫夫曼编码的定义

2018-02-13 12:22 429 查看
以下有叶子结点带权的二叉树:



路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径
路径长度:路径上的分支数目
树的路径长度:根结点每一个结点的路径长度和
在上图树的路径长度就为:1+1+2+2+3+3+4+4=20
带权路径长度WPL:从该结点到根结点之间的路径长度与结点上权的乘积
上图树的WPL:5*1+15*2+40*3+30*4+10*4=315
带权路径长度最小的二叉树称为赫夫曼树,也叫最优二叉树

最优二叉树有什么意义呢:




该图的叶子结点权值和上上图中一样,不过该图经过变换过
WPL=5*3+15*3+40*2+30*2+10*2=220
WPL的值相比于一个棵树要小很多,这意味着用这棵树解决实际问题效率大大提高
但该图不是最优二叉树,要找最优,还需要进行构造:

赫夫曼树的构造

1.先把有权值的叶子结点按照从小到大的顺序排列为一个有序序列,即:A5,E10,B15,D30,C40
2.取头两个最小权值的结点作为一个新结点N1的两个子结点,注意相对较小的是左孩子,如图。新结点的权值为两个叶子权值之和5+10=15
3.将N1替换A与E放入序列,保持从小到大顺序:N1 15,B15,D30,C40
4.重复步骤2,将N1与B作为一个新结点N2的两个子结点,然后重复......
5.到C结点时,将C与N3作为一个新结点T的两个子结点,T是根结点,此时完成构造



赫夫曼编码

现在有一段文字:”BADCADFEED“需要传输,只有六个字母:ABCDEF,我们会想到用相应的二进制数据表示:



所以需要传输”001000011010000011101100100011“ ,这样的编码十分冗长,所以我们需要想办法改进。
假设六个字母的频率:A 27,B 8,C 15,D 15, E 30, F 5 加起来是100%,这就意味着我们可以用赫夫曼树来构造它们。



左图是构造赫夫曼树的过程中的权值显示。右图将权值左支改为0,右支改成1。
此时我们就可以对六个字母用从根到叶子所经过的路径的0或1来进行编码,



此时我们的编码变为:”1001010010101001000111100“比原来的编码短了很多,相当于对数据的一种压缩,且随着字符的增多和字符权重不同,这种压缩编码会更加有优势
观察上表,这种新的编码的任一字符的编码都不是另一个字符的编码的前缀,这种编码叫做前缀编码
总结:
赫夫曼树的左支为0,右支为1,从根节点到叶子结点所经过的路径分支组成的0和1序列为该结点对应字符的编码,这就是赫夫曼编码

下面有一个题来初步运用赫夫曼树知识:
假设某段通信电文仅由 6 个字母 ABCDEF 组成,字母在电文中出现的频率分别为2,3,7,15,4,6。根据这些频率作为权值构造哈夫曼编码,最终构造出的哈夫曼树带权路径长度与字母 B 的哈夫曼编码分别为______。(这里假定左节点的值小于右节点的值)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: