资源描述:
《《数据结构》实验报告--利用huffman编码对文件进行压缩解压》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、REPORTBYLINUXAYN,COMPUTATIONALMATHEMATICS,SYSU《数据结构》实验报告利用Huffman编码对文件进行压缩解压学生:XXX学号:XXXXXXXX联系:XXXXXX@XXXXX.com第5页共5页REPORTBYLINUXAYN,COMPUTATIONALMATHEMATICS,SYSU(一)基本信息1.实验题目利用Huffman编码对文件进行压缩解压2.完成人(姓名、学号)姓名:XXX学号:XXXXXXXX3.报告日期2007年12月12日星期二(二)实习内容简要描述1.实习目标v学会对树的基本操作v
2、学会对文件进行操作v利用Huffman编码对文件压缩解压2.实习要求v实现最小堆模板类v利用最小堆构建Huffman树v实现Huffman编码和解码v根据用户从键盘输入的报文文本,输出各字符的Huffman编码以及报文的编码Ø根据用户从键盘输入一串报文文本,输出各字符的Huffman编码Ø输出报文的Huffman编码及长度Ø根据输入的Huffman编码,解码输出v利用Huffman编码和解码对二进制文件的压缩和解压(三)报告主要内容1.设计思路开发环境:MicrosoftVisualC++2005设计思路:第5页共5页REPORTBYLINU
3、XAYN,COMPUTATIONALMATHEMATICS,SYSU1.设计Pack类储存字符的权值2.设计MinHeap模板类构建最小堆3.设计ExtBinTree模板类为带权二叉树4.设计Compress模板类以实现文件的压缩解压1.主要数据结构1.MinHeap.h:头文件,包含MinHeap模板类的类界面以及定义;2.HuffmanTree.h:头文件,包含ExtBinTree模板类以及Compress模板类的类的的类界面以及定义3.main.cpp:调用上述头文件实现相关操作2.主要代码结构主要代码结构为见附件中各文件的代码注释3.
4、主要代码段分析主要代码段分析,见附件中的代码注释(四)实习结果1.基本数据源程序代码行数:约800行完成该实习投入的时间:二十四小时(不包括写实验报告的时间)与其他同学讨论交流情况:感谢刘畅同学对程序的测试2.测试数据设计1.对屏幕输入字符进行Huffman编码根据Huffman树非唯一性,虽然和课件上有些许不同,但是还是正确的输入字符串:CASTCASTSATATATASA输出编码:A:0C:110S:111T:10输入霍夫曼编码:0111010110110输出译码:ASATCC2.对”实验05.PPT”的压缩操作使用0秒(不足一秒按0秒计
5、算),压缩率为56.1755%第5页共5页REPORTBYLINUXAYN,COMPUTATIONALMATHEMATICS,SYSU1.对”实验05.ppt.hfm”(即刚才生成的压缩文件)的解压操作使用0秒(不足一秒按0秒计算),解压后文件无异常2.对一个18M的EXE安装包前后进行压缩和解压操作,分别用时10秒和9秒2.测试结果分析A)程序运行的系统资源配置操作系统:MicrosoftWindowsXPProfessionalSP2CPU:AMDAthlon3600+2.0GRAM:1024MDDRII开发环境:MicrosoftVis
6、ualC++2005B)对TXT文档进行压缩和解压后,通过WinMerge检验和原文件无差异C)对MP3和EXE文件压缩和解压后仍能正常使用D)对于中文名字和带有空格的路径均能正确无误识别E)文件名只能小于16个字符(包括后缀名),否则解压会出错(只预留了16个字节用于储存文件名)F)相对于不用文件块读写的程序,效率提高了三倍以上G)具有动态进度条,可以显示当前压缩和解压的进度百分比(当然消耗了一些系统资源)H)出错处理不够充分,特别是cin部分,如果误输入可能会造成死循环(五)实习体会1.实习过程中遇到问题及解决过程A)一开始时候的程序运行
7、很慢,,压缩一个4M左右的文件需要七八秒,后来改用文件块缓存字节来读写后,压缩一个4M的文件只需要两秒左右的时间.本来是只想写一个进度条而已的,后来发现如果只读一个字节就判断一次进度条的话会很消耗系统资源,后来干脆麻烦点用文件块来缓存.不过至于一次缓存多少字节才能达到最好的效果还未知,现在设置的是一次缓存40KB的数据B)本来一个一个字节读的时候对最后一个字节的操作基本没费什么劲,但是在文件块读写的时候就不是那么清晰明了了,后来经过仔细Debug,才找到错误的所在.许多问题都是这样C)对于中文名和带空格路径,用C++的fstream就不支持,
8、但是C中的FILE*就支持,不知道为什么.还有C++中的fstream的成员函数read返回值很奇怪,不知道如何获取成功读入的项数.改用C中的FILE*文件指针后就