哈弗曼树课程设计报告.doc
《哈弗曼树课程设计报告.doc》由会员分享,可在线阅读,更多相关《哈弗曼树课程设计报告.doc(16页珍藏版)》请在沃文网上搜索。
1、 课程设计(论文)摘要摘要1一 概述21.课程设计的目的22.课程设计的要求23.哈夫曼算法的实现2二 总体方案设计31.整体的设计思路32.算法的整体思路33.工作内容34.关键问题4三 详细设计51.总体设计流程图52.建立哈夫曼树53.编码功能64.译码功能6四 程序的调试与运行结果说明7五 课程设计总结10程序部分代码11参考文献14摘要随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础
2、。 算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。 数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。数据结构主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效
3、率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。 学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。一 概述1.课程设计的目的1理解和掌握该课程中的有关基本概念,程序设计思想和方法。2培养综合运用所学知识独立完成课题的能力。3培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。4掌握
4、从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。2.课程设计的要求一个完整的系统至少具有以下功能:(1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。(2) E:编码(Encoding)。利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。(3) D:译码(Decoding)。利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文
5、件Textfile中。3.哈夫曼算法的实现由哈夫曼树的构造过程可知,初始森林中共有n棵二叉树,每棵树中都仅有一个孤立的结点,它们既是根,又是叶子。然后将当前森林中的两棵根结点权值最小的二叉树,合并成一棵新二叉树。每合并一次,森林中就减少一棵树。显然,要进行n-l次合并,才能使森林中的二叉树的数目,由n棵减少到剩下一棵最终的哈夫曼树。并且每次合并,都要产生一个新结点,合并n-l次共产生n-1个新结点,显然它们都是具有两个孩子的分支结点。由此可知,最终求得的哈夫曼树中共有2n-1个结点,其中n个叶结点是初始森林中的n个孤立结点,并且哈夫曼树中没有度为1的分支结点。因此,在构造哈夫曼树时,可以设置一
6、个大小为2n-1的数组ht保存哈夫曼树中各结点的信息。二 总体方案设计1.整体的设计思路利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。这要求在发送端通过一个编码系统对待传输预先编码,在接收端将传来的数据进行译码。对于双工通道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。本课程设计实现这样的信息收发站,编写一个哈夫曼码的编/译码系统。系统共分为四个子系统:初始化哈夫曼树;编码;译码;打印哈夫曼树。输入相应的数字后按回车键即可进入相应的系统。在相应的系统内可完成相应的功能。各模块相对独立,每个模块用一个大型的函数来处理数据。2.算法的整体思路 本系
7、统能根据输入的字符数生成哈夫曼树,并自动输出各字符的哈夫曼编码。通过对单链表的结点查找,结点插入等一些算法建立一个根据头结点来插入数据的函数,通过对此函数的调用建立一个根据输入的数据来输入信息的函数。修改信息,排序,查找信息等模块的函数均用同样的方法处理。3.工作内容工作进程安排:系统设计,详细设计,编写代码,结果测试与分析。本人负责模块:译码功能。功能分析:译码(Decoding)。将codefile.txt文档中的编码以字符形式输出。译码原则:在完成Huffman编码后,我们利用其构建的哈夫曼编码树来进行译码。与编码过程不同,译码过程中,我们将用户输入的二进制代码串依次与字符集中的每个字符
8、的编码进行比较,从根结点出发,逐个读入电文中的二进制码;若代码为“0”,则走左子树的根结点,否则走向右子树的根结点;一旦到达叶子结点,便译出代码所对应的字符。然后又重新从根结点开始继续译码,直到二进制电文结束。实现代码:void Decoding() cout 下面对根目录下文件codefile.txt中的字符进行译码 endl; FILE *codef, *txtfile; if (txtfile = fopen(Textfile.txt, w) = NULL)/ w 只写 cout 不能打开文件 endl; if (codef = fopen(codefile.txt, r) = NULL
9、)/ r 只读 cout 不能打开文件 endl; char *work, *work2, i2; int i4 = 0, i, i3; unsigned long length = 10000; work = (char*)malloc(length *sizeof(char); fgets(work, length, codef); work2 = (char*)malloc(length *sizeof(char); i3 = 2 * n - 1; for (i = 0; *(work + i - 1) != 0; i+) i2 = *(work + i); if (HTi3.lchil
10、d = 0) *(work2 + i4) = *(z + i3 - 1); i4+; i3 = 2 * n - 1; i-; else if (i2 = 0) i3 = HTi3.lchild; else if (i2 = 1) i3 = HTi3.rchild; *(work2 + i4) = 0; fputs(work2, txtfile); cout 译码完成 endl 内容写入根目录下的文件txtfile.txt中 endl endl; cout work2endl; free(work); free(work2); fclose(txtfile); fclose(codef);4.关
11、键问题(1)哈夫曼树的构建,输入字符与权值后哈夫曼编码的生成。(2)编码(Encoding)。输入要编码的字符,存入text.txt文档中,通过编码程序,将字符以哈夫曼编码形式存在codefile.txt文档中。(3)将哈夫曼树以树型打印出来。三 详细设计1.总体设计流程图图3-1 主要功能流程图哈夫曼树编码建立哈夫曼树编码译码打印哈夫曼树打印哈夫曼树退出2.建立哈夫曼树功能:1.进入输入系统后选择需要进行的操作步骤。输入待编码的字符数,并且随即输入编码字符的权值。 建立哈夫曼树输入字符及权值对权值进行从小到大排序输出编码结束创建哈夫曼树,放入hfmTree.txt文件中图3-2 建立哈夫曼树
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈弗曼树 课程设计 报告