一、哈夫曼树的构造
看起来比较清晰,但是课堂上和书中并没有给出最优性证明。
二、最优性的证明
于是在网上查找了一下,得到了一个比较好的证明,转载如下(有小小的修正补充):
(来源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} Vw1、Vw2 两个叶子节点收缩得到新树 T n − 1 ∗ ( w L m a x = w 1 + w 2 ) T_{n-1}^*(w_{L_{max} } = w_1+w_2) Tn−1∗(wLmax=w1+w2) ,令带权为{ w 3 、 w 4 . . . . w n 、 w 1 + w 2 w_3、w_4....w_n、w_1+w_2 w3、w4....wn、w1+w2}的最优树为 T n − 1 T_{n-1} Tn−1,反向展开得到的树为 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(Tn−1∗)+(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(Tn−1)=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(Tn−1)−W(Tn−1∗)=0
因为 T n 、 T n − 1 T_n、T_{n-1} Tn、Tn−1是最优树,当且仅当 W ( T n ) = W ( T n − 1 ∗ ) W(T_n) = W(T_{n-1}^*) W(Tn)=W(Tn−1∗)且 W ( T n − 1 ) = W ( T n − 1 ∗ ) W(T_{n-1}) = W(T_{n-1}^*) W(Tn−1)=W(Tn−1∗) 时等式成立。即 T n ∗ 、 T n − 1 ∗ T_n^*、T_{n-1}^* Tn∗、Tn−1∗也是最优树。
命题得证。
3.哈夫曼树的创建
现在我们获得了一些权重,我们想要把他放到最优编码树中,根据上面的结论,我们的构造原则就是:找到最小的两个,作为最底层的叶子节点;把他俩收缩(加起来),和剩余的权重混在一起,反复操作。其实这就是最开始给出的哈夫曼树的构造原则。
综上我们得到了哈夫曼树为最优编码树的结论。
#供学习使用而转载,侵删