《《数据结构》课程设计报告--哈夫曼树编码译码.docx》由会员分享,可在线阅读,更多相关《《数据结构》课程设计报告--哈夫曼树编码译码.docx(14页珍藏版)》请在第一文库网上搜索。
1、数据结构课程设计数据结构课程设计报告设计题目:哈夫曼树编码译码摘要哈夫曼编/译器设计:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求这发送端通过一个编码系统对待传数据预先编码,在发送端将传来的数据进行译码(复原)。对于双工信道。每端都需要一个完整的编译码系统。本程序将为这样的信息收发站写一个哈夫曼的编译码系统。哈夫曼编码/译码程序运行步骤:字查找,从英文文章中识别出字符,并把字符插入到一棵二叉排序树中。哈夫曼树中序遍历,是为了把英文文章中的不重复的字符保存起来。哈夫曼编码,在已经构造好的霍夫曼树中从每个叶子结点出发追溯到树根,逆向找出霍夫曼树中叶子结
2、点的编码,规定:树中每个结点的左分支标上0,右分支标上1。哈夫曼译码利用霍夫曼树实现对产生的编码文件的译码,译码过程为:从根结点出发,按二进制位串的0或1进入左分支或右分支,当到达叶子结点时译出该叶子对应的单词或标点符号,若该编码文件尚未结束,则回到根结点继续进行上述过程。运行环境:windowsXP语言环境:简体中文软件大小:51KB编写工具:MicrosoftVisua1studio2008AbstractInformation:Huffmancodingusedincommunicationcangreat1yimprovethechanne1uti1ization,reducedtra
3、nsmissiontime,and1owertransmissioncosts.However,thisrequiresthatthesenderthroughacodingsystemforpre-treatmentdata-coding,thetransmitterwi11besentfordecodingdata(recovery).Fordua1-channe1.Eachsideneedsacomp1eteencryptionsystem.Thisprocedurewi11thisinformationhubsHuffmanwasoneoftheencryptionsystem.Hof
4、fmanncodeforcodingprocedurestorunthestepsand:wordfromeng1ishinthewordsandpunctuationmarks;andinsertthewords,andpunctuationmarksasecondsortofatree,thetraversa1orderhoffmann,toeng1ishartic1esdonotrepeatthewordsandpunctuationmarks.Hoffmanntreeinordertotraverse;keepthecodehasbeenconstructedinhoffmanngoo
5、dhafmantree1eavesfromthestartdatesbacktotabu1atetheroots;Hoffmanndecoding;hafmantheimp1ementationofthecodetothecoding,codingproceduresfor:fromstarttotabu1atetherootsofbinaryof0or1tothe1eftorright,asubdivisionofabranchistotabu1atethe1eavesofthe1eavestrans1atethewordsorpunctuationmarks,ifthecodefi1eis
6、notfinishedbutistotabu1atetheprocessofcontinuing,a11thecode,codingproceduresareinthefi1e.一、问题描述4二、需求分析4三、概要设计5四、数据结构设计7五、算法设计7六、程序测试与实现9七、调试分析12八、心得体会12一、问题描述1、题目内容:利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。试写一个哈夫曼编/译码系统。2、基本要求:一个完整的系统应具有以下功能:(1)初始化。从终端读
7、入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件中。(2)编码。利用已建好的哈夫曼树对文件中的正文进行编码,然后将结果存入文件中。(3)译码。利用已建好的哈夫曼树将文件中的代码进行译码,结果存入文件中。(4)完成数据测试,要求编码字符不低于15个,编码文件的长度不低于50个字符。(5)计算平均编码长度。二、需求分析一个完整的系统应具有以下功能:1、 初始化(Initia1iZation)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树。对赫夫曼树初始化。根据书本算法,对树进行从叶子到根的逆向求每个字符的赫夫曼编码。更新赫夫曼树。2、 编码(EnCoding)。
8、利用已建好的哈夫曼树正文进行编码。将终端输入须要编码的语句逐字在已建好的赫夫曼树中查找。当在树中找到相匹配字符时,将该字符对应的赫夫曼编码同意保存。最后将数组中的编码在终端输出。3、 译码(DeCoding)。利用已建好的哈夫曼树将文件中的代码进行译码。获取须要译码的编码组。将编码逐一读入,并在赫夫曼中根据左0右T去查找字符。将译好的语句在终端输出。三、概要设计操作集合:voidSe1ect(intcur,int&r1,int&r2);nodes1CUr中选择双亲为,权值最小的两个结点r1,r2voidCreatHuffmanTree(charch,intw,intn);pub1ic:Huff
9、manTree(charch,intw,intn);由字符,权值和字符个数构造哈夫曼树virtua1HuffmanTree();析构函数stringEncode(charch);编码1ink1istDecode(stringstrCode);译码本程序主要用到了三个算法。哈夫曼编码;在初始化过程中间,要用输入的字符和权值建立哈夫曼树并求得哈夫曼编码。先将输入的字符和权值存放到一个结构体数组中,建立哈夫曼树,将计算所得的哈夫曼编码存储到另一个结构体数组中。串的匹配;在编码过程中间,要对已经编码过的代码译码,可利用循环,将代码中的与哈夫曼编码的长度相同的串与这个哈夫曼编码比较,如果相等就回显。二叉
10、树的遍历在印哈夫曼树(T)的中,因为哈夫曼树也是二叉树,所以就要利用二叉树的先序遍历将哈夫曼树输出。四、数据结构设计structNodechardata;/节点数据域为字符型Node*next;Node()next=NU11;Node(charitem,Node*1ink=NU11)data=item;next=1ink;structHuffmanTreeNode(intweight;unsignedintparent,IeftChi1d5rightChi1d;/双亲,左右孩子域HuffmanTreeNode();HuffmanTreeNode(intw,intp=O,int!Chi1d=O,
11、intrChi1d=O);五、算法设计1、算法分析(必须要用语言进行描述)构造树:初始化:每个字符就是一个结点,字符的频度就是结点的权:1、将结点按频度从小到大排序;2、选取频度最小的两个结点,以它们为儿子,构造出一个新的结占八,新结点的权值就是它两个儿子的权值之和;构造之后,从原来的结点序列里删除刚才选出的那两个结点,但同时将新生成的结点加进去;3、如果结点序列里只剩下一个结点,表示构造完毕,退出。否则回到第一步。编码:编码:可以假定,对某个结点而言,其左孩子在当前阶段的编码为0,右孩子的编码为Io这样就可以通过”树的遍历的方式来生成字长一编码对照表来到这里,基本上艰苦的已经完成了,对某个具
12、体的字符串编码和解码就只是简单的“查表一替换”的工作了。解码:解码也是个简单的查表、替换过程。如果利用该种编码发送字符串,则它的”字宁含一编码侧应表也必须发送过去,不然对方是不知道怎么解码的。对给出的一串编码,从左向右,将编码组合起来并查表.2、算法流程图六、程序测试与实现1、函数之间的调用关系VoidmainCreatHuffmanTreeEncodeDecode2、主程序intmain(void)char*ch;int*w,n,i;COUt输入字符集中字符的个数:end1;cinn;ch=newcharn;w=newintn;COUtV输入字符集中的字符:end1;for(i=0;ichi
13、;COUt输入字符集中的字符的权值:end1;for(i=0;iwi;HuffmanTreehmTree(ch,w,n);stringstrText,StrCode;COUtstrText;cout文本串StrTeXt.c_str()编码为:;for(intpos=0;posstrText.1ength();pos+)stringStrTmp=hmTree.Encode(strTextpos);coutstrTmp.c_str();coutstrCode;cout编码串data和P-next分别表示结点的数据域变量和指针域变量。指针变量的值要么为空(NU11),不指向任何结点;要么其值为非空,即它的值是一个结点的存储地址。注意,当P为空值时,则它不指向任何结点,此时不能通过P来访问结点,否则会引起程序错误。八、心得体会通过这次数据结构课程设计,使我对软件的界面设计有了一个比较深刻的了解,对各种内部排序方法的性能有了清晰的认识,使我感觉到到,一个优秀的软件,不仅仅是可以运行的,更应该具有人性化的界面,协调的布局,合理的结构,良好的性能和一定的容错性一个人要兀成所有的工作是非常困难和耗时的.在以后的学习中我会更加注意各个方