关于哈夫曼树构造的结果探讨

哈夫曼树的构造算法想必我们大家都是耳熟能详的,对于大多数的题目都可以轻松构造出来,但是,我们也知道哈夫曼树的构造有的简单,有的较难,存在多种情况。
我们首先看哈夫曼树的构造方法描述
(1)、根据 n 个给定的权值 {w1, w2, …, wn} 构成 n 棵二叉树的集合F={T1, T2, …, Tn},其中每棵二叉树 Ti 中只有一个带权为 wi 的根结点,其左右子树均空。
(2)、在 F 中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
(3)、在F中删除这两棵树,同时将新得到的二叉树加入F中。
(4)、重复 (2) 和 (3),直到F中只含一棵树为止,这棵树便是哈夫曼树。
1.我们先看课本上面的最简单的题目
有4 个结点 a, b, c, d,权值分别为 7, 5, 2, 4,构造哈夫曼树。
在这里插入图片描述

上面这道题目构造出来的二叉树非常整齐,每个结点都是只有右子树,所以看着非常舒服,但是,这仅仅是数据的巧合,这种情况,只有新构造的二叉树根节点的权值在下次构造时又被选择才可以。
2.再看一道题目
有5 个结点 a, b, c, d, e,权值分别为 7, 5, 5, 2, 4,
构造哈夫曼树。

在这里插入图片描述
此时首先构造的根节点权值为6的二叉树在下一轮比较里被pk掉了,两个权值为5的根节点被选中了,因此最后构造的二叉树没有了前面的美感,多了一个分支。

再看一道更特殊的题目
已知某系统在通信联络中只可能出现8种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码.
为了更加直观,我们把概率统一x100,变成没有小数的形式,即5,29,7,8,14,23,3,11
接下来开始构造
第一步,列出所有的根节点
在这里插入图片描述
第二步,选取两个最小的进行组合,即3,5
在这里插入图片描述
第三步,按照规则,我们选取两个最小的,即7和8,但是,这个时候8有两个,该选哪一个呢?选哪个都一样吗?下面我们分别试一下
我们先看选择原来就有的那个8的构造结果
在这里插入图片描述
再看选择后来自己构造的那个8的结果
在这里插入图片描述
比较两个图,区别就是两个8换了位置,从构造过程讲,这两个图都是正确的,这里,我们通过计算他们的代权路径长度WPL
来比较二者
第一种
WPL=23X2+11X3+5X4+3X4+29X2+14X3+7X4+8X4=271
第二种
WPL=23X2+11X3+8X3+29X2+14X3+7X4+3X5+5X5=271
经过计算,二者的WPL是一致的,可以认为哈夫曼树均是正确的,但是,也可能这只是特例,因此还是要小心,两个都试一试
从规范的角度来看,在权值相同时,我们应该优先选择叶子节点作为新的节点

总结:哈夫曼树的构造一共有以上三种情况

  1. 每次选择都有刚刚构造的二叉树

  2. 某次选择最小的两个节点是均是原始的节点,而非后期构造的

  3. 某次选择出现了其中一个最小节点是重复的,而且其中一个是刚刚构造出来的,这个时候面临着不同选择树也不同的结果。

    我们知道哈夫曼树的构造结果不唯一,比较多的情况是树的左右子树可以互换,这种情况不影响最后的树的带权路径长度,但是,对于第三种情况,改变了树的度,虽然结果计算WPL是一样的,但我不知道是否存在特例,留待以后在证明,先记下来吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值