




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/目录TOC\o"1-3”\h\z\uHYPERLINK\l”_Toc339398409”1。概述 PAGEREF_Toc339398409\h1HYPERLINK\l”_Toc339398410”1.1问题描述ﻩPAGEREF_Toc339398410\h13.系统分析ﻩPAGEREF_Toc339398412\h1HYPERLINK\l"_Toc339398413”4。1系统功能模块图 PAGEREF_Toc339398413\h2HYPERLINK\l"_Toc339398414”5.1赫夫曼树的存储结构定义 PAGEREF_Toc339398414\h3HYPERLINK\l"_Toc339398415”5。2赫夫曼算法及其实现ﻩPAGEREF_Toc339398415\h3HYPERLINK\l"_Toc339398416"5.3统计字符串中字符的种类以及各类字符的个数 PAGEREF_Toc339398416\h3HYPERLINK\l"_Toc339398417”5.4赫夫曼编译码系统功能模块ﻩPAGEREF_Toc339398417\h3HYPERLINK\l"_Toc339398418"6。主要代码结构ﻩPAGEREF_Toc339398418\h4HYPERLINK\l”_Toc339398419"6.1定义赫夫曼编码类型如下 PAGEREF_Toc339398419\h4HYPERLINK\l”_Toc339398420"6。2赫夫曼编码算法 PAGEREF_Toc339398420\h4HYPERLINK\l"_Toc339398421"6.3建立正文的编码文件ﻩPAGEREF_Toc339398421\h5HYPERLINK\l”_Toc339398422”7。主要代码段分析 PAGEREF_Toc339398422\h6HYPERLINK\l"_Toc339398423”7.1赫夫曼编码的结构定义 PAGEREF_Toc339398423\h6HYPERLINK\l”_Toc339398424"7.2赫夫曼编码算法ﻩPAGEREF_Toc339398424\h6HYPERLINK\l”_Toc339398425"8.运行与测试ﻩ39398425\h7HYPERLINK\l”_Toc339398426"8。1测试数据及结果ﻩPAGEREF_Toc339398426\h7HYPERLINK\l”_Toc339398427"9。总结和心得 PAGEREF_Toc339398427\h8HYPERLINK\l"_Toc339398428”参考文献ﻩPAGEREF_Toc339398428\h8HYPERLINK\l”_Toc339398429”10.附:源代码 PAGEREF_Toc339398429\h91.概述1。1问题描述利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.这要求在发送端通过一个编码系统对待传输数据预先编码,对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编码系统。2。现状分析在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,赫夫曼编码正是一种应用广泛且非常有效的数据压缩技术.赫夫曼编码是一种编码方式,以赫夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。赫夫曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码.赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1"码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是赫夫曼编码。赫夫曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串.赫夫曼编码是已被证明的一种有效的熵编码方式,在诸如文本、图像、视频压缩及通信、密码等信息压缩编码标准中被广泛使用。目前广泛应用的许多其他高效数据压缩算法。3.系统分析利用二叉树结构实现赫夫曼编/解码器.基本要求:1、初始化:能够对输入的任意长度的字符串进行统计,统计每个字符的频度,并建立赫夫曼树.2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出.3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。4.概要设计4.1系统功能模块图赫夫曼编\译码器的主要功能是先建立赫夫曼树,然后利用建好的赫夫曼树生成赫夫曼编码后进行译码。在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。构造一棵赫夫曼树,规定赫夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为赫夫曼编码。最简单的二进制编码方式是等长编码.若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。赫夫曼树课用于构造使电文的编码总长最短的编码方案。赫夫曼编码/译码器赫夫曼编码/译码器类型及相关变量的定义建立赫夫曼树生成赫夫曼文件赫夫曼译码4.1系统功能模块图5.详细设计5.1赫夫曼树的存储结构定义#definen100//叶子结点数#definem2*n-1//赫夫曼树中结点总数typedefstruct{intweight;//权值intlchild,rchild,parent;//左右孩子及双亲指针}HTNode;//树中结点类型typedefHTNodeHuffmanTree[m+1];//零号单元不用5。2赫夫曼算法及其实现①根据给定的n个权值{w1,w2,···wn},构成n棵二叉树的集F={T1,T2,···Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空.②在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和.③在F中删除这两棵树,同时将新得到的二叉树加入F中。④重复②和③,直到F只含一棵树为止,这棵树便是赫夫曼树。5.3统计字符串中字符的种类以及各类字符的个数该算法的主要实现思想是:先定义一个含有26个元素的临时整型数组,用来存储各种字母出现的次数.因为大写字母与小写字母相差64位,所以在算法中我们可以使用字母减去64作为统计数组的下标对号入座。在统计和保存过程中,我们用一个循环来判断先前统计的各类字符是否为零,若不为零,则将其存入一个数组对应得元素中,同时将其对应的字符也存入另一个数组元素中。5。4赫夫曼编译码系统功能模块(1)赫夫曼建树模块:根据输入的字符和频率,完成赫夫曼树的构造,并根据赫夫曼树求赫夫曼编码。(2)编码模块:读取文本文件进行编码,编码结果存入到新文件。(3)译码模块:读取编码文件并解码,打开存储编码的文件,根据所读取的编码文件中的每字符,利用赫夫曼树进行解码.(4)输出模块:将解码后的每个字母写入到一个新的文件中。6.主要代码结构6.1定义赫夫曼编码类型如下typedefstruct{charch;//存放编码的字符charbits[n+1];//存放编码的位置intstart;//编码起始位置}CodeNode;typedefCodeNodeHuffmanCode[n];6.2赫夫曼编码算法voidHuffmanEncoding(HuffmanTreeHT,HuffmanCodeHC){ﻩintc,p,i;ﻩcharcd[n];ﻩintstart; cd[num]=’\0'; for(i=1;i<=num;i++) {ﻩ start=num;ﻩﻩc=i;ﻩﻩwhile((p=HT[c].parent)〉0) ﻩ{ﻩ cd[—-start]=(HT[p].lchild==c)?’0':’1'; c=p;ﻩ } ﻩstrcpy(HC[i]。bits,&cd[start]); ﻩHC[i].len=num—start; }}6.3建立正文的编码文件建立正文的编码文件的基本思想是:将要编码的字符串中的字符逐一与预先生成赫夫曼树是保存的字符编码对照表进行比较,找到之后,对该字符的编码写入代码文件,直至所有的字符处理完为止。具体实现算法如下:voidcoding(HuffmanCodeHC,char*str){ inti,j;ﻩFILE*fp; fp=fopen("code”,"w”);ﻩwhile(*str){ﻩﻩfor(i=1;i〈=num;i++) ﻩ if(HC[i]。ch==*str){ ﻩ ﻩfor(j=0;j<HC[i]。len;j++) ﻩﻩ ﻩfputc(HC[i].bits[j],fp);ﻩﻩﻩﻩbreak; ﻩﻩ}ﻩﻩ str++; } fclose(fp);}7。主要代码段分析赫夫曼编码可以用于通信技术,它的定义是树从根结点到每个叶子结点的路径上的各分支进行约定,指向左子树对的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1"的序列作为和各个叶子对应的字符的编码,这就是赫夫曼编码。7。1赫夫曼编码的结构定义typedefstruct{charch;//存放编码的字符charbits[n+1];//存放编码的位置intstart;//编码起始位置}CodeNode;typedefCodeNodeHuffmanCode[n];7.2赫夫曼编码算法voidHuffmanEncoding(HuffmanTreeHT,HuffmanCodeHC){//根据赫夫曼树HT求赫夫曼编码HC intc,p,i;//c和p分别指示HT中孩子和双亲的位置ﻩcharcd[n];//临时存放编码串ﻩintstart;//指示编码在cd中起始位置ﻩcd[num]='\0';//最后一位放上结束符 for(i=1;i<=num;i++)ﻩ{ start=num;//起始位置 ﻩc=i;//从叶子结点HT[i]开始上溯ﻩ while((p=HT[c]。parent)>0)//直至上溯到HT[c]是树根为止ﻩﻩ{//若HT[c]是HT[p]的左孩子,则生成0;否则生成代码1ﻩ cd[——start]=(HT[p].lchild==c)?'0’:'1’; ﻩﻩc=p;ﻩﻩ} ﻩstrcpy(HC[i].bits,&cd[start]);ﻩ HC[i]。len=num—start;ﻩ}}8.运行与测试8.1测试数据及结果输入:NOMANCANDOTWOTHINGSATONCE,得出结果:9.总结和心得通过这次课程设计,我们学习了很多在上课没懂的知识,并对求赫夫曼树及赫夫曼编码/译码的算法有了更加深刻的了解.更巩固了课堂中学习有关于赫夫曼编码的知识.参考文献[1]《数据结构课程设计》—-—--苏仕华等编著[2]《数据结构(C语言版)》———-—严蔚敏吴伟民编著[3]《C程序设计(第三版)》-—--—-谭浩强著10.附:源代码#include<stdio.h〉#include<string。h>/*(1)类型及相关变量的定义*/#definen100//叶子结点数#definem2*n—1//赫夫曼树中的结点总数typedefstruct{charch;charbits[9];//存放编码位串intlen;//编码长度}CodeNode;typedefCodeNodeHuffmanCode[n+1];typedefstruct{intweight;//权值intlchild,rchild,parent;//左右孩子及双亲指针}HTNode;//树中的结点类型typedefHTNodeHuffmanTree[m+1];//0号单元不可用intnum;//字母类型的个数/*(2)建立赫夫曼树的三个函数*/voidselect(HuffmanTreeT,intk,int*s1,int*s2){//在HT[1……k]中选择parent为0且权值最小的两个根结点,其序号分别为S1和S2inti,j;intmin1=100;for(i=1;i〈=k;i++)//查找s1if(T[i].weight〈min1&&T[i].parent==0){j=i;min1=T[i].weight;}(*s1)=j;min1=32767;for(i=1;i〈=k;i++)//查找s2,不和s1相同if(T[i].weight<min1&&T[i].parent==0&&i!=(*s1)){j=i;min1=T[i]。weight;}(*s2)=j;}intjsq(char*s,intcnt[],charstr[]){//统计各字符串中各种字母的个数以及字符的种类char*p;inti,j,k;inttemp[27];for(i=1;i〈=26;i++)temp[i]=0;for(p=s;*p!=’\0';p++){//统计各种字符个数if(*p>='A’&&*p〈='Z'){k=*p-64;temp[k]++;}}j=0;for(i=1,j=0;i<=26;i++)//统计有多少种字符if(temp[i]!=0){j++;str[j]=i+64;//将对应的数组送到数组中cnt[j]=temp[i];//存入对应数组的权值}returnj;}voidChuffmanTree(HuffmanTreeHT,HuffmanCodeHC,intcnt[],charstr[]){//构造赫夫曼树HTinti,s1,s2;for(i=1;i<=2*num-1;i++)//初始化HT,左右孩子,双亲,权值都为0{HT[i].lchild=0;HT[i].rchild=0;HT[i].parent=0;HT[i].weight=0;}for(i=1;i<=num;i++)//输入num个叶节点的权值HT[i].weight=cnt[i];for(i=num+1;i<=2*num-1;i++)//从numd后面开始新建结点存放新生成的父结点{select(HT,i—1,&s1,&s2);//在HT[1……i-1]中选择parent为0且权值最小的两个根结点,其序号分别为s1和s2HT[s1].parent=i;HT[s2]。parent=i;//将s1和s2的parent赋值HT[i].lchild=s1;HT[i].rchild=s2;//新结点的左右孩子HT[i].weight=HT[s1].weight+HT[s2]。weight;//新结点的权值}for(i=0;i<=num;i++)//输入字符集中的字符HC[i].ch=str[i];i=1;while(i<=num)printf(”字符%c,次数为:%d\n",HC[i].ch,cnt[i++]);}/*(3)生成赫夫曼编码文件的两个函数*/voidHuffmanEncoding(HuffmanTreeHT,HuffmanCodeHC){//根据赫夫曼树HT求赫夫曼编码表HCintc,p,i;//c和p分别指示T中孩子和双亲的位置charcd[n];//临时存放编码串intstart;//指示编码在cd中的起始位置cd[num]='\0';//最后一位放上串结束符for(i=1;i<=num;i++){start=num;//初始位置c=i;//从叶子节点T[i]开始上溯while((p=HT[c].parent)>0)//直至上溯到HT[c]是树根为止{//若T[c]是T[p]的做孩子,则生成0;否则生成代码1cd[--start]=(HT[p].lchild==c)?'0':’1';//cd数组用来存放每一个字母对应的01编码,c=p;}//endofwhilestrcpy(HC[i].bits,&cd[start]);//将cd数组中德01代码复制到i结点中/*printf("字符%c:",HC[i]。ch);for(j=start;cd[j]!=0;j++) printf(”%c",cd[j]);printf(”\n”);*/HC[i].len=num—start;}//endoffor}voidcoding(HuffmanCodeHC,char*str){//对str所代表的字符串进行编码,并写入文件inti,j;FILE*fp;fp=fopen(”code”,"w");while(*str){for(i=1;i<=num;i++)if(HC[i]。ch==*str){for(j=0;j<HC[i].len;j++){fputc(HC[i].bits[j],fp);}break;}str++;}fclose(fp);}/*(4)电码的译文*/char*decode(HuffmanCodeHC){//代码文件cood的译码
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教育游戏化在儿童自我认知教育中的应用与实践报告
- 工业互联网IPv6技术升级在2025年智能工厂生产效率提升报告
- 2025年健身平台行业政策环境与市场前景研究报告
- 第三章 代数式 单元测试卷(含部分解析)人教版七年级数学上册
- 二零二五版商业地产地板设计与施工合同模板
- 二零二五年度正规范本智慧家居产品研发与销售合同
- 2025饭店服务员劳动保护用品及安全培训服务合同
- 二零二五年公司独立董事信息保密及保密责任合同
- 二零二五年度婚庆司仪专业婚礼庆典服务合同
- 2025版口腔疾病患者综合治疗与预防协议
- 2025新版药品GCP考试题库及答案
- 2025广西来宾市象州县恒通水利水电开发投资有限公司招聘3人笔试参考题库附带答案详解
- 青年男性单眼反复发作全葡萄膜炎疑难病例讨论
- 工地交通保通方案(3篇)
- 铜川西腾实业有限公司招聘笔试真题2024
- 2024年长沙浏阳市招聘事业单位笔试真题
- (2025年)福建省福州市【辅警协警】笔试真题含答案
- 神经外科引流管护理
- 呼吸衰竭就诊指南
- 2025年物业经理职业考试复习试卷及答案
- 2025年甘肃省张掖市特岗教师招聘53人笔试参考题库及答案详解1套
评论
0/150
提交评论