- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
软件工程学院
程序设计实践(下)实验报告
题目:哈夫曼编码/译码器
姓名:张 祺
学号班级:软件工程3班
问题解析(对问题的分析、解题思路与解题方法)
问题主要分为三部分,分别是文件的操作、界面的设计、文件的压缩,其中界面的设计和文件的压缩又是基于哈弗曼编码的,因此,构造哈弗曼树和获取哈弗曼编码是程序的关键。
1、文件的操作:
程序中文件的操作主要是文件的读和写,关于这点,基本上没有遇到什么问题。
2、界面设计
前面已经提到,界面设计是基于哈弗曼树和哈弗曼树的小时,我分到了这一块,下面做介绍。
由于哈弗曼树是正则二叉树,即对于每个结点,要么其左右孩子都存在,要么都不存在。但对于树形结构来说,其变化多端,每一行的结点数不确定,虽然第二层(第一层只有根结点)和最后一层结点数没有任何确定的关系,但他们之间却有相互制约关系,即底层结点的个数关系着上层(尤其是第二、三层)结点之间的距离,这也是最难把握的地方。
最初,我用矩阵保存同一层结点之间的关系,但后来发现,兄弟结点的关系容易获得,但如果两结点不是兄弟结点而是堂兄结点时,这种关系就比较难找了,再不理想一点,如果两结点在的根结点父节点来自不同的结点,这种关系就更难确定了。
然后,我又想想到了从根结点出发仿照先序遍历的原理逐个打印结点的信息。很快,我发现,这种方法也是不行的,原因在于在先序遍历时可也借助栈或者递归栈来储存后面要访问的元素。但是想要找到这个元素的具体位置比较难,所以这种方法也很快被否认。
一直找不到可行的办法,想过用打表,也想过放弃。但是实在不想,一个原因是这是我的任务,如果我放弃或者做的不够完美,这将会影响我们组所有同学的成绩。另一个原因就是我一直认为,只要是能想的到的,就能用代码实现,这也是编程的精髓。无奈之下,我开始查找资料,突然,一张满二叉树的图片(其实是一张家谱图)给了我灵感。我为什么要根据结点选位置呢?完全可也根据位置确定这点的结点啊……所以我的最初构想是先打印出一个树形结构,然后根据每个结点的信息,将其输出到指定的位置,最后我就是用这种方法做到的。
3、构造哈弗曼树、获取哈弗曼编码
构造哈弗曼树的关键在于每次将权值最小的两个结点合并成一个新结点,如此循环,直到只剩一个结点。在获取编码时,从每一个叶子结点出发,访问哈弗曼树的根结点,所走过的路径刚好和编码相反。
任务分工及进度计划
我们组的成员还有王倩、求春磊、章力挺。最初分工时,王倩负责文件的读写操作;求春磊负责文件的编码压缩这一块;章力挺负责构造哈弗曼树、获取哈弗曼编码这一块;我负责疏导图形化输出、界面这一块。
总体来说,小组的进度比较慢,原因在于第一个程序还没写好。而且我的任务在中间,只有有了哈弗曼编码才能进行树形结构的输 出,所以在开始时,前面的问题我也解决了。下面谈谈我的见解。
文件的读写基本上没有什么大的问题,在统计字符频率时,我统计了128个常见字符,用了点小算法,效率比较高。在构造哈弗曼树时出现了瓶颈。究其原因,主要是以前没有接触过哈弗曼树,只有老师在上课时提到过,所以,面对一个新问题,首先需要时间去熟悉。等到哈弗曼树构造完成 ,获取编码也就相应比较简单了
数据结构选择、算法设计
前面已经提到,这个程序我基本上全都做了,现在就出现的问题 分析。
统计字符频率
常见的字符有128个,如果检索一个一个判断,那样的代价会很大的。由于128个字符分别对应1~~128的ASCII码值,所以可以定义一个128单元的数组,用字符代替下标。这样一来,对于每一个字符,其计算频率其出现一次,下标为该字符的元素递增1。这样可以高效的简单的统计每一个字符出现的频率。
构造哈弗曼树、获取哈弗曼编码
在问题分析中叶提到,构造哈弗曼树的关键是每次将两个权值最小的结点合并成一个新的结点。教材上采用0号元素不用,通过判断结点的父结点是否为0确定该结点是否要被计算。在我的计算中,我用0号结点,而且另外开辟了一个存放结点权值的副本数组,这样一来,每次都是对结点判断,被合并的结点权值变为-1,最后用副本还原所有结点的权值。结点的结构体定义如下:
struct Hafuman
{
int weight; //权值3
int parent; //父结点的位置
int left_child; //左孩子的位置
int right_child; //右孩子的位置
};
在构造哈弗曼树时,所有结点(包括本来有权值的结点和通过合并的到新的权值的结点),其地位是等价的,因此,最好把两种结点放在一起,这样方便访问。所以在有128种字符的前提下,开辟128*2个结点,前128个结点存放本来就有权值的结点,后127个结
您可能关注的文档
- 国家CAD考试题库.doc
- 国家计算机2级c语言题目.doc
- 国家计算机二级考试公共基础知识教.doc
- 国家预防腐败局网站建设项目需求书.doc
- 国脉实时操作系统材料.doc
- 国内ANSYS论坛精华.doc
- 国家计算机二级_C语言上机国二真题.doc
- 国内首款Android 4.0智能机即将问世.doc
- 国内外linux 学习网站网址大全.doc
- 国外程序员推荐:每个程序员都应读的书.doc
- 2024-2025学年度全国统考教师资格考试《教育教学知识与能力(小学)》题库含答案详解【预热题】.docx
- 2024-2025学年度全国统考教师资格考试《教育教学知识与能力(小学)》题库含答案详解【B卷】.docx
- 2024-2025学年度全国统考教师资格考试《教育教学知识与能力(小学)》题库检测试题打印及参考答案.docx
- 2024-2025学年度全国统考教师资格考试《教育教学知识与能力(小学)》题库含答案详解【基础题】.docx
- 2024-2025学年度全国统考教师资格考试《教育教学知识与能力(小学)》题库检测试题打印及完整答案.docx
- 2024-2025学年度全国统考教师资格考试《教育教学知识与能力(小学)》预测复习附答案详解(培优).docx
- 2024-2025学年度全国统考教师资格考试《教育教学知识与能力(小学)》题库及完整答案详解(必刷).docx
- 美国经济的前瞻指标们.docx
- 2024-2025学年度全国统考教师资格考试《教育教学知识与能力(小学)》预测复习含完整答案详解【历.docx
- 2024-2025学年度全国统考教师资格考试《教育教学知识与能力(小学)》预测复习及参考答案详解(达.docx
最近下载
- 机械仿生狗设计说明书.doc
- 2025《西藏自治区建设工程计价定额》A房屋建筑与装饰工程.pdf
- 传送带同步运行功能使用说明书-北京迪基透科技有限公司.PDF
- 2025河北邯郸魏县选聘村级党务(村务)工作者490人笔试模拟试题参考答案详解.docx VIP
- 心脑血管疾病防治健康教育讲座课件PPT.ppt VIP
- 2025河北邯郸临漳县选聘农村党务(村务)工作者笔试模拟试题及答案解析.docx VIP
- 国开一网一 电子商务概论 实践任务(B2B电子商务网站调研报告).doc
- Siemens西门子工业SITRANS LR500 系列 (mA HART) SITRANS LR500 系列 (mA HART)使用手册.pdf
- 一种驻车空调和卡车启动共用锂电池模组.pdf VIP
- 电子商务学习记录.docx VIP
文档评论(0)