前置概念
- 树的路径长度 W = ∑ u ∈ l e a v e d e p ( u ) ∗ w ( u ) W=\sum\limits_{u\in leave} dep(u)*w(u) W=u∈leave∑dep(u)∗w(u)
- 对于给定的 w 1 , w 2 , ⋅ ⋅ ⋅ , w n w_1,w_2,\cdot\cdot\cdot,w_n w1,w2,⋅⋅⋅,wn 为叶子结点权值,使树的路径长度 W ( T n ) W(T_n) W(Tn)最小的二叉树为 H u f f m a n T r e e Huffman\ Tree Huffman Tree
构造方式
- 看作 n n n 个单节点树构成的森林
- 取当前权值最小的两棵树合并,新树的权值为原两树权值之和
- 重复 n − 1 n-1 n−1 次即得 2 n − 1 2n-1 2n−1 个节点的树
证明最优性
最优树没有度为 1 1 1 的节点
P f . Pf. Pf.
- 若叶子节点 u u u 的父节点 v v v 度为 1 1 1 ,则直接用 u u u 替代 v v v 显然可使树的路径长度变小
- 若非叶子节点 u u u 的父节点 v v v 度为 1 1 1 ,则从 u u u 的子树中任取一个叶子节点变为 v v v 的子节点显然可使树的路径长度变小
即证
推论:存在 u , v u,v u,v 都为叶子节点且是兄弟
合并 & \& & 拆分不影响最优性
不妨设
u
=
1
,
v
=
2
u=1,v=2
u=1,v=2 都为叶子节点且是兄弟
对于最优树
T
n
(
w
1
,
w
2
,
⋅
⋅
⋅
,
w
n
)
T_n(w_1,w_2,\cdot\cdot\cdot,w_n)
Tn(w1,w2,⋅⋅⋅,wn), 将
u
,
v
u,v
u,v 合并到其父节点上,得到
T
n
−
1
∗
(
w
3
,
⋅
⋅
⋅
,
w
n
,
w
1
+
w
2
)
T_{n-1}^*(w_3,\cdot\cdot\cdot,w_n,w_1+w_2)
Tn−1∗(w3,⋅⋅⋅,wn,w1+w2)
对于最优树
T
n
−
1
(
w
3
,
⋅
⋅
⋅
,
w
n
,
w
1
+
w
2
)
T_{n-1}(w_3,\cdot\cdot\cdot,w_n,w_1+w_2)
Tn−1(w3,⋅⋅⋅,wn,w1+w2), 将权值为
w
1
+
w
2
w_1+w_2
w1+w2 的叶子节点拆分成权值为
w
1
,
w
2
w_1,w_2
w1,w2 的两个子节点,得到
T
n
∗
(
w
1
,
w
2
,
⋅
⋅
⋅
,
w
n
)
T_n^*(w_1,w_2,\cdot\cdot\cdot,w_n)
Tn∗(w1,w2,⋅⋅⋅,wn)
则
W
(
T
n
)
=
W
(
T
n
−
1
∗
)
+
(
w
1
+
w
2
)
W
(
T
n
−
1
)
=
W
(
T
n
∗
)
−
(
w
1
+
w
2
)
W(T_n)=W(T_{n-1}^*)+(w_1+w_2)\\\quad W(T_{n-1})=W(T_n^*)-(w_1+w_2)
W(Tn)=W(Tn−1∗)+(w1+w2)W(Tn−1)=W(Tn∗)−(w1+w2)
∴
W
(
T
n
)
+
W
(
T
n
−
1
)
=
W
(
T
n
∗
)
+
W
(
T
n
−
1
∗
)
\therefore W(T_n)+W(T_{n-1})=W(T_n^*)+W(T_{n-1}^*)
∴W(Tn)+W(Tn−1)=W(Tn∗)+W(Tn−1∗)
又
W
(
T
n
)
≤
W
(
T
n
∗
)
W
(
T
n
−
1
)
≤
W
(
T
n
−
1
∗
)
W(T_n)\le W(T_n^*)\\ \quad W(T_{n-1})\le W(T_{n-1}^*)
W(Tn)≤W(Tn∗)W(Tn−1)≤W(Tn−1∗)
∴
W
(
T
n
)
=
W
(
T
n
∗
)
W
(
T
n
−
1
)
=
W
(
T
n
−
1
∗
)
\therefore W(T_n)=W(T_n^*)\\\quad W(T_{n-1})=W(T_{n-1}^*)
∴W(Tn)=W(Tn∗)W(Tn−1)=W(Tn−1∗)
即证
第一步是最优的
根据排序不等式,对于同构树,最小的两个权值深度最大。
实现
优先队列秒了