Huffman Tree

前置概念

  • 树的路径长度 W = ∑ u ∈ l e a v e d e p ( u ) ∗ w ( u ) W=\sum\limits_{u\in leave} dep(u)*w(u) W=uleavedep(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

构造方式

  1. 看作 n n n 个单节点树构成的森林
  2. 取当前权值最小的两棵树合并,新树的权值为原两树权值之和
  3. 重复 n − 1 n-1 n1 次即得 2 n − 1 2n-1 2n1 个节点的树

证明最优性

最优树没有度为 1 1 1 的节点

P f . Pf. Pf.

  1. 若叶子节点 u u u 的父节点 v v v 度为 1 1 1 ,则直接用 u u u 替代 v v v 显然可使树的路径长度变小
  2. 若非叶子节点 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) Tn1(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) Tn1(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(Tn1)+(w1+w2)W(Tn1)=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(Tn1)=W(Tn)+W(Tn1)
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(Tn1)W(Tn1)
∴ 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(Tn1)=W(Tn1)
即证

第一步是最优的

根据排序不等式,对于同构树,最小的两个权值深度最大。

实现

优先队列秒了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值