最优前缀编码(贪心算法)

1.问题
在这里插入图片描述

2.解析
构造最优前缀码的贪心算法就是哈夫曼算法
实例:
字符集:C={a,b,c,d,e,f,g,h}
权重:{5,5,10,10,10,15,20,25}
在这里插入图片描述
在这里插入图片描述
a的哈夫曼编码为:0110
b的哈夫曼编码为:0111
c的哈夫曼编码为:000
d的哈夫曼编码为:001
e的哈夫曼编码为:010
f的哈夫曼编码为:110
g的哈夫曼编码为:111
h的哈夫曼编码为:10

哈夫曼算法正确性证明:

引理1:设C是字符集,任意c∈C,f©为频率,x,y∈C,f(x),f(y)频率最小,那么存在最优二元前缀码使得x,y码字等长,且仅在最后一位不同。
引理2:设T是二元前缀码所对应的二叉树,任意x,y∈C,x,y是树叶兄弟,z是x,y的父亲,令T’=T-{x,y},且令z的频率f(z)=f(x)+f(y),T’是对应于二元前缀码C’=(C-{x,y})∪{z}的二叉树,那么B(T)=B(T’)+f(x)+f(y)。
定理:哈夫曼算法对任意规模为n(n>=2)的字符集C都得到关于C的最优前缀码的二叉树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.设计
Huffman算法:
输入:C={x1,x2,…,xn}字符集,每个字符的频率f(xi),i=1,2,…,n.
输出:Q
n<-|C|
Q<-C //按频率递增构成队列 Q
for i<-1 to n-1 do
z<-Allocate-Node()
z.left<-Q中最小元 //取出Q中最小元作为z的左儿子
z.right<-Q中最小元 //取出Q中最小元作为z的右儿子
f(z)<-f(x)+f(y)
Insert(Q,z)
return Q

4.分析
O(nlogn)频率排序;for循环O(n),插入操作O(logn),算法时间复杂
度是O(nlogn)
5.源码
https://github.com/Marvisss/Huffman/blob/main/%E6%9C%80%E4%BC%98%E5%89%8D%E7%BC%80%E7%A0%81

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值