2022年用哈夫曼编码实现文件压缩 .pdf

上传人:Q****o 文档编号:26179067 上传时间:2022-07-16 格式:PDF 页数:10 大小:453.95KB
返回 下载 相关 举报
2022年用哈夫曼编码实现文件压缩 .pdf_第1页
第1页 / 共10页
2022年用哈夫曼编码实现文件压缩 .pdf_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《2022年用哈夫曼编码实现文件压缩 .pdf》由会员分享,可在线阅读,更多相关《2022年用哈夫曼编码实现文件压缩 .pdf(10页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、用哈夫曼编码实现文件压缩实验报告课程名称数据结构实验学期 2013 至 2014 学年第 2 学期学生所在系部计算机学院年级 2012级专业班级计算机科学与技术学生姓名学号任课教师实验成绩名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 10 页 - - - - - - - - - 一、实验题目哈夫曼编码实现文件压缩二、实验目的:1、了解文件的概念。2、掌握线性链表的插入、删除等算法。3、掌握 Huffman 树的概念及构造方法。4、掌握二叉树的存储结构及遍历算法。5、利用

2、 Huffman 树及 Huffman 编码,掌握实现文件压缩的一般原理。三、实验设备与环境:微型计算机、 Windows 系列操作系统、 Visual C+6.0软件。四、实验内容:根据 ASCII 码文件中各 ASCII 字符出现的频率情况创建Haffman 树, 再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。五、概要设计:本次实验采用将字符用长度尽可能短的二进制数位表示的方法,即对于文件中出现的字符, 无须全部都用 8 位的 ASCII 码进行存储,根据他们在文件中出现的频率不同,我们利用Haffman 算法使每个字符能以最短的二进制字符进行存储,以达到节省存储空间, 压缩文件的目

3、的。 解决了压缩需采用的算法, 程序的思路已然清晰:1统计需压缩文件中每个字符出现的频率。2将每个字符的出现频率作为叶子结点构建Haffman 树,然后将树中结点引向其左孩子的分支标“ 0” ,引向其右孩子的分支标“ 1” ;每个字符的编码即为从根到每个叶子的路径上得到的0、1 序列,这样便完成了Haffman 编码,将每个字符用最短的二进制字符表示。3打开需压缩文件,再将需压缩文件中的每个ASCII 码对应的 Haffman 编码按 bit单位输出。4文件压缩结束。六、详细设计:(1)构造 Hufffman 树的方法 Hafffman 算法构造 Huffman 树步骤:I. 根据给定的 n

4、个权值 w1,w2, ? wn, 构造 n 棵只有根结点的二叉树,令起权值为 wj。II. 在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。III. 在森林中删除这两棵树,同时将新得到的二叉树加入森林中。. 重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。对于 Haffman 的创建算法,有以下几点说明:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 10 页 - - - - - - - - - a)

5、这里的 Haffman 树采用的是基于数组的带左右儿子结点及父结点下标作为存储结点的二叉树形式,这种空间上的消耗带来了算法实现上的便捷。b) 由于对于最后生成的Haffman 树,其所有叶子结点均为从一个内部树扩充出去的,所以,当外部叶子结点数为m个时,内部结点数为m-1,整个 Haffman树的需要的结点数为2m-1 c) 初始化 Hafffman 树分两步进行, 先将所有结点赋值, 再将前 m个叶子结点赋初值。d) 在查找权值最小并且父结点为空的两个结点时,通过逐个比较,将两结点的位置下标与权值分别保存。方便在与其父结点建立联系时调用。2)压缩过程的实现:压缩过程的流程是清晰而简单的:1

6、创建 Haffman 树2 打开需压缩文件 3 将需压缩文件中的每个ASCII 码对应的 Haffman 编码按 bit单位输出 4 文件压缩结束。其中,步骤 1 和步骤 3 是压缩过程的关键。开始定 义Hafffman初始化 Hafffman 树i=0 im-1 Hafffman 创建完毕i+ 将下标为m+i 的结点作为所找出的两结点的父结点, 建立联系在前 m+i 个结点中找出权值最小并且父结点为空的两结点名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 10 页 -

7、- - - - - - - - a) 步骤 1: 这里所要做工作是得到Haffman数中各叶子结点字符出现的频率并进行创建。b) 步骤 3: 将需压缩文件中的每个ASCII 码对应的 Haffman 编码按 bit单位输出,这是本压缩程序中最关键的部分。这里涉及“转换”和“输出”两个关键步骤:“转换”部分大可不必去通过遍历Haffman 树来找到每个字符对应的哈夫曼编码,可以将每个码值及其对应的ASCII 码存放于如下所示的结构体中:typedef struct char asciiCode; unsigned long haffCode; int haffCodeLen; HaffCode;

8、 创建由该结构体结点所组成的,长度为128 的一维数组 codeList128,且 codeList中的下标和 asciiCode 满足下面的顺序存放关系:codeListi.asciiCode=i; 这样的话,查找某个字符 inChar 的 Haffman编码的工作便变得相当轻松了, 如下:sHaffCode=codeListinChar.haffCode; 数组 codeList128的创建可以采用某种遍历方式下的按找到的字符进行置数的方式,十分的方便。以下流程图采用的是前序遍历的方式创建:说明:1 在流程图中, youBiao 中存放字符对应的Haffman 编码, sDepth 中存放

9、其Haffman 编码的长度。2 在代码的编写过程中,可用递归调用实现。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 10 页 - - - - - - - - - N Y Y N Y N Y N N Y (3)“输出”部分是最重要的部分,也是最易出错的部分。每个字符要能合理的结束。这主要是为解压缩考虑的,比如在最后, 这里涉及到 C语言的位操作 ,要求这个算法能处理好以下几个问题:1) 每个字符所对应的 haffCode 的比特位长度由 523位不等长,不可少输,多输,

10、输错任何一位,后一个字符的haffCode 要紧跟在前一个字符的haffCode后面。youBiao1 丨0 x01,sDepth+ ; 结点指向其右判断当前结点是否有孩子结点当前结点是否有左孩子结点点当前结点是否有右孩子结点当前结点是否有父结点当前结点的左右孩子是否都已访YouBiao1,sDepth+向其左结点youBiao,sDepth 与结点返回其父结点youBiao 为 Haffman编码值即开始文件的压缩编码成功名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共

11、10 页 - - - - - - - - - 2)最后一个要输出的 haffCode 的最后一位,它恰好是位于最后一个有效字符的第一位, 剩下的七个空位是要用无效的haffCode 加以填充的。 否则,如果填充的haffCode 亦为某个 ascii 字符的 haffCode 时,那么在解压缩时,则该在原被压缩文件中不存在的字符便会无中生有的在解压后的文件中出现,这显然是不正确的,应在程序中加以处理。N Y N Y Y N 当文件不为空时count = 0 count8 当前的一个字符对应的haffCode 已输出完毕将 curCode 中的当前位赋值给输出字符左起的第count 个位置输出字

12、符到压缩文件读入被压缩文件的下一个字符,得到其haffCode , 设为 curCode ,如是最后一个字符,则做相应y 的处理Count+ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 10 页 - - - - - - - - - (4)main 函数部分 N Y N Y 开始是否成功输入要打开文件名称是否找到key.txt 文件将 key 文件中的值作为叶子结点构建haffman 树实现haffman 编码输出ASCII 码对应的haffman 编码及其长度输出字符

13、到压缩文件文件压缩结束,关闭打开的 文件返回名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 10 页 - - - - - - - - - 七、测试结果及分析:运行结果:压缩情况:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 10 页 - - - - - - - - - 实验分析:数据结构将各个抽象的数据之间的关系建立起来,无论是线性的、 循环的还是

14、分支的,都是为了建立一种方便程序的实现和运行的结构,使得数据之间不再是孤立的。它能使得我们在编程时在脑海中显现更为清晰的数据关系画面。而且在学习数据结构时我们更应该联系所属语言(我们所学的是C语言版)的特性,这样才能更好的理解数据结构的思想体系。以上程序实验采用的方案:即统计了若干篇不同的文章中字符出现的频率。已事先统计每个字符出现的频率放在KEY.txt 文件中,然后程序运行时自动将字符的权读出存放在一个以为数组中即: wListi中, 通过实参传给形参 *w, 以此按先序遍历二叉树的方式构造Huffman 树,得各字符的 Huffman 编码值. 在进行压缩时候 , 程序界面会自动提醒输入

15、要压缩的文件名其压缩的文件扩展名为*.zip.每个字符的存储编码与Huffman 编码一一对应,可以达到无损压缩的目的,由于 KEY.txt 文件的存在可以为后续解压做准备。总的来说,这次实验带来的收获是很大的,提取文件数据、分析数据、构建Huffman 树、替换数据对文件进行压缩、输出文件,一次大的实验几乎运用到了我们一学期所学的所有知识。 经过分、析调试和了解程序的代码, 巩固了上课学习的知识。在这次试验中, 我感觉到了自己的不足之处, 设计思路不够清晰, 运行出现错误也不能很好的调整改正。 在以后的学习生活中, 应当努力提高自己, 让自己的未来更加清晰明了。名师资料总结 - - -精品资

16、料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 10 页 - - - - - - - - - 八、教师评语:教师评价评定项目A B C D 评定项目A B C D 算法正确界面美观,布局合理程序结构合理操作熟练语法、语义正确解析完整实验结果正确文字流畅报告规范题解正确其他:评价教师签名:年月日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 10 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com