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