炀哈夫曼树的应用课程设计湖北理工.docx
- 文档编号:28628782
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:14
- 大小:139.54KB
炀哈夫曼树的应用课程设计湖北理工.docx
《炀哈夫曼树的应用课程设计湖北理工.docx》由会员分享,可在线阅读,更多相关《炀哈夫曼树的应用课程设计湖北理工.docx(14页珍藏版)》请在冰豆网上搜索。
炀哈夫曼树的应用课程设计湖北理工
编号:
B04900083
学号:
20144041023
课程设计
教学院
计算机学院
课程名称
数据结构与算法课程设计
题目
哈夫曼树的应用
专业
计算机科学与技术
班级
计算机科学与技术
(2)班
姓名
炀
同组人员
罗义飞范永康唐傲
指导教师
成俊
2015
年
12
月
27
日
课程设计任务书
2015~2016学年第1学期
学生姓名:
炀专业班级:
计算机科学与技术
(2)班
指导教师:
成俊工作部门:
计算机学院
一、课程设计题目:
哈夫曼树的应用
二、课程设计内容
1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;
2)利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件Text.txt中的正文进行编码,然后将结果存入文件Code.txt中。
3)利用已建好的哈夫曼树将文件Code.txt中的代码进行译码,结果存入文件Text.txt中,并输出结果。
三、进度安排
1.分析问题,给出数学模型,选择数据结构。
2.设计算法,给出算法描述,给出源程序清单。
3.编辑、编译、调试源程序,撰写课程设计报告。
四、基本要求
1.界面友好,函数功能要划分好
2.总体设计应画一流程图
3.程序要加必要的注释
4.要提供程序测试方案
5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
目录
一、概述3
(一)课程设计目的3
(二)课程设计实验要求3
二、总体设计4
(一)设计思想4
(二)数据结构与算法设计4
(三)个人任务6
三、详细设计7
(一)功能函数模块划分7
(二)个人任务7
四、调试分析和测试结果10
五、心得体会与总结13
六、参考文献14
一、概述
1.1课程设计目的
1.理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养综合运用所学知识独立完成课题的能力。
3.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
1.2课程设计实验要求
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件text.txt中的正文进行编码,然后将结果存入文件Code中,并输出结果,将文件Code以紧凑格式先是在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrint中。
利用已建好的哈夫曼树将文件Code中的代码进行译码,结果存入文件Text中,并输出结果。
二、总体设计
2.1设计思想
哈夫曼树用邻接矩阵作为存储结构,借助静态链表来实现遍历。
2.2数据结构与算法设计
哈夫曼编\译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码。
在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。
构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。
最简单的二进制编码方式是等长编码。
若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送
其主要流程图如下图所示。
哈夫曼树编\译码器流程图
2.3个人任务
我在组内负责哈弗曼树的数据结构设计与哈弗曼树的译码和哈夫曼树的数据结构:
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。
n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:
(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复
(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
构造过程如下:
(a) 有权值为1,2,3,4四棵树;
(b) 由于树1,2的权值处于最小和次最小,所以选中,并合成为一棵树,小的权值位于左边;
(c) 从3,4,(1,2 = 3)三棵树里面选择权值最小的和次小的,我们选中3和(1,2)合成新树(3,(1,2)= 6);
(d) 最后选出新树(4,(3,(1, 2)))
哈夫曼树的译码:
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。
n个权值分别设为w1、w2、…、wn,则哈夫曼树的构造规则为:
(1)将w1、w2、…,wn看成是有n棵树的森林(每棵树仅有一个结点);
(2)在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和; (3)从森林中删除选取的两棵树,并将新树加入森林; (4)重复
(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树
三、详细设计
3.1功能函数模块划分
(1)哈夫曼编码:
首先定义函数,找出全部权值中最小的两个,然后定义一个变量,使他始终成为最小的那个。
再将两个函数最为叶子结点,并得到一个父亲节点,此父亲节点的权值为其叶子节点的权值之和。
并将此父亲节点的权值与其余权值进行比较,重新选出两个最小的权值,再进行上述步骤,直到所有权值形成了一颗二叉树,而此二叉树就是我们所说的最优二叉树,即哈夫曼树。
以上为哈夫曼树的建立过程,下面为哈夫曼编码的过程,从叶子节点出发,若此叶子节点为其父亲节点的左孩子,则将其编码为0,若为右孩子,则将其编码为1,然后为其父亲节点编码,若为祖先的左孩子,则变为0,为右孩子则为1,依次向上一层进行遍历,直到遍历到根节点,停止编码。
(2)译码:
对于已经建好的哈夫曼树,要对其进行译码,首先从根出发如果编码为0,则往左孩子遍历,如果编码为1,则往右孩子遍历,直到遍历到叶子节点,便求得该子串相应的字符。
(3)初始化哈夫曼链表:
首先输入结点个数,再将字符及权值输入,调用编码函数,得到每个字符编码并将其输出。
最后将哈夫曼编码写入文件。
(4)完成编码功能:
打开目录下文件text.txt,读取里面的字符,对其进行编码后,将编码写入目录下的code.txt中。
(5)完成译码功能:
打开根目录下code.txt文件,读取里面的编码,对其中的编码进行译码,并将得到的内容写入根目录下的文件text.txt中。
(6)打印编码
(7)打印哈夫曼树
3.2个人任务
我在组内组要负责哈弗曼树的数据结构设计与哈弗曼树的译码。
1)数据结构设计:
typedefstruct//哈夫曼树的存储表示
{
intweight;//权值
intparent,lchild,rchild;//父节点,左孩子结点,右孩子结点
}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树
typedefchar**HuffmanCode;//动态分配数组存储哈夫曼编码表
//-----------全局变量-----------------------
HuffmanTreeHT;//代表哈夫曼树
HuffmanCodeHC;//代表哈夫曼编码
int*w,i,j,n;
char*z;
intflag=0;
intnumb=0;
2)译码:
voiddecode()//完成译码功能
{
cout<<"下面对根目录下文件code.txt中的字符进行译码"< FILE*codef,*text; if((text=fopen("Text.txt","w"))==NULL) { cout<<"不能打开文件"< } if((codef=fopen("code.txt","r"))==NULL) { cout<<"不能打开文件"< } char*tbdc,*outext,i2; intio=0,i,m; unsignedlonglength=10000; tbdc=(char*)malloc(length*sizeof(char));//分配空间 fgets(tbdc,length,codef); outext=(char*)malloc(length*sizeof(char));//分配空间 m=2*n-1; for(i=0;*(tbdc+i)! ='\0';i++)//进入循环 { i2=*(tbdc+i); if(HT[m].lchild==0) { *(outext+io)=*(z+m-1); io++; m=2*n-1; i--; } elseif(i2=='0')m=HT[m].lchild; elseif(i2=='1')m=HT[m].rchild; } *(outext+io)='\0'; fputs(outext,text); cout<<"译码完成"< free(tbdc); free(outext); fclose(text); fclose(codef); } 四、调试分析和测试结果 (一)初始化哈夫曼链表: 首先输入要执行的操作i,然后输入8个字符按回车结束,以及每个字符的权值初始化结束。 (二)编码字符: 根据设计好的程序,输入w执行编码字符的操作,然后输入想要编码的字符注意必须是初始化时输入过的字符。 (三)编码: 根据提示,输入e执行对text.txt文件的哈夫曼树的编码,编码写入code.txt文件下。 (四)译码: 对写入到code.txt代码译码,并输入d进行译码,内容写入text.txt文件下。 (五)打印编码: 根据提示,输入p对编码和译码后的字符进行打印编码。 (六)打印哈夫曼函数: 最后输入t打印哈夫曼树,显示打印结果和打印结束。 五、心得体会与总结 对于本次课程设计,主要是需要掌握哈夫曼树建立、哈夫曼编码以及哈夫曼译码的算法。 并能将其熟练应用于编译码器的完成。 经过这次的课程设计,使我们更加了解了数据结构,也更深入地了解了哈夫曼编码与译码算法,课程设计的题目比我们平常的实验内容要难,完成它不仅需要有厚实的语言基础,而且还要熟练掌握哈夫曼编码与译码的算法,另外对于文件的基本操作也需要熟悉。 通过数据结构课程设计,我的C++语言水平有了比较大的提高其中。 C++语言关于类的操作理解的比以前深刻不少。 另外是数据结构方面的提高对哈夫曼树的构造及哈夫曼码方面也有不少的提高。 在项目中也出现了很多的问题,最大的问题就是对程序设计框架结构的不了解,在实现代码与功能的连接时经常会出现各种不同的错误,在实现一些功能时系统常常会报错。 许多错误不知从哪修改以致拖了整个设计的后腿。 课程设计中,既回顾了很多以前的东西,也发现了很多的问题以前都没遇见过的,收获很大。 通过本次数据结构的课程设计,我学习了很多在上课没懂的知识,并对求哈夫曼树及哈夫曼编码/译码的算法有了更加深刻的了解,更巩固了课堂中学习有关于哈夫曼编码的知识。 此次哈夫曼树的应用系统的设计让自己对数据结构的了解更深入。 六、参考文献 [1]严蔚敏,吴伟民.数据结构(C语言版)[M].(第一版)北京: 清华大学出版社.1997 [2]SartajSahni.DataStructure,Algorithms,andApplicationinC++.TheMcGraw-HillCompanyInc.1998[M](第一版)(数据结构、算法与应用——C++语言描述.北京: 机械工业出版社.1999 [3]WillanFord,WillianTopp.DataStructureswithC++.NewJersey: PrenticeHallInc,AdivisionSimon&SchusterCompany,1996[M](第一版)(数据结构——C++语言描述.北京: 清华大学出版社,1997 [4]徐孝凯.数据结构实用教程(C/C++描述)[M].(第一版)北京: 清华大学出版社.1999 [5]陈慧南.数据结构(使用C++语言描述)[M].(第一版)南京: 东南大学出版社.2001 [6]殷人昆,陶永雷,谢若阳等.数据结构(用面向对象方法与C++描述)[M].(第一版)北京: 清华大学出版社.1999 数据结构与算法课程设计成绩评定表 1、课程设计答辩或质疑记录 1) 2) 3) 2、答辩情况 a)未能完全理解题目,答辩情况较差□c)理解题目较清楚,问题回答基本正确□ b)部分理解题目,答辩情况较差□d)理解题目透彻,问题回答流利□ 3、课程设计报告 a)内容: 不完整□完整□详细□ b)方案设计: 较差□合理□非常合理□ c)实现: 未实现□部分实现□全部实现□ d)文档格式: 不规范□基本规范□规范□ 考勤成绩: , 占总成绩比例10% 答辩成绩: , 占总成绩比例30% 课程设计论文成绩: , 占总成绩比例60% 课程设计总成绩: 4、课程设计评语 指导教师签字: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 炀哈夫曼树 应用 课程设计 湖北 理工