实验报告
课程名称 《算法分析与设计》 实验日期 2020 年 5 月12日 至 2020年 5月 17日
学生姓名 戴昊宇 所在班级 计算机184 学号 2018212212015
实验名称 最优前缀码
实验地点 同组人员 无
1.问题
对于任意给定的n个频率f(x1),f(x2),…,f(xn),如何构造一棵对应于最优二元前缀码的二叉树?
2.解析
二元前缀码:任何字符的代码不能作为其它字符代码的前缀.eg.Q={001,00,010,01}不是二元前缀代码,如序列0100001会产生歧义
设C={x1,x2,…,xn}是n个字符的集合,f(xi)为xi出现的频率,d(xi)为xi的码长,i=1,2,…,n.
存储一个字符的平均二进制位数(码数):
n
B=∑f(xi)d(xi)
i=1
每个二元前缀码对应一棵二叉树,树叶代表码字,树叶的深度表示码长,平均二进制位数相当于这棵树在给定频率下的平均深度,也称为这棵树的权
对同一组频率可以构造出不同的二叉树,对应的平均二进制位数也不同。占用位数越少的压缩效率越高,即每个码字平均使用二进制位数最少的前缀码,称为最优二元前缀码
如果叶片数n=2k,且每个码字的频率是1/n,那么这棵树应是一颗均衡的二叉树
3.设计
Huffman算法:
输入:C={x1,x2,…,xn}字符集,每个字符的频率f(xi),i=1,2,…,n.
输出:Q
1.n<-|C|
2.Q<-C //按频率递增构成队列 Q
3.for i<-1 to n-1 do
4. z<-Allocate-Node()
5. z.left<-Q中最小元 //取出Q中最小元作为z的左儿子
6. z.right<-Q中最小元 //取出Q中最小元作为z的右儿子
7. f(z)<-f(x)+f(y)
8. Insert(Q,z)
9.return Q
4.分析
算法复杂度:O(nlogn)
5.源码
https://github.com/yyqx-1128/text