1、哈夫曼编码计算机科学与技术 专业摘要 通信中,可以采用 0,1 的不同排列来表示不同的字符,称为二进制编码。而哈夫曼树在数据编码中的应用,是数据的最小冗余编码问题,它是数据压缩学的基础。若每个字符出现的频率相同,则可以采用等长的二进制编码,若频率不同,则可以采用不等长的二进编码,频率较大的采用位数较少的编码,频率较小的字符采用位数较多的编码,这样可以使字符的整体编码长度最小,这就是最小冗余编码的问题。 而哈夫曼编码就是一种不等长的二进制编码,且哈夫曼树是一种最优二叉树,它的编码也是一种最优编码,在哈夫曼树中,规定往左编码为 0,往右编码为 1,则得到叶子结点编码为从根结点到叶子结点中所有路径中
2、 0和 1 的顺序排列。关键词:哈夫曼树-1-课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。课程设计任务与要求:哈夫曼树应用功能: (1)从终端读入字符集大小 n,以及 n 个字符和 n 个权值,建立哈夫曼树并将它存于文件 hfmTree 中.将已
3、在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;(2)利用已经建好的哈夫曼树(如不在内存,则从文件 htmTree 中读入) ,对文件 ToBeTran 中的正文进行编码,然后将结果存入文件 CodeFile 中,并输出结果,将文件 CodeFile 以紧凑格式先是在终端上,每行 50个代码。同时将此字符形式的编码文件写入文件 CodePrint 中。(3)利用已建好的哈夫曼树将文件 CodeFile 中的代码进行译码,结果存入文件 TextFile 中,并输出结果。分步实施:1) 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2) 完成最低要求:完成功能 1;3) 进一
4、步要求:完成功能 2 和 3。有兴趣的同学可以自己扩充系统功能。要求:1)界面友好,函数功能要划分好2)总体设计应画一流程图3)程序要加必要的注释4) 要提供程序测试方案5) 程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。哈弗曼函数1.主菜单窗口-2-2.建立哈夫曼树3利用哈夫曼树进行编码-3-4.利用哈夫曼树进行译码课程设计心得:经过几个星期的奋战,终于完成了课程设计,感觉又进一步了解了数据库这门课程,各个知识点都加强了。也许个中滋味只有我才能体会,说实在的,刚上这门课程的时候,兴趣并不是很大,而且还出现过作业迟交的情况,而现在,我似乎突然找到了方向,认真
5、的学习这门课。回顾这次课程设计,使我感慨颇多。的确,从理论到实践,在整整两星期的日子里,学到很多很多的的东西,同时不仅可以巩固学过的知识,而且学到了很-4-多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,从而提高自己的实际动手编程能力和独立思考的能力。运动会计分系统,比较复杂,经过很长时间的书写,总算尝到了胜利的“滋味” 在细节的认识上,我们在开发程序的时候,在之前就要知道自己想要的效果,然后把需要实现的功能在纸上列出来,后比如要用几个函数来实现几个功能,整体需要几个模块来搭建,这些工作都是要在未动工之前就得做好的准备工作,编程要的是有整体的思想加细心。这次
6、的课程设计收获颇多,最大的认识到了要想高效设计出想要的东西不仅要熟悉的掌握所学知识,还要学会充分利用现有资源。在这之前,总以为自己编程方面还很差,现在才觉得,只要努力了,就会有收获,就会得到回报参考文献百度文库 哈夫曼函数详细设计(源程序)哈弗曼函数#include#include#include#includechar filename20; /文件名FILE *fp; /指向文件的指针/定义结构体typedef structint weight;char ch;int parent,lchild,rchild;HTNode,*HuffmanTree; /动态分配数组存储哈夫曼树typede
7、f struct-5-char ch;char *chs;HuffmanCode;/动态分配数组存储哈夫曼编码表typedef structchar ch;int weight;sw;/定义节点typedef structHuffmanTree HT;HuffmanCode *HC;huf; /哈夫曼树结构体/在 HT1i-1选择 parent 为 0 且 weight 最小的两个节点,其序号分别为n1,n2。void select(HTNode * HT,int n,int *n1,int *n2)int i=1; int n3;while(HTi.parent!=0)i+;*n1=i;i+
8、;while(HTi.parent!=0) i+;*n2=i;if(HT*n1.weight0),构造哈夫曼树 HT,并求出 n 个字符的哈夫曼编码 HC。-6-int m,i,s1,s2,start,c,f;HuffmanTree p;char *cd;if(nweight=w-weight;p-ch=w-ch;p-parent=0;p-lchild=0;p-rchild=0;for(;iweight=0;p-ch=;p-parent=0;p-lchild=0;p-rchild=0;for(i=n+1;iHT=HT;HUF-HC=HC;return HUF;void input(int *n
9、,sw *w)-7-int i;/输入要编码的字符数量printf(“输入用于编码的字符数量:“);scanf(“%d“,n); for(i=1;ich,void writeFile(char filename20) /文件存储函数 用于保存数据到文件 if(fp=fopen(filename,“w+“)=NULL)printf(“n 保存失败n“);exit(0);else printf(“n 保存成功 n“);fclose(fp);void readFile(char filename20) /文件读取函数 用于打开已有的数据文件 if(fp=fopen(filename,“r+“)=NU
10、LL)printf(“n 读取失败n“);exit(0);else printf(“n 读取成功 n“);fclose(fp);/编码char * convert(char *chars,char *chars1,HuffmanCode *hc,int n) char *p=chars; int i; strcpy(chars1,“);while(*p)-8-i=1; while(hci.ch!=*pprintf(“tt3利用哈夫曼树进行译码 4退出 n“);printf(“ *n“);printf(“请选择 1-4(请先建立哈夫曼树后再进行后续操作)n“);scanf(“%d“,switch
11、(m) case 1:input(HUF=HuffmanCoding(writeFile(“hfmTree“);printf(“数据存入文件 hfmTree 中nn“);break;case 2:printf(“n 创建一个用来编码的原文件 n“);printf(“请输入添加到原文件的字符序列,并以#结束n(注意只能为建立哈夫曼树时用到的字符,且不能有空格): n“);fflush(stdin);/清除流,解决输入干扰ch=getchar();while(ch!=#)*p=ch;p+;ch=getchar();-10-*p=0;hc=HUF-HC;ht=HUF-HT;writeFile(“To
12、BeTran“);printf(“数据保存为文件 ToBeTrann“);printf(“n 对文件 ToBeTran 中的代码进行编码nn“);readFile(“ToBeTran“);abc=convert(inchar,outchar,hc,n);writeFile(“CodePrint“);printf(“编码结果以紧凑格式显示在终端后存入文件 CodePrint 中n“);break;case 3:printf(“n 对文件 CodeFile 中的代码进行译码n“);readFile(“CodeFile“);transcode(ht,abc,outchar);writeFile(“TextFile“);printf(“译码结果存入文件 TextFile 中n“);break;case 4:exit(0);default:printf(“请输入数字 1-4n“);