- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[数据结构实习报告
数据结构实习报告
姓名:吴加剑
班级:114102
学号:20101000094
学院:信息工程学院
第一题:软件压缩/解压缩软件 Szip(Huffman算法及应用)
一.需求规格说明:
问题:利用哈夫曼编码进行对已经存在的文件进行重新编码,也就是压缩,然后再对该文件进行解码,即解压。
二.总体分析与设计
设计思想:
存储结构主要是采取动态分配内存的方法用数组进行存储,在进行压缩的时候写进文件的表头是自己定义的结构体,我把码长在0-8之间,8-16之间,16-32之间的分别定义了结构体,这三种结构体都具备data(即ASCII码值),码长,不同的是记录哈夫曼编码的指针类型,根据码长的不同指针类型分别为BYTE类型,WORD类型, unsigned int类型。主要的算法思想是Huffman算法思想和移位,拼接
设计表示:我设计的是先读出需要压缩的文件,然后利用哈弗曼将其重新编码从而达到压缩的目的,解压缩则刚好相反。
详细设计表示:
主要算法框架是:先读一遍文件,统计出每个ASCII码值的频率,并将不为0的频率当作参数来建立Huffman树,然后获得他们的Huffman编码,码长和ASCII值,把码长在0-8之间的写在一起,8-16之间的写在一起,16-32之间的写在一起,然后写进文件,这就是表头。然后再读一遍原文件,一个字节一个字节的读,然后将他们拼成32位写进一个新的文件,这就是压缩后的文件。解码的时候先从压缩的文件中将表头读出来,然后再依次读32位,根据表头信息来进行解码。
三. 编码
首先比较困难的是Huffman传参数的下标,我是从0开始的,而书上的函数代码参数下标是从1开始的,这个问题比较好解决,只要将建Huffman树的函数中有一个地方的数组下标减1就可以了。第二个问题是有很多ASCII码的频率为0,此时需要将它们从数组中删除,下面的一个问题比较难解决,因为想让表头尽可能的小,所以我想分情况,码长在0-8之间的指针用BYTE类型,码长在8-16之间的指针用WORD类型,码长在16-32之间的码长用unsigned int类型,但是一开始写成了通用的结构体,结果码长的指针用的是void型,结果读出来的时候长度不是因指针的长度不同而改变,所以我就改成了用三个不同的结构体,并且分别记录下每个结构体的个数。接下来在压缩拼位时一开始用错了,用成了有符号的,结果发现错了,而且还有一个错误是在右移32位是和我预先设想的不同,所以我将其单独列为了一种情况。接下来就是解码的过程,对我来说,一开始写解码的代码不是很费时间,但是有很多情况没有想全面,结果调程序花了好几天的时间,而且一开始压的时候比原文件都大,始终想不通是为什么,最后才发现是循环的控制条件写错了,我把两个个数弄混了,现在我的程序还有一点点的问题,就是中间解码的时候会有一点乱码,解码时还有一个问题就是最后读最后一次的时候会有不足32位的情况,这时要将多余的位数记下来,否则解码的时候会有多余的字符。
程序及算法分析
使用说明:首先选择数字0或1或2,0代表结束,1代表压缩,2代表解压缩,然后键入文件的地址,再按回车键就行了。
程序运行结果:压缩后的文件在一个文本文档中,而还原后的文件在另一个文件中。
改进思想:可以用重构Huffman树来解码,这样出错的几率就小了,
还有,有的地方控制循环的条件可以缩小一点。
经验与体会:通过做题目一使我对Huffman编码的思想有了具体而深刻的体会,对文件的读写函数更加了解了,也亲自操作了移位与拼接。对指针的运用更加灵活了。
时间复杂度:因为我为了拼接和解码的时候方便些,所以在一开始做了些准备工作,所以循环用的比较多,有的时候是外面一个循环,里面还有一个循环,所以时间复杂度有点高,大部分函数到了n的平方级别。
附录
//哈夫曼编码压缩解压缩程序.cpp
#include stdio.h
#include string.h
#include stdlib.h
#include conio.h
struct head
{
unsigned char b; //记录字符在数组中的位置
long count; //字符出现频率(权值)
long parent,lch,rch; //定义哈夫曼树指针变量
char bits[256]; //定义存储哈夫曼编码的数组
}
header[512],tmp;
/*压缩*/
void compress()
{
char filename[255],outputfile[255],buf[512];
unsigned
您可能关注的文档
- [敦化市GPS监控GPS定位GPSONE手机GPS.doc
- [敦煌网分享我国玩具市场发展趋势及运行方向.docx
- (人脸检测和识别技术的文献综述.doc
- (人资简答题.doc
- (人胰岛素药品项目可行性分析.doc
- (人资考试重点题目.doc
- (人资面试问题.doc
- [数字与模拟信号.docx
- (人身保险业务课程开发与设计.doc
- (人身保险从业人员职业道德考题练习.doc
- 中国国家标准 GB/T 11828.4-2025水位测量仪器 第4部分:超声波水位计.pdf
- 中国国家标准 GB/T 45288.2-2025人工智能 大模型 第2部分:评测指标与方法.pdf
- 清明节气PPT模板 (28).pptx
- 传统中国风清明节介绍PPT模板 (30).pptx
- 废旧光伏板的热刀分离与超临界降解回收关键技术研究.docx
- 2024盐湖资源综合利用与绿色发展创新论坛:持续低价形势下中国基础锂盐产业高质量发展之路初探.docx
- 传统中国风清明节介绍PPT模板 (4).pptx
- 传统中国风寒食节介绍PPT模板.pptx
- 传统中国风清明节介绍PPT模板 (9).pptx
- 传统中国风清明节介绍PPT模板 (18).pptx
文档评论(0)