一、哈夫曼树的构造
看起来比较清晰,但是课堂上和书中并没有给出最优性证明。
二、最优性的证明
于是在网上查找了一下,得到了一个比较好的证明,转载如下(有小小的修正补充):
(来源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.哈夫曼树的创建
现在我们获得了一些权重,我们想要把他放到最优编码树中,根据上面的结论,我们的构造原则就是:找到最小的两个,作为最底层的叶子节点;把他俩收缩(加起来),和剩余的权重混在一起,反复操作。其实这就是最开始给出的哈夫曼树的构造原则。
综上我们得到了哈夫曼树为最优编码树的结论。
#供学习使用而转载,侵删