《数据结构》课程设计报告--哈夫曼树编码译码.docx

上传人:夺命阿水 文档编号:890003 上传时间:2024-01-08 格式:DOCX 页数:15 大小:48.09KB
返回 下载 相关 举报
《数据结构》课程设计报告--哈夫曼树编码译码.docx_第1页
第1页 / 共15页
《数据结构》课程设计报告--哈夫曼树编码译码.docx_第2页
第2页 / 共15页
《数据结构》课程设计报告--哈夫曼树编码译码.docx_第3页
第3页 / 共15页
《数据结构》课程设计报告--哈夫曼树编码译码.docx_第4页
第4页 / 共15页
《数据结构》课程设计报告--哈夫曼树编码译码.docx_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《《数据结构》课程设计报告--哈夫曼树编码译码.docx》由会员分享,可在线阅读,更多相关《《数据结构》课程设计报告--哈夫曼树编码译码.docx(15页珍藏版)》请在课桌文档上搜索。

1、数据结构课程设计数据结构课程设计报告设计题目:哈夫曼树编码译码摘要哈夫曼编/译器设计:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求这发送端通过一个编码系统对待传数据预先编码,在发送端将传来的数据进行译码(复原)。对于双工信道。每端都需要一个完整的编译码系统。本程序将为这样的信息收发站写一个哈夫曼的编译码系统。哈夫曼编码/译码程序运行步骤:字查找,从英文文章中识别出字符,并把字符插入到一棵二叉排序树中。哈夫曼树中序遍历,是为了把英文文章中的不重复的字符保存起来。哈夫曼编码,在已经构造好的霍夫曼树中从每个叶子结点出发追溯到树根,逆向找出霍夫曼树中叶子结

2、点的编码,规定:树中每个结点的左分支标上0,右分支标上Io哈夫曼译码利用霍夫曼树实现对产生的编码文件的译码,译码过程为:从根结点出发,按二进制位串的0或1进入左分支或右分支,当到达叶子结点时译出该叶子对应的单词或标点符号,若该编码文件尚未结束,则回到根结点继续进行上述过程。运行环境:WindOWSXP语言环境:简体中文软件大小:51KB编写工具:MicrosoftVisualstudio2008AbstractInformation:Huffmancodingusedincommunicationcangreatlyimprovethechannelutilization,reducedtra

3、nsmissiontime,andlowertransmissioncosts.However,thisrequiresthatthesenderthroughacodingsystemforpre-treatmentdata-coding,thetransmitterwillbesentfordecodingdata(recovery).Fordual-channel.Eachsideneedsacompleteencryptionsystem.ThisprocedurewillthisinformationhubsHuffmanwasoneoftheencryptionsystem.Hof

4、fmanncodeforcodingprocedurestorunthestepsand:wordfromenglishinthewordsandpunctuationmarks;andinsertthewords,andpunctuationmarksasecondsortofatree,thetraversalorderhoffmann,toenglisharticlesdonotrepeatthewordsandpunctuationmarks.Hoffmanntreeinordertotraverse;keepthecodehasbeenconstructedinhoffmanngoo

5、dhafmantreeleavesfromthestartdatesbacktotabulatetheroots;Hoffmanndecoding;hafmantheimplementationofthecodetothecoding,codingproceduresfor:fromstarttotabulatetherootsofbinaryof0or1totheleftorright,asubdivisionofabranchistotabulatetheleavesoftheleavestranslatethewordsorpunctuationmarks,ifthecodefileis

6、notfinishedbutistotabulatetheprocessofcontinuing,allthecode,codingproceduresareinthefile.一、问题描述4二、需求分析4三、概要设计5四、数据结构设计7五、算法设计7六、程序测试与实现9七、调试分析12八、心得体会12一、问题描述1、题目内容:利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。试写一个哈夫曼编/译码系统。2、基本要求:一个完整的系统应具有以下功能:(1)初始化。从终端读

7、入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件中。(2)编码。利用已建好的哈夫曼树对文件中的正文进行编码,然后将结果存入文件中。(3)译码。利用已建好的哈夫曼树将文件中的代码进行译码,结果存入文件中。(4)完成数据测试,要求编码字符不低于15个,编码文件的长度不低于50个字符。(5)计算平均编码长度。二、需求分析一个完整的系统应具有以下功能:1、 初始化(InitialiZatiOn)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树。对赫夫曼树初始化。根据书本算法,对树进行从叶子到根的逆向求每个字符的赫夫曼编码。更新赫夫曼树。2、 编码(EnCoding)。

8、利用已建好的哈夫曼树正文进行编码。将终端输入须要编码的语句逐字在已建好的赫夫曼树中查找。当在树中找到相匹配字符时,将该字符对应的赫夫曼编码同意保存。最后将数组中的编码在终端输出。3、 译码(DeCoding)。利用已建好的哈夫曼树将文件中的代码进行译码。获取须要译码的编码组。将编码逐一读入,并在赫夫曼中根据左0右1去查找字符Q将译好的语句在终端输出。三、概要设计操作集合:voidSelect(intcur,int&rl,int&r2);nodes1Cllr中选择双亲为,权值最小的两个结点rl,r2voidCreatHuffmanTree(charch,intw,intn);public:Huf

9、fmanTree(charch,intw,intn);由字符,权值和字符个数构造哈夫曼树virtualHuffmanTree();析构函数stringEncode(charch);编码LinkListDecode(stringstrCode);译码本程序主要用到了三个算法。(1)哈夫曼编码;在初始化过程中间,要用输入的字符和权值建立哈夫曼树并求得哈夫曼编码。先将输入的字符和权值存放到一个结构体数组中,建立哈夫曼树,将计算所得的哈夫曼编码存储到另一个结构体数组中。(2)串的匹配;在编码过程中间,要对已经编码过的代码译码,可利用循环,将代码中的与哈夫曼编码的长度相同的串与这个哈夫曼编码比较,如果相

10、等就回显。(3)二叉树的遍历在印哈夫曼树(T)的中,因为哈夫曼树也是二叉树,所以就要利用二叉树的先序遍历将哈夫曼树输出。四、数据结构设计structNodechardata;/节点数据域为字符型Node*next;Node()next=NULL;Node(charitem,Node*link=NULL)data=item;next二link;)structHuffmanTreeNode(intweight;unsignedintparent,IeftChild,rightChild;/双亲,左右孩子域HuffmanTreeNode();HuffmanTreeNode(intw,intp=O,i

11、nt!Child=O,intrChild二O);)五、算法设计1、算法分析(必须要用语言进行描述)构造树:初始化:每个字符就是一个结点,字符的频度就是结点的权:1、将结点按频度从小到大排序;2、选取频度最小的两个结点,以它们为儿子,构造出一个新的结占八、,新结点的权值就是它两个儿子的权值之和;构造之后,从原来的结点序列里删除刚才选出的那两个结点,但同时将新生成的结点加进去;3、如果结点序列里只剩下一个结点,表示构造完毕,退出。否则回到第一步。编码:编码:可以假定,对某个结点而言,其左孩子在当前阶段的编码为0,右孩子的编码为1。这样就可以通过”树的遍历”的方式来生成字长一编码对照表来到这里,基本

12、上艰苦的已经完成了,对某个具体的字符串编码和解码就只是简单的“查表一替换”的工作了。解码:解码也是个简单的查表、替换过程。如果利用该种编码发送字符串,则它的”字宁含一编码侧应表也必须发送过去,不然对方是不知道怎么解码的。对给出的一串编码,从左向右,将编码组合起来并查表.2、算法流程图六、程序测试与实现1、函数之间的调用关系VoidmainCreatHuffmanTreeEncodeDecode2、主程序intmain(void)(char*ch;int*w,n,i;CoUt输入字符集中字符的个数:n;ch=newcharn;w=newintn;COUt输入字符集中的字符:endl;for(i=

13、0;ichi;COUt输入字符集中的字符的权值:endl;for(i=0;iwLi;HuffmanTreehmTree(ch,w,n);stringStrText,StrCode;COUtstrText;cout文本串StrTeXt.c_str()编码为:;for(intpos=0;posStrText.IengthO;pos+)!stringStrTmp=hmTree.Encode(strTextpos);coutstrTmp.c_str();)coutendl;system(,PAUSE,z);COUtstrCode;cout编码串StrCOde.c_str()来表示P所指的变量,又由于结

14、点类型是一个结构类型,因此可用P-data和p-next分别表示结点的数据域变量和指针域变量。指针变量的值要么为空(NULL),不指向任何结点;要么其值为非空,即它的值是一个结点的存储地址。注意,当P为空值时,则它不指向任何结点,此时不能通过P来访问结点,否则会引起程序错误。八、心得体会通过这次数据结构课程设计,使我对软件的界面设计有了一个比较深刻的了解,对各种内部排序方法的性能有了清晰的认识,使我感觉到到,一个优秀的软件,不仅仅是可以运行的,更应该具有人性化的界面,协调的布局,合理的结构,良好的性能和一定的容错性一个人要完成所有的工作是非常困难和耗时的.在以后的学习中我会更加注意各个方面的能

15、力的协调发展,选择一两门技术进行深入研究,成为一个可以统筹全局.又有一定技术专长的优秀的程序开发人员.通过这次实验我也着实又感受了一次编程的乐趣,从中也学到了不少知识。虽然都说“程序=数据结构+算法”,但我在学习运用数据结构编程之前,并没能深刻体会到这一点,直到这次课设实践。现在编程感觉完全不同了。在编写一个程序之前,自己能够综合考各种因素,首先选取自己需要的数据结构,是树还是图或是别的什么?然后选定一种或几种存储结构来具体的决定后面的函数的主要风格。最后在编写每一个函数之前,可以仔细斟酌比对,挑选出最适合当前状况的算法。这样,即使在完整的程序还没有写出来之前,自己心中已经有了明确的原图了。这样无形中就提高了自己编写的程序的质量。另外,我还体会到深刻理解数据结构的重要性。只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。我以前对递归算法一直很害怕,总是看不明白究竟这递归是怎么进行的。在这次实验中我终于克服了这一障碍,一次次单步执行书中递归函数的例子,并一遍遍在心中自己默默的走,终于弄明白了,真的是功夫不负有心人啊!同时我还根据自己的理解写出了类似的递归函数实现了新的功能,真是受益良多啊!在这次实验中,我对参数的调用也进行了很多种尝试,己经能够相对准确的选择合适的参数形式来实现函数之间的数据传输交互了。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号