下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课程设计设计题哈夫曼树编码译码.C课题名称哈夫曼树编码译码年级专业学号姓名成绩1、课题设计目的:在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件 的存储空间和计算机网络的传送时间已越来越引起人们的重视,哈夫 曼编码正是一种应用广泛且非常有效的数据压缩技术。哈夫曼编码是 一种编码方式,以哈夫曼树一即最优二叉树,带权路径长度 最小的二 叉树,经常应用于数据压缩。哈弗曼编码使用一特殊的编 码表将源字 符(例如某文件中的一个符号)进行编码。这编码表的特殊之处在 于,它是根据每一个源字符出现的估算概率而建立起来的。课题设计目的与设计意义2、课题设计意义:哈夫曼编码的应用很广泛,利用哈夫
2、曼树求得的用于通信的二进制 编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路 径上 的各分支约定:指向左子树的分支表示“ 0”码,指向右子树的分支 表示“1”码,取每条路径上的“ 0”或“1”的序列作为和各个叶 子对应的字符的编码,这就是哈夫曼编码。哈弗曼译码输入字符串可 以把它编译成二进制代码,输入二进制代码时可以编译成字符串。指导教师:年 月 日第一章需求分析1第二章设计要求1第三章概要设计2.(1)其主要流程图如图1-1所示。3(2)设 计 包 含 的 几 个 方 面4.第四章详细设计4.(1) 哈夫曼树的存储结构描述为:4(2)哈弗曼编码5(3)哈弗曼译码7.(4)主函数&(5
3、)显示部分源程序:&第五章调试结果10第六章心得体会12第七章参考文献12附录:1.2第一章需求分析在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间 和计算机网络的传送时间已越来越引起人们的重视,哈夫曼编码正是一种应用广泛 且非常有效的数据压缩技术。哈夫曼编码是一种编码方式,以哈夫曼树一即最优二 叉树,带权路径长度最小的二叉树,经常应用于数据压缩。哈弗曼编码使用一特殊 的编码表将源字符(例如某文件中的一个符号)进行编码。这编码表的特殊之处在 于,它是根据每一个源字符出现的估算概率而建立起来的 (出现概率 高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之
4、后 的字符串的平均期望长度降低,从而达到无损压缩数据的目的) 。哈夫曼编码 的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。 树 中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示 “0”码,指向右子树的分支表示“ T码,取每条路径上的“ 0”或“T的序 列作 为和各个叶子对应的字符的编码,这就是哈夫曼编码。哈弗曼译码输入字符串可以 把它编译成二进制代码,输入二进制代码时可以编译成字符串。第二章设计要求对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信
5、是传递文字的二进制码形式的字符串。但在信息传递时,总希 望总长度能尽可能短,即采用最短码。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为刀W让i。若将此对应 到 二叉树上,Wi为叶结点的权,Li为根结点到叶结点的路径长度。那么,刀WiLi恰 好为二叉树上带权路径长度。因此,设计电文总长最短的二进制前缀编码,就是以n 种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码。设计实 现的功能:(1)哈夫曼树的建立;(2)哈夫曼编码的生成;(3)编码文件的译 码。第三章概要设计哈夫曼编译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树 生
6、成哈夫曼编码后进行译码。在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进 制串,称之为编码。构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代 表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点 对应字符的编码,称之为哈夫曼编码。最简单的二进制编码方式是等长编码。若米用不等长编码,让出现频率高的字 符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送 电文 的总长度。哈夫曼树课用于构造使电文的编码总长最短的编码方案。(1) 其主要流程图如图1-1所示开始*(2) 设计包含的几个方面: 哈夫曼树的建立哈夫曼树的建立由哈夫曼算法的定
7、义可知,初始森林中共有n棵只含有根结点的二 叉树。算法的第二步是:将当前森林中的两棵根结点权值最小的二叉树,合并成一棵新的二叉树;每合并一次,森林中就减少一棵树,产生一个新结点。显然要进 行n-l次合并,所以共产生n-l个新结点,它们都是具有两个孩子的分支结点。由此 可知,最终求得的哈夫曼树中一共有2n-l个结点,其中n个结点是 初始森林的n个 孤立结点。并且哈夫曼树中没有度数为1的分支结点。我们可以利用一个大小为2n- -1的一维数组来存储哈夫曼树中的结点。 哈夫曼编码要求电文的哈夫曼编码,必须先定义哈夫曼编码类型,根据设计要求和实际需要定义的类型如下:typedet struct char
8、 ch; 存放编码的字符char bitsN + 1; /存放编码位串int len: 编码的长度 CodeNode; 编码结构体类型 代码文件的译码译码的基本思想是:读文件中编码,并与原先生成的哈夫曼编码表比较,遇到相等时,即取出其对应的字符存入一个新串中。第四章详细设计(1)哈夫曼树的存储结构描述为:define N 50 /叶子结点数ffdefi ne M 2*N-1 /哈夫曼树屮结点总数typedef struct int weight; 7/叶了结点的权值in t Ichild, rchild, pare nt; II 左右孩子及双亲指针HTNode; II树中结点类型typedef
9、 HTNode Huffma nTreeM+ll;哈弗曼树的算法void CreateHT(HTNode ht,int n)II 调用输入的数组 ht,和节点数 nint i, k , lno de, r no de;int min 1, mi n2;/所有结点的相关域置初值-1for (i=0;i2* n-l;i+)htipare nt=hti 1child=h tlirchild=-l;两个最小节点的父节点是两个最小节点的父节点权值for (i=n; i2* n-l;i+)mi n 仁 mi n2=32767;Ino de=r no de=-l;for (k二0;k二i-l;k+)if (
10、htkpare nt=-l)if (htkJ.weightmi nl)mi n2=mi nl;rnode=l no de; min l=htkweight; Ino de=k;else if (htkweightmi n2)min 2=htkweight;r no de=k;ht Ino depare nt=i;htr no depare nt=i;ht i weight=ht inode weight+ht mode weight;为两个最小节点权值之和/构造哈夫曼树/int 的围是-32768 32767/Inode和mode记录最小权值的两个结点位置/只在尚未构造二叉树的结点屮查找/若权
11、值小于最小的左节点的权值父节点的左节点和右节点根据哈夫曼树求哈夫曼编码hti1 child=Ino de;htirchild=r no de;(2)哈弗曼编码void CreateHCode(HTNode ht, HCode hcd,i nt n)int i, ft c;HCode he;for (i=0;i n;i+)he.start=n; c=i; f=hti pare nt;while (f!=-l)/循序直到树根结点结束循环if (htfJ child=c)he.cdhe start一-= 0: elsehe. cd he start一-=* 1; c=f;f=htfpare nt;h
12、e.start+;hcdi二he;处理左孩子结点处理右孩子结点void DispHCode(HTNode ht, HCode hcd, int n)int i,k;printff 输出哈夫曼编码:E);for (i=0;i n;i+)printf C%c: tz,, ht i data);for (k=hcdi start ;k=n ;k*)prin tf (*%czz, hcdi. cdk);prin tf(n);输出哈夫曼编码的列表刀输出data屮的所有数据,即 A-Zvoid editHCode(HTNode ht,HCode hcd,i nt n)char stri ngMAXSIZE
13、:int i,j,k;scanf (/z%s,z, string);printf (n输出编码结果:n);for (i=0;stri ngi!= S1 ;i+)编码函数II把要进行编码的字符串存入string数组屮lift为终止标志/start指向哈夫曼编码 he. cd屮最开始字符for (j=0; j n;j卄)if (stri ngiZ=htjdata)就输出这个字符的编码/循环查找与输入字符相同的编号,相同的for (k=hcdjstart;k=n ;k-+)prin tf hcdj cdk);break;输出完成后跳出当前for循环(3) 哈弗曼译码译码函 数void deHCode
14、(HTNode ht, HCode hcdj, int n) char codeMAXSIZE;int i, j, l,k, m, x;scan fcode);O把要进行译码的字符串存入code数组屮while(code0!=,W )for (i=0;i n ;i+)for (k=hcdistart, j=0;k=n ;k+, j+) i f (code j =hcd i. cdk)m+;if(m=j)串个数相等时则输出这个的 data数据prin tf (/z%czhti data);for (x=0;code xT! =#; x+)删除m为想同编码个数的计数器j为记录所存储这个字符的编码个
15、数当有相同编码时m值加1当输入的字符串与所存储的编码字符/把已经使用过的code数组里的字符串codelxZ=codeZx+j;(4) 主函数void mai n()int n=26, i;char orz,back, flag=l;char str = A,B,C,D,E,F,G,H,T,j,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z;/初始化int fnum=186, 64,13, 22, 32, 103, 21, 15, 47, 57, 1, 2, 32, 20, 57, 63, 15, 1, 48, 51, 80, 23, 8, 18, 1, 16;初始化HTNod
16、e htM;/建立结构体HCode hcdN;/建立结构体for (i=0;i n;i卄)/把初始化的数据存入ht结构体屮ht i data=str i;ht i weight二fnumi;while (flag)(5)显示部分源程序:/菜单函数,当fla名为0时跳出循环printf(w*);prin tf(n* 1显不编码*):prin tf(n* 2进行编码*):prin tf(n进行译码* 3* );prin tf(n* 4退出*n);printf(w* *);prin tf(n);prin tfC请输入选择的编号sea nf&orz);switch(orz)case a1 : case
17、 A* :systemCcls);CreateHT(ht, n);CreateHCode (ht, hcd, n); DispHCode (ht, hcd, n);printf (*n 按任意键返回getchO;systemCcls);break;case b :case B* :systemCcls);printf(”请输入要进行编码的字符串 editHCode (ht, hcd, n);printf(*n 按任意键返回getchO;systemCcls);break;case c :刀清屏函数(以斗结束):r);case C:systemCcls);DispHCode (ht, hcd,
18、n); printf (请输入编斤马(以#结束):n,z); deHCode (ht, hcd, n);printf (*n 按任意键返回.*): getchO ;systemCcls);break;case FiLesXIiciosort Visual 3tudioBrProjeclsXdrsaXDelJucdfsa. |输出哈夫曼编码:口:111D-士 丄0C =011000D =0B0S0E =10110F:010G-1109丄丄H:匹丄丄010J :MUM1J:B订1K:011301006L:011001 (MlM:loinH:1100100:1000P:1001n:HURR1 mi
19、=saleT =QBHU =U =11010&91K-01X0011X:刖选择B时的显示结果.Cc ; Pl ugiu Files Mice osQtt Ti?ual StudiDWyPLOjec-isXdrsxeVucdrsz.13选C时的显示结果0801 Bill 011081003尬1.丄90101110111U3S10 1009 ieai ei 丄eXl丄umrtntM 0811 1101090910113011110901811301018 110PfW请输入编码同卫结車Xliiisieitfie按任意诧返叵.第六章心得体会通过这次课程设计,让我对一个程序的数据结构有更全面更进一步的
20、认识,根 据不同的需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有 时用基本的一维数组,只要运用得当,也能达到相同的效果,甚至更佳,就如 这次 的课程设计,通过用for的多重循环,舍弃多余的循环,提高了程序的运行 效率。 在编写这个程序的过程中,我复习了之前学的基本语法,哈弗曼树最小路 径的求 取,哈弗曼编码及译码的应用围,程序结构算法等一系列的问题它使我对 数据结构 改变了看法。在这次设计过程中,体现出自己单独设计模具的能力以及 综合运用知 识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,也从中发现自己平时 学习的不足和薄弱环节,从而加以弥补。第七章参考文献1徐孝凯编著
21、,数据结构课程实验,清华大学出版2002年第一版2乃笑编著,数据结构与算法,电子工业2004年10月3 严蔚敏数据结构(C语言版)清华大学 附录:源程序如下:tri nclude Si nclude ZZ要用system函数要调用的头文件trin clude用getchO要调用的头文件trin elude stri ng hSdefi ne N 50II义用表示50叶节点数Sdefi ne M 2*N-1II用M表示节点总数 当叶节点数位n时总节点数为2n-l#defi ne MAXSIZE 100typedef structchar data;II结点值int weight;II权值int
22、pare nt;II双亲结点int lchild;左孩子结点int rchild;n右孩子结点HTNode;typedef structchar cdN;int start;HCode;void CreateHT(HTNode ht J, i nt n)/调用输入的数组ht ,和节点数int i, k ,lno de, r node;int min 1, mi n2;for (i=0;i2* n-l;i+)htipare nt=hti 1child=h tirchild=-l;for (i=n; i2* n-1;i+)所有结点的相关域置初值-1刀构造哈夫曼树min l=mi n2=32767;
23、lno de=r no de=T;/int 的围是-32768 32767/Inode和mode记录最小权值的两个结点位置for (k=O;k=i-l;k+)if (ht Ikpare nt=-l)只在尚未构造二叉树的结点中查找if (htkweightmi nl)/若权值小于最小的左节点的权值/存放哈夫曼码从start )始读cd中的哈夫曼码min2=min l;r no de=Inode; min l=htkweight; Ino de=k;else if (htkweightmi n2)。两个最小节点的父节点是i两个最小节点的父节点权值父节点的左节点和右节占八八min 2=htkweig
24、ht;r no de=k;ht lno depare nt=i;htr no depare nt=i;htiweight=ht 1 lno deweight+htr no deweight;为两个最小节点权值之和htiI child=Ino de;htirchild=r node;根据哈夫曼树求哈夫曼编码void CreateHCode(HTNode ht,HCode hcd,i nt n) int i, f, c;HCode he;for (i=0;i n;i+)/循序直到树根结点结束循环he.start=n; c=i;f=hti. pare nt;处理左孩子结点while (f!=-1)处
25、理右孩子结点if (htf. lchild=c)he.cdhe start一-=,0:elsehe. cdhe start一-二1;/start指向哈夫曼编码hc.cd屮最升始字符c=f;f=htfpare nt;he.start+;hcdi二he;void DispHCode(HTNode ht, HCode hcd,int n) 输岀哈夫曼编码的列表int i,k;printf (w输出哈夫曼编码:n;for (i=0;i n;i+)r77输出data中的所有数据,即 A-Zprintf C%c: tzz, ht i data);for (k=hcdistart;k=n ;k+)输出所有d
26、ata屮数据的编码prin tf hcdi cdk);prin tf(n);void editHCode(HTNode ht,HCode hcd, int n)char stri ngMAXSIZE;int i, j, k;scan f(%s,stri ng);printf Cn输出编码结果:n” );for (i=0;stri ngi!二护;i+)for (j=0;j n;j+)if (stri ngi=htjdata)就输出这个字符的编码for (k=hcdjstart;k=n ;k+)prin tf hcdj cdk);break;编码函数/把要进行编码的字符串存入 string数组中/
27、#为终止标志/循环查找与输入字符相同的编号,相同的/输出完成后跳出当前for循环void deHCode(HTNode ht,HCode hcd,int n) char codeMAXSIZE;int i, j, l,k, m, x;scan fcode);while(code0!=,W )for (i=0;i n ;i+)m=0;for (k=hcdij. start, j=0;k=n ;k+, j+) if(codej=hcdi. cdk)译码函 数把要进行译码的字符串存入 code数组屮%为想同编码个数的计数器/j为记录所存储这个字符的编码个数当有相同编码时m值加1m+=当输入的字符串与所存储的编码字符把已经使用过的code数组里的字符串if(m=j)串个数相等时则输出这个的 data数据prin tf(%c,hti data);for (x=0; code x-1 !=;x+)删除codex=codex+j; void mai n()int n=26, i;c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年吉林省辽源市中小学教师招聘考试真题解析含答案
- 2026年保密知识-多项选择题试题(附答案)
- 2026年高考北京卷理综生物试卷及答案
- 2026年保密基础知识历年真题试卷
- 2026年安徽马鞍山市中考英语试题及答案
- 大班数学《8的加减》教学设计
- 生物八年级下册第三节 人的性别决定教案设计
- 2026年装修清辅合同(1篇)
- 本册综合教学设计-2025-2026学年初中信息技术(信息科技)九年级浙教版(广西、宁波)
- 全册综合教学设计-2025-2026学年中职数学基础模块下册人教版
- 2026年管道疏通合同
- 立春二声部合唱谱
- 初中地理新课标测试题及答案
- 浙江强基联盟2026年3月高三语文联考作文题目解析及范文:有的时候人们主动选择预制
- 提高肿瘤治疗前TNM分期评估率
- 2026年工会干部业务知识培训考试题库及答案
- 2026 年中小学深入实施学生体质强健计划心得体会三
- 荨麻疹的定义、分类、诊断及管理国际指南(2026)解读课件
- DB61∕T 5132-2025 西安城市轨道交通工程监测技术标准
- 2026湖北恩施州战略规划研究中心选聘1人备考题库含答案详解
- 高速公路机电工程监理实施细则
评论
0/150
提交评论