霍夫曼树为什么是最优二叉树?

        霍夫曼树,也叫最优二叉树。

        什么是最优二叉树呢,所谓最优二叉树是指带权路径长度最短的树。那么为什么霍夫曼算法构建的是一棵最优二叉树?也就是它如何保证树的带权路径值最小呢?

        下面来说明一下。

        首先,在最优二叉树中,除了叶结点,其他结点(叫它内结点吧)都有两个孩子,如若不然,比如有一个内结点只有一个孩子,那么把这个结点和它的孩子结点压缩成一个结点,树的带权路径值减小了,因此原树就不是最优二叉树了。根据这个特点,容易推导出来,内结点个数等于叶子结点个数减1(推导过程:2n2 = n0 + n2 - 1,因此有n2 = n0 - 1)

        其次,可以证明两个权值最小的结点都在最优树的最深层。这里给出一个数学证明。

       假设有两个叶结点n1和n2,n1的权值为w1,所处深度为l1,n2的权值为w2,所处深度为l2,树的带权路径值为H= c + w1*l1 + w2*l2,如果交换两个结点位置,那么树的带权路径长度值为H’ = c + w1*l2 + w2*l1,如果交换之后树的带权路径值变大了,则有H’ > H,也就是c + w1*l1 + w2*l2  <  c + w1*l2+w2*l1,化简一下有w1*(l1 - l2)  <  w2*(l1 - l2),如果l1 > l2,则w1 < w2,如果l1 < l2则w1 > w2,无论是哪种情况,都是把一个深度大权值小的叶结点和一个深度小权值大的叶结点交换,可见当把一个深度大权值小的叶结点和一个深度小权值大的叶结点换位置,树的带权路径值变大了,树变得糟糕了一些。因此权值小的叶结点应该在树的最深层,从自顶向下的角度看也就是最底层。并且这样的结点是成对出现的,因为内结点都有两个孩子。

        通过上面的逻辑推理只解决了霍夫曼算法的第一步,也就是挑出来两个权值最小的结点,作为树最底层的两个互为兄弟的叶子结点,但后续的递归过程又是怎么来的?

        假设树的最底层有两个结点n1和n2,它的双亲结点为n0,n1的权值为w1,n2的权值为w2,设树的带权路径长度H,我们对树做个处理,把n1和n2拿掉,得到一棵新的树,n0变成了叶结点,我们令n0的权值为w1 + w2,新树的带权路径长度为H’,则有H = H’ + w1 + w2,为了使H最小,就得使H’最小,也就是要使新树也是最优二叉树,那么在构建新树的时候也要取权值最小的两个叶结点为最底层结点。这就是霍夫曼算法的递归过程的原理。

  • 29
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__空无一人__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值