学号_姓名(指导教师)-课程设计报告参考模板
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈尔滨理工大学
课程设计
(数据结构)
题目:
班级:计算机科学与技术计14-9
姓名:杨永强1404010927
指导教师:赵之莉
系主任:林克正
2016年03月10日
一.问题的描述及设计的目的
设计一个哈夫曼编码、译码系统。对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件;反过来,可将编码文件译码还原为一个文本文件。
(1)从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt);
(2)统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理);
(3)根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;(4)将文本文件利用哈夫曼树进行编码,存储成压缩文件(编码文件后缀名.huf)
(5)用哈夫曼编码来存储文件,并和输入文本文件大小进行比较,计算文件压缩率;
(6)进行译码,将huf文件译码为ASCII编码的txt文件,与原txt 文件进行比较。
根据上述过程可以知道该编码译码器的关键在于字符统计和哈夫曼树的创建以及解码。
哈夫曼树的理论创建过程如下:
一、构成初始集合
对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
二、选取左右子树
在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
三、删除左右子树
从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
四、重复二和三两步,
重复二和三两步,直到集合F中只有一棵二叉树为止。
因此,有如下分析:
1. 我们需要一个功能函数对ASCII码的初始化并需要一个数组来保存它们;
2. 定义代表森林的数组,在创建哈夫曼树的过程当中保存被选中的字符,即给定报文中出现的字符,模拟哈夫曼树选取和删除左右子树的过程;
3. 自底而上地创建哈夫曼树,保存根的地址和每个叶节点的地址,即字符的地址,然后自底而上检索,首尾对换调整为哈夫曼树实现哈弗曼编码;
4. 从哈弗曼编码文件当中读入字符,根据当前字符为0或者1的状况访问左子树或者右孩子,实现解码;
5. 使用文件读写操作哈夫曼编码和解码结果的写入;
二.应具备的功能
1.定义结构体类型的signode 作为哈夫曼树的节点,定义结构体
类型的hufnode 作为哈夫曼编码对照表的节点,定义HFM类
实现对哈夫曼树的创建,利用其成员函数完成哈夫曼编码译码
的工作。
2.定义signode 类型的全局数组SN[256](为方便调用,之后的
forest[256],hufNode[256]均为全局数组), 保存ASCII编码的
字符,是否在文章中出现(bool类型)以及出现次数(int类
型,权重),左右孩子节点位置,父节点位置信息;
3.为节省存储空间,定义signode * 类型的全局数组forest[256],
模拟森林,在创建哈夫曼树的过程中保存出现字符的指针,模
拟哈夫曼树选取和删除左右子树的过程;
4.定义hufnode 类型的全局数组hufNode[256],在编码时最为哈
夫曼编码对照表的节点,char 型c保存字符,int code[100]保存其
哈夫曼编码;
5.定义HFM类,主要保存哈夫曼树的根节点指针,但其丰富的功
能函数将实现哈夫曼编码译码的工作及其他功能;
三.设计思想
四.环境和工具
五.详细设计(源程序清单)
六.结果分析及算法评价
- I-
哈尔滨理工大学课程设计报告
- 2-