证明:通过哈夫曼算法得到的树是最优树

首先列出证明过程中需要的名词:

1.路径长度:从某一个结点到根结点的这条路径上的分支数目为路径长度。

2.结点的带权路径长度:从该结点到树根之间的路径长度与该结点的权值乘积。

3.树的带权路径长度:树中所有叶子结点的带权路径长度之和。

   一般记作 :                      WPL = \sum_{k=1}^{n}w_{k}l_{k}

4.使带权路径长度最小的树称作:最优树或哈夫曼树。

证明:

       假设:有一带权分别为w_{1}\leq w_{2}\leq ......\leq w_{n}的最优树T_{n}

       设:T_{n}的最大路径长度的分支节点V_{t},通路长度为L_{t}

             因为V_{t}为分支结点,因此一定有子结点。

             当只有一个子结点时,容易知道T_{n}不是最优树可继续优化,因此V_{t}一定有两结点。

      设这两个结点的权值分别为w_{x}\leq w_{y}

      则w_{x}的带权路径长度为:

                                                                   W_{x} = w_x(L_t+1)

      易得w_1的带权路径长度:

                                                                   W_1 = w_1L

当交换结点w_{x}w_1后:

                                            W_1 = w_1(L_t + 1)     ,     W_x = w_xL

除去w_{x}w_1,其余结点不变,树T_{n}的带权路径长度为WPL_{s}

那么交换前:

                                    WPL_n = WPL_s + w_x(L_t + 1) + w_1L

       交换后:

                                   WPL_n' = WPL_s + w_xL + w_1(L_t+1)     

相减得:

             WPL_n - WPL_n' = (w_x - w_1)(L_t + 1 - L) \geq 0      (w_1\leq w_x ,L \leq L_t+1)

又因为T_{n}是最优树,即:WPL_n是最小的带权路径。

可得:

                                                             WPL_n - WPL_n' \leq 0

因此要使上式成立,则有:

                                                                       w_x = w_1

或:

                                                                     L= L_t+1 (w_1,w_x是兄弟)

同理可得:

                                                           w_2 = w_y  或  w_2,w_y是兄弟

综上所述:

       结论一:最优树的 最大路径长度分支结点 下的两个子结点是所有结点中权值最小的两个结点。

现在回忆一些不考虑树的结构,只考虑结点合并的哈夫曼算法构造最优树的过程。

即:每次选择权值最小的两个结点进行合并

对于权值为w_{1}\leq w_{2}\leq ......\leq w_{n}的n个结点,经过n-1次合并

最终得到\left \{ (w_1+w_2+......+w_{n-1}),w_n \right \}两个结点

对于两个结点容易得到最优树T_2,即:这两个节点为根节点孩子的树。

接下来按合并的顺序反向展开,

利用数学归纳法证明:

假设:第m-1次展开得到的树是最优树T_{m}成立(m>2)

           当 m = 2 时结论成立。

接下来证明m次展开得到的树是最优树。

第m次反向展开得到树T_{m+1}'

而对于第m次展开得到的树T_{m+1}'中有\left \{ w_{z1}\leq w_{z2} \leq ......\leq w_{z(m+1)}\right \}m+1个结点

其中w_{z1},w_{z2}是路径长度最大分支节点的子结点(由结论一得)。

所以有:

                                       WPL(T_m) = WPL(T_{m+1}') - (w_1+w_2)

存在由这m+1个节点构成的的最优树,设为T_{m+1}

T_{m+1}路径长度最大分支结点的子结点合并到分支节点上(即:分支结点变为叶子结点权值为子结点权值之和),得到T_m'

再由结论一得:合并的结点为w_{z1},w_{z2}

因此:

                                      WPL(T_{m+1}) = WPL(T_m') +(w_1+w_2)

两式相加得:

                      WPL(T_m)-WPL(T_m')+WPL(T_{m+1})-WPL(T_{m+1}') = 0                     

因为T_{m}T_{m+1}最优,有:

                    WPL(T_m) - WPL(T_m')\leq0 ,WPL(T_{m+1})-WPL(T_{m+1}')\leq 0

因此要使上面两式同时成立,必须有:

                           WPL(T_m) = WPL(T_m'),WPL(T_{m+1})=WPL(T_{m+1}')

也就是说:

第m次反向展开得到的树T_{m+1}'是最优树。

所以假设成立,因此第n-1次展开得到的树T_{n}'是最优树T_n

而按照上述步骤最终得到的树T_n就是哈夫曼算法得到的树。

所以综上:哈夫曼算法得到的树是最优树。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值