数据结构之哈夫曼树
实验要求:
- 设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。
给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。
并完成对英文文件的编码和解码。 - 要求:
- 准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率
- 构造哈夫曼树
- 对英文文件进行编码,输出一个编码后的文件
- 对编码文件进行解码,输出一个解码后的文件
- 撰写博客记录实验的设计和实现过程,并将源代码传到码云
把实验结果截图上传到云班课
什么是哈夫曼树?
- 基本概念
- 最优二叉树:平均编码长度最短。
- 结点之间的路径:一个结点到另一个结点所经过的结点次序。
- 结点之间的路径长度:两个结点之间边的条数。
- 树的路径长度:从根结点到每个叶子结点的路径长度之和。
- 带权路径: 路径上加上的实际意义 。如汽车到下一站的距离我们叫做权值.
树的带权路经长度:每个叶子结点到根的路径长度权值之和,记作WPL。
还是汽车的例子,汽车到达天津有2条路 可以走。第一条路经过3个站,每个站相距13km。第二条有2个站,每个站相距18km。那么有距离的路我们叫做带权路径。根结点为天津的树,那么第一条路带权路径为 3*13 = 39,第二条为2*18。树的带权路径WPL 313+218.
- 哈夫曼树: 二叉树是n个结点的结合,它的度(所有孩子个数的最大值)小于等于2。n个结点构成一个二叉树有许多方法。使二叉树的带权路径最小的树,我们叫做哈夫曼树。
- 哈夫曼树的特点:权值越大,所离根结点越近。
哈夫曼树有什么用?
- 介绍了这么多概念,不知道它有什么用,让初学者感觉数据结构没什么劲。
- 哈夫曼树主要用在数据的压缩如JPEG格式图片,在通信中我们可以先对发送的数据进行哈夫曼编码压缩数据提高传输速度。
- 查询优化:在工作中我们我们身边放许多工具,由于空间限制我们不能把所有工具放在我们最容易拿到的地方,所有我们把使用频率最高的工具放在最容易的位置。同样的道理在查询的时候我们把查询频率最高的数据建立索引,这些都是使用了哈夫曼算法的思想。
怎么构造哈夫曼树?
- 为了理解怎么构造哈夫曼树我们举个例子:
- 我们现在有一组字符:{a,b,c,d,e,f,g,h,}
- 他们出现的概率为:{0.19, 0