《大数据结构课程设计实验报告材料哈夫曼树地应用》由会员分享,可在线阅读,更多相关《大数据结构课程设计实验报告材料哈夫曼树地应用(19页珍藏版)》请在金锄头文库上搜索。
1、word计算机学院信管专业数据结构课程设计题 目: 哈夫曼树的应用 班 级:姓 名:学 号:同组人某某:起迄日期:课程设计地点:指导教师:评阅意见:成绩评定:评阅人: 日期:完成日期:2012年12月目 录一、 需求分析3二、 概要设计4三、 详细设计6四、 调试分析和测试结果7五、 心得体会和总结 10六、 参考文献 10七、 附录 11一、 需求分析一实验要求要求用到数据结构课上学到的线性表的知识,所以就要充分而清晰的理解关于线性表的知识。要某某现的根本功能很简单,只有删除和插入,增加功能也不过是加上修改。这些在数据结构课上已经讲过,只要能够理解关于线性表的几个相关的根本算法就可以了。问题
2、是将输入的信息保存入文件和从文件输出。这里根本是自学的内容,而且要考虑到是否要自行选择保存的磁盘。综上,做这个课题,要具备的知识就是线性表的根本算法,文件的保存和读取算法,必要的C或者C+知识本次我将使用C+实现,以与丰富的程序调适经验。二实验任务一个完整的系统应具有以下功能:功能1从终端读入字符集大小n,以与n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式比如树显示在终端上;功能2利用已经建好的哈夫曼树如不在内存,如此从文件htmTree中读入,对文件ToBeTran中的正文进展编码,然后将结果存入文件CodeFile中,并输出结果,将文件C
3、odeFile以紧凑格式先是在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrint中。功能3利用已建好的哈夫曼树将文件CodeFile中的代码进展译码,结果存入文件TextFile中,并输出结果。三实验步骤分步实施:1) 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2) 完成最低要求:完成功能1;3) 进一步要求:完成功能2和3。有兴趣的同学可以自己扩大系统功能。要 求 :1界面友好,函数功能要划分好2) 总体设计应画一流程图3) 程序要加必要的注释4) 要提供程序测试方案5程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值
4、的。二、概要设计一 设计思想哈夫曼树用邻接矩阵作为存储结构,借助静态链表来实现遍历。二 函数间的关系如下列图:主函数显示表头初始化树输入字符编码译码打印编码打印哈夫曼树选最小两个权值Select()三数据结构与算法设计哈夫曼编译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进展译码 。在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,如此从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。最简单的二进制编码方式是等长编码。假如
5、采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。哈夫曼树课用于构造使电文的编码总长最短的编码方案。其主要流程图如如下图所示。开始结点数是否大于1将data和权值赋给ht输出根结点和权值调用SELECT函数计算根结点函数父结点为两子结点之和输出两子结点和已构造的结点是否为根结点?左子是否为空?此时编码为0I2*N?I+编码为1完毕否否否右子是否为空是是否否是是是哈夫曼树编译码器流程图三、详细设计功能函数模块划分void main()void printhead()void printree(HuffmanTree HT,int w
6、) /打印赫夫曼树void coprint(HuffmanTree start,HuffmanTree HT)/打印代码文件void printcode() /打印代码void decode() /完成译码功能void encode() /完成编码功能void inputcode() void init()void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)void select(HuffmanTree t,int i,int &s1,int &s2)int min(HuffmanTree t,int i)/找两个最小
7、的权值1哈夫曼编码:首先定义函数,找出全部权值中最小的两个,然后定义一个变量,使他始终成为最小的那个。再将两个函数最为叶子结点,并得到一个父亲节点,此父亲节点的权值为其叶子节点的权值之和。并将此父亲节点的权值与其余权值进展比拟,重新选出两个最小的权值,再进展上述步骤,直到所有权值形成了一颗二叉树,而此二叉树就是我们所说的最优二叉树,即哈夫曼树。以上为哈夫曼树的建立过程,下面为哈夫曼编码的过程,从叶子节点出发,假如此叶子节点为其父亲节点的左孩子,如此将其编码为0,假如为右孩子,如此将其编码为1,然后为其父亲节点编码,假如为祖先的左孩子,如此变为0,为右孩子如此为1,依次向上一层进展遍历,直到遍历
8、到根节点,停止编码。2译码:对于已经建好的哈夫曼树,要对其进展译码,首先从根出发如果编码为0,如此往左孩子遍历,如果编码为1,如此往右孩子遍历,直到遍历到叶子节点,便求得该子串相应的字符。3初始化哈夫曼链表:首先输入结点个数,再将字符与权值输入,调用编码函数,得到每个字符编码并将其输出。最后将哈夫曼编码写入文件。4完成编码功能:打开目录下文件tobetran.txt,读取里面的字符,对其进展编码后,将编码写入目录下的codefile.txt中。5完成译码功能:打开根目录下codefile.txt文件,读取里面的编码,对其中的编码进展译码,并将得到的内容写入根目录下的文件txtfile.txt中
9、。6打印编码7打印哈夫曼树四、调试分析和测试结果一初始化哈夫曼链表二编码字符三编码四译码五打印编码六打印哈夫曼函数五、心得体会与总结对于本次课程设计,主要是需要掌握哈夫曼树建立、哈夫曼编码以与哈夫曼译码的算法。并能将其熟练应用于编译码器的完成。经过这次的课程设计,使我们更加了解了数据结构,也更深入地了解了哈夫曼编码与译码算法,课程设计的题目比我们平常的实验内容要难,完成它不仅需要有厚实的语言根底,而且还要熟练掌握哈夫曼编码与译码的算法,另外对于文件的根本操作也需要熟悉。通过数据结构课程设计,我的C+语言水平有了比拟大的提高其中。C+语言关于类的操作理解的比以前深刻不少。另外是数据结构方面的提高
10、对哈夫曼树的构造与哈夫曼码方面也有不少的提高。 在项目中也出现了很多的问题,最大的问题就是对程序设计框架结构的不了解,在实现代码与功能的连接时经常会出现各种不同的错误,在实现一些功能时系统常常会报错。许多错误不知从哪修改以致拖了整个设计的后腿。课程设计中,既回顾了很多以前的东西,也发现了很多的问题以前都没遇见过的,收获很大。 通过本次数据结构的课程设计,我学习了很多在上课没懂的知识,并对求哈夫曼树与哈夫曼编码/译码的算法有了更加深刻的了解,更巩固了课堂中学习有关于哈夫曼编码的知识。 此次哈夫曼树的应用系统的设计让自己对数据结构的了解更深入。六、参考文献C+面向对象程序设计教程第三版 陈维兴 林
11、小茶编著 清华大学数据结构C语言版严蔚民 吴伟民编著 清华大学六、附录源程序:#include #include #include #include #include const int UINT_MAX=1000;typedef struct /哈夫曼树的存储表示 int weight; /权值int parent,lchild,rchild; /父节点,左孩子结点,右孩子结点HTNode,* HuffmanTree; /动态分配数组存储哈夫曼树typedef char *HuffmanCode;/动态分配数组存储哈夫曼编码表/-全局变量-HuffmanTree HT; /代表哈夫曼树Huf
12、fmanCode HC; /代表哈夫曼编码int *w,i,j,n; char *z;int flag=0; int numb=0;/ -求哈夫曼编码-void line()/画分割线的函数coutn-n;int min(HuffmanTree t,int i)/找两个最小的权值 int j,flag;int k=UINT_MAX; / 取k为不小于可能的值for(j=1;j=i;j+)if(tj.weights2)/ s1为最小的两个值中序号较小的那个j=s1;s1=s2;s2=j;void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)int m,i,s1,s2,start;int c,f;HuffmanTree p;char *cd;if(n=1)retur