【数据结构】哈夫曼树的理解和最优性的证明

一、哈夫曼树的构造

上课给出的构造方法看起来比较清晰,但是课堂上和书中并没有给出最优性证明。

二、最优性的证明

于是在网上查找了一下,得到了一个比较好的证明,转载如下(有小小的修正补充):
(来源https://blog.csdn.net/weixin_42881755/article/details/90714191)
要证明最优其实是要证明下面几个事情:
在这里插入图片描述1.先证明权最小的两个数是最底层的兄弟节点

因为 V L m a x V_{L_{max}} VLmax​​是通路长度最长的的分支点,则其子节点必为叶子节点。假设 V L m a x V_{L_{max}} VLmax ​​只有一个叶子节点, V w x V_{w_x} Vwx ​,则可以用子节点 V w x V_{w_x} Vwx代替分支节点 V L m a x V_{L_{max}} VLmax 得到新树 T n ∗ T_{n}^* Tn​ ,则有: W ( T n ∗ ) = W ( T n ) − w x W ( T_{n}^*) = W ( T_n ) − w_x W(Tn)=W(Tn)wx,与有 T n T_n Tn 为最优树相矛盾。那么最底层一定有两个叶子节点。

如果这两个节点不是最小的,那么把最小的和这两个点交换,则带权路径一定会减小,又与最优树矛盾。,所以得到结论:权最小的两个数是最底层的兄弟节点。

2.证明最优树收缩和展开后仍然是最优的

(在这里需要注意到每个存放数据的节点都是叶子节点,所以可以随意的展开和合并而不影响到其他节点)

V w 1 、 V w 2 V_{w_1}、V_{w_2} Vw1Vw2 两个叶子节点收缩得到新树 T n − 1 ∗ ( w L m a x = w 1 + w 2 ) T_{n-1}^*(w_{L_{max} } = w_1+w_2) Tn1wLmax=w1+w2) ,令带权为{ w 3 、 w 4 . . . . w n 、 w 1 + w 2 w_3、w_4....w_n、w_1+w_2 w3w4....wnw1+w2​}的最优树为 T n − 1 T_{n-1} Tn1​,反向展开得到的树为 T n ∗ T_n^* Tn​。则有:
W ( T n ) = W ( T n − 1 ∗ ) + ( w 1 + w 2 ) W(T_n)=W(T_{n-1}^*)+(w_1+w_2) W(Tn)=W(Tn1)+(w1+w2)
W ( T n − 1 ) = W ( T n ∗ ) − ( w 1 + w 2 ) W(T_{n-1})=W(T_n^*)-(w_1+w_2) W(Tn1)=W(Tn)(w1+w2)
整理得:
W ( T n ) − W ( T n ∗ ) + W ( T n − 1 ) − W ( T n − 1 ∗ ) = 0 W(T_n)-W(T_{n}^*)+W(T_{n-1})-W(T_{n-1}^*)=0 W(Tn)W(Tn)+W(Tn1)W(Tn1)=0
因为 T n 、 T n − 1 T_n、T_{n-1} TnTn1是最优树,当且仅当 W ( T n ) = W ( T n − 1 ∗ ) W(T_n) = W(T_{n-1}^*) W(Tn)=W(Tn1) W ( T n − 1 ) = W ( T n − 1 ∗ ) W(T_{n-1}) = W(T_{n-1}^*) W(Tn1)=W(Tn1) 时等式成立。即 T n ∗ 、 T n − 1 ∗ T_n^*、T_{n-1}^* TnTn1​也是最优树。
命题得证。

3.哈夫曼树的创建
现在我们获得了一些权重,我们想要把他放到最优编码树中,根据上面的结论,我们的构造原则就是:找到最小的两个,作为最底层的叶子节点;把他俩收缩(加起来),和剩余的权重混在一起,反复操作。其实这就是最开始给出的哈夫曼树的构造原则。

综上我们得到了哈夫曼树为最优编码树的结论。

#供学习使用而转载,侵删

猜你喜欢

转载自blog.csdn.net/qq_56199570/article/details/121403637