哈夫曼树编码课程设计实验报告.docx
- 文档编号:24571503
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:27
- 大小:158.27KB
哈夫曼树编码课程设计实验报告.docx
《哈夫曼树编码课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《哈夫曼树编码课程设计实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
哈夫曼树编码课程设计实验报告
四、综合设计(课程设计)摘要:
在这次课程设计中,所进行的实验是:
哈夫曼编码和编译器。
对哈夫曼树进行建立,由节点的权值建立最小二叉树,哈夫曼树haftree,并由所建立的哈夫曼树进行编码,求出各个节点的编码。
在由所求的哈夫曼树,输入一段二进制电文,能够输出那所建立的哈夫曼树中的节点。
建立的haftree用图形化表示出来。
在整个代码实现中,窗体的实现,功能的完善,哈夫曼树的建立,哈夫曼树的编码,遇到了许多难题,haftree对象数组的分配空间,节点的属性等都比较困难。
在整个过程中,用的是C#语言,包的应用,字符串数组的空间分配,在计算每个字符的权值时,用的是sizeOf()检索整个字符串,计算字符的权值,建立字符出现频度的表格,根据表格中每个字符频度建立起哈夫曼树。
从根节点出发检索每个节点的左右孩子,如果是左孩子遍历左边,路径为0,然后左孩子为根节点;如果是右孩子,遍历右孩子,路径为1,然后右孩子为根节点。
在重新上述方法,直到所有的节点都遍历完,每个节点的编码就确定后输出来。
在译码过程中,由所输入的二进制电文,根据所建立的哈夫曼树,如果是0走左边,如果是1,走右边,直到节点的左右孩子为空时,输出给节点的信息,在回到根节点重新遍历后面的二进制电文,直到所有电文都遍历完为止,输出所有从电文中译码出来的信息。
关键词:
编译器;频度;译码
五、综合设计(课程设计)Abstract:
Inthisdesign,theexperimentwas:
Huffmancodingandcompiler.TheHuffmantreetoestablish,bythenodeweightstoestablishaminimumoftwoforktree,Huffmantreehaftree,andbytheHuffmantreecoding,andeverynodecoding.BytheHuffmantree,enterabinarymessage,canoutputthesetupbytheHuffmantreenodes.Establishmentofhaftreegraphicalrepresentation.Intheimplementationofthecode,therealizationform,functionperfect,Huffmantreeisestablished,Huffmancodingtree,encounteredalotofproblems,anarrayofhaftreeobjectsallocatedspace,nodeattributesaredifficult.Throughouttheprocess,usingtheC#language,theapplicationpackage,anarrayofstringsinthespatialdistribution,calculatedforeachweightofcharacters,usingsizeOftoretrievetheentirestring,calculatingtheweightofcharacters,establishcharacterappearancefrequencyofform,formthebasisofeachcharacterfrequencyestablishedHuffmantree.Startingfromtherootnodetoretrieveeachnodearoundchildren,ifchildrenlefttraverseleft,path0,thenleftthechildastherootnode;ifitisrightchild,traversingtherightpathforchildren,1childrenfortherootnode,thentheright.Inthenewmethoddescribedabove,untilallofthenodetraversalfinished,eachnodeisdeterminedaftertheoutputcoding.
Inthedecodingprocess,bytheinputbinarymessage,accordingtotheestablishedHuffmantree,ifitis0theleft,ifitis1,goright,untiltheleftandrightchildnodeisempty,theoutputtothenodeinformation,inthebackoftherootnodetotraversebehindabinarymessage,untilallmessagetraversalfinishedsofar,theoutputfromallthemessagedecodingofinformation.
Keywords:
compiler;frequency;decoding
摘要
在这次课程设计中,所进行的实验是:
哈夫曼编码和编译器。
对哈夫曼树进行建立,由节点的权值建立最小二叉树,哈夫曼树haftree,并由所建立的哈夫曼树进行编码,求出各个节点的编码。
在由所求的哈夫曼树,输入一段二进制电文,能够输出那所建立的哈夫曼树中的节点。
建立的haftree用图形化表示出来。
在整个代码实现中,窗体的实现,功能的完善,哈夫曼树的建立,哈夫曼树的编码,遇到了许多难题,haftree对象数组的分配空间,节点的属性等都比较困难。
在整个过程中,用的是C#语言,包的应用,字符串数组的空间分配,在计算每个字符的权值时,用的是sizeOf()检索整个字符串,计算字符的权值,建立字符出现频度的表格,根据表格中每个字符频度建立起哈夫曼树。
从根节点出发检索每个节点的左右孩子,如果是左孩子遍历左边,路径为0,然后左孩子为根节点;如果是右孩子,遍历右孩子,路径为1,然后右孩子为根节点。
在重新上述方法,直到所有的节点都遍历完,每个节点的编码就确定后输出来。
在译码过程中,由所输入的二进制电文,根据所建立的哈夫曼树,如果是0走左边,如果是1,走右边,直到节点的左右孩子为空时,输出给节点的信息,在回到根节点重新遍历后面的二进制电文,直到所有电文都遍历完为止,输出所有从电文中译码出来的信息。
关键词:
编译器;频度;译码
Abstract
Inthisdesign,theexperimentwas:
Huffmancodingandcompiler.TheHuffmantreetoestablish,bythenodeweightstoestablishaminimumoftwoforktree,Huffmantreehaftree,andbytheHuffmantreecoding,andeverynodecoding.BytheHuffmantree,enterabinarymessage,canoutputthesetupbytheHuffmantreenodes.Establishmentofhaftreegraphicalrepresentation.Intheimplementationofthecode,therealizationform,functionperfect,Huffmantreeisestablished,Huffmancodingtree,encounteredalotofproblems,anarrayofhaftreeobjectsallocatedspace,nodeattributesaredifficult.Throughouttheprocess,usingtheC#language,theapplicationpackage,anarrayofstringsinthespatialdistribution,calculatedforeachweightofcharacters,usingsizeOftoretrievetheentirestring,calculatingtheweightofcharacters,establishcharacterappearancefrequencyofform,formthebasisofeachcharacterfrequencyestablishedHuffmantree.Startingfromtherootnodetoretrieveeachnodearoundchildren,ifchildrenlefttraverseleft,path0,thenleftthechildastherootnode;ifitisrightchild,traversingtherightpathforchildren,thentheright.Innewmethoddescribedabove,untilallofthenodetraversalfinished,eachnodeisdeterminedaftercoding。
Inthedecodingprocess,bytheinputbinarymessage,accordingtotheestablishedHuffmantree,ifitis0theleft,ifitis1,goright,untiltheleftandrightchildnodeisempty,theoutputtothenodeinformation,inthebackoftherootnodetotraversebehindabinarymessage,untilallmessagetraversalfinishedsofar,theoutputfromall.
Keywords:
compiler;frequency;decoding
第一章课题背景
1.1设计背景目的及意义
1.1.1设计背景
在当今信息时代,信息技术已经成为当代知识经济的核心技术。
我们时刻都在和数据打交道。
但是这些海量的数据是怎么保存在计算机里面的呢?
在客户需要数据时它又是怎么发送给用户的呢?
这就涉及到哈弗曼编码的技术了。
哈弗曼编码在这种背景下,适应时代的要求诞生了。
作为无损压缩算法,哈弗曼编码用途非常广泛,在各个领域都有应用。
1.1.2设计目的
这次可课程设计主要是回顾我们上学期所学习的数据结构这门课程,重新温习一下这些经典算法,加深对它们的影响,以至于今后更好的应用这些经典算法,还有就是培养我们的程序设计算法,平时都是在教室里上课,很少有像这样集体性的编程,通过这次课程设计,不仅能加强我们的编程能力,更能加强我们的程序设计能力。
1.1.3设计意义
这次课程设计很有意义。
哈夫曼编码是个很有用、很有效的编码方式,是一个伟大的发明。
通过这次课程设计,让我们亲身体会到了课本上知识的作用和重要性,从而达到了学以致用的目的,让我们对今后的学习有了更清楚的方向和更加强烈的兴趣。
1.2理论依据和工作原理
1.2.1理论依据
哈夫曼编码(HuffmanCoding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。
Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
1.2.2工作原理
哈夫曼编码依据字符出现的频率来构造一棵二叉树,然后根据这棵树对字符进行编码,这种编码机制使用最短编码来表示字符串,大大节省了字符传递时的长度,在网络通信中,特别是网络流量方面作用特别明显,它大大节省了网络资源,提高了网络运行速度,方便了人们的生活。
第二章设计简介及设计方案论述
2.1设计简介
这次课程设计是哈夫曼编码,要求实现可视化编程。
哈夫曼树是一种很有用的数据结构,在数据传输方面更显方便,它能用较少的编码代替复杂的字符。
我们这次课程设计就是要实现对一段报文进行哈弗曼编码,然后随便输入一段编码,根据前面的编码进行解码。
2.2设计方案的论述
看到这个课程设计,第一感觉就是不怎么难。
因为哈弗满编码主要代码课本上都有,我们只需要将代码添加到窗体类中就可以。
首先,我设计了3个类,分别是HafumanNode类,HafumanT类和Form1主窗体类。
HafumanNode类是哈弗曼节点类,这个类中有publicchardata;publicintpinDu;publicdoubleweight;publicintparent;publicintlchild;publicintrchild;这六个字段和构造函数publicHafumanNode(charc,doublew)。
还有就是HafumanT类,这个类中主要实现哈夫曼树的构造和编码以及解码。
Form1类是主窗体类,在这里就不详细介绍了,在后面详细设计里面会有详细分析。
第三章详细设计
3.1总体分析
这次课程设计,我设计了3个类,分别是哈夫曼节点类(HafumanNode)、哈夫曼树(HafumanT)、主窗体类(Form1)。
这些类各有各的功能和作用,分别实现不同的功能,这样设计使代码更显调理性,而不至于把所有的功能都写在一个类里面,钠那样显得没有调理,很乱,可读性和可维护性不强。
3.2详细分析
3.2.1HafumanNode类
这个类的主要代码如下:
classHafumanNode
{
publicchardata;
publicintpinDu;
publicdoubleweight;
publicintparent;
publicintlchild;
publicintrchild;
publicHafumanNode(charc,doublew)
{
data=c;
weight=w;
pinDu=0;
parent=-1;
lchild=-1;
rchild=-1;
}
}
这个类比较简单,代码非常少,这个类相当于课本上C语言中的结构体,只是在C#中我用类来实现。
3.3.2HafumanT类
这个类有点复杂,因为它要实现很多功能。
这里就不详细列出它的所有代码了,而是把主要代码展示如下:
publicvoidCreateHafumanTree()
{
intlchild,rchild;
doublemin1,min2;
intnumber=listNode.Count;
for(inti=number;i { lchild=-1; rchild=-1; min1=3000; min2=3000; for(intj=0;j if(listNode[j].parent==-1) if(listNode[j].weight { min2=min1; rchild=lchild; min1=listNode[j].weight; lchild=j; } elseif(listNode[j].weight { min2=listNode[j].weight; rchild=j; } doublew=listNode[lchild].weight+listNode[rchild].weight; HafumanNodenewNode=newHafumanNode('#',w); newNode.lchild=lchild; newNode.rchild=rchild; listNode.Add(newNode); HafumanNodetemplchild=listNode[lchild]; templchild.parent=i; listNode[lchild]=templchild; HafumanNodetemprchild=listNode[rchild]; temprchild.parent=i; listNode[rchild]=temprchild; } } 上面这个函数主要是构造哈夫曼树,这个算法跟课本上的一模一样。 有技巧,但没有难度。 下面这个函数是根据构造好的哈夫曼树对各个字符求出它的哈夫曼编码,然后存放在字符数组中对应的位置。 publicstring[]CreateHCode() { stringstr=""; for(inti=0;i { str=""; intf=listNode[i].parent; intc=i; while(f! =-1) { if(listNode[f].lchild==c) str+="0"; else str+="1"; c=f; f=listNode[f].parent; } code[i]=ReverseString(str); } returncode; } 3.2.3Form1类 这个Form1类看起来很不爽,因为它的名字是默认的,而没有按照匈牙利命名法来命名。 这个类是主窗体类。 下面列出了它的主要功能代码: 这个函数是编码,根据已经编码好的编码数组,查找各个字符的编码,然后把它连接起来,组成一个1和0的字符串,就是输入字符串的编码了。 privateboolCode(strings,string[]str) { char[]codestr=s.ToCharArray(); richTextBox1.Text=""; stringtemp=""; intm=0; for(inti=0;i { m=GetIndex(hafumantree.listNode,codestr[i]); if(m==-1) { MessageBox.Show("你? 输? 入? 了? 不? 存? 在ú的? 编括? 码? : \n"+codestr[i].ToString()); returnfalse; } temp+=str[m]; } 这个主窗体还有个很重要的函数就是画树,以下是它的全部代码。 privatevoidDrawTree(intn,Pointpoint) { intlchild=-1,rchild=-1; Graphicsg=Graphics.FromHwnd(pictureBox1.Handle); Penpen=newPen(Color.Red); g.DrawEllipse(pen,point.X,point.Y,20,20); if(hafumantree.listNode[n].lchild! =-1) { lchild=hafumantree.listNode[n].lchild; PointnewPoint=newPoint(point.X-35,point.Y+30); DrawTree(lchild,newPoint); g.DrawLine(pen,newPoint(point.X+10,point.Y+10),newPoint(newPoint.X+10,newPoint.Y+10)); } else { Fontfont=newFont("黑ú体? ",10); Brushbrush=newSolidBrush(Color.Green); g.DrawString(hafumantree.listNode[n].data.ToString(),font,brush,point); } if(hafumantree.listNode[n].rchild! =-1) { rchild=hafumantree.listNode[n].rchild; PointnewPoint=newPoint(point.X+35,point.Y+30); DrawTree(rchild,newPoint); g.DrawLine(pen,newPoint(point.X+10,point.Y+10),newPoint(newPoint.X+10,newPoint.Y+10)); } else { Fontfont=newFont("黑ú体? ",10); Brushbrush=newSolidBrush(Color.Green); g.DrawString(hafumantree.listNode[n].data.ToString(),font,brush,point); } } 第4章设计结果及分析 4.1程序运行结果 程序运行后的界面如图所示: 图4.1程序运行结果 输入字符串abcda,点击编码后输出正常,但是在解码框中输入110001101时就有问题了,如图所示,解码输出框中的字符串最后一个字符是# 图4.2编码和解码后的运行结果 4.2错误分析 经过仔细调试和分析,这个错误原因中于找出来了。 原因是输入的1和0字符串最后几个不构成一个字符的编码,循环在某个父节点处就跳出来了,并输出了这个父节点的值,由于父节点默认值都是#,所以有时程序在译码时会出现个#,这个错误想了好久都没有解决,最后由于时间关系,就没有解决。 总结 这次课程设计真的学到了很多东西。 不仅是知识方面的学习,我觉得这次在生活或者说是工作方面更是学到了很重要的东西。 ·其中最重要的东西是合作,或者说是交流。 在这次
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼树 编码 课程设计 实验 报告