欢迎来到天天文库
浏览记录
ID:58406686
大小:179.50 KB
页数:16页
时间:2020-05-09
《哈夫曼编码译码系统.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、《数据结构》课程设计——赫夫曼编码/译码器设计指导教师:孙树森、周维达班级:09数媒(2)班学号:E姓名:曾焕凯数据结构课程设计报告书一、实验目的1、提高分析问题、解决问题的能力,进一步巩固数据结构各种原理与方法。2、熟悉掌握一门计算机语言,可以进行数据算法的设计。二、实验原理1、哈夫曼树的定义:假设有n个权值,试构造一颗有n个叶子节点的二叉树,每个叶子带权值为wi,其中树带权路径最小的二叉树成为哈夫曼树或者最优二叉树;2、哈夫曼树的构造:weight为输入的频率数组,把其中的值赋给依次建立的HTNode对象中的data属性,即每一个HTNode对应一个输入的频率。然后根据data属性按从
2、小到大顺序排序,每次从data取出两个最小和此次小的HTNode,将他们的data相加,构造出新的HTNode作为他们的父节点,指针parent,leftchild,rightchild赋相应值。在把这个新的节点插入最小堆。按此步骤可以构造构造出一棵哈夫曼树。通过已经构造出的哈夫曼树,自底向上,由频率节点开始向上寻找parent,直到parent为树的顶点为止。这样,根据每次向上搜索后,原节点为父节点的左孩子还是右孩子,来记录1或0,这样,每个频率都会有一个01编码与之唯一对应,并且任何编码没有前部分是同其他完整编码一样的。三、实验步骤先统计要压缩编码的文件中的字符字母出现的次数,按字符字
3、母和空格出现的概率对其进行哈夫曼编码。然后读入要编码的文件,编码后存入另一个文件;接着再调出编码后的文件,并对其进行译码输出,最后存入另一个文件中。具体步骤:1.初始化,统计文本文件中各字符的个数作为权值,生成哈夫曼树;2.根据符号概率的大小按由大到小顺序对符号进行排序;3.把概率最小的两个符号组成一个节点;4.重复步骤2.3,直到概率和为1;5.从根节点开始到相应于每个符号的“树叶”,概率大的标“0”,概率小的标“1”;6.从根节点开始,对符号进行编码;7.译码时流程逆向进行,从文件中读出哈夫曼树,并利用哈夫曼树将编码序列解码。四、实验结果与分析哈夫曼编码是动态变长编码,临时建立概率统计
4、表和编码树。概率小的码比较长,概率小的码比较长。概率大的码短,这样把一篇文件编码后,就会压缩许多。从树的角度看,哈夫曼编码方式是尽量把短码都利用上。首先,把一阶节点全都用上,如果码字不够时,然后,14再从某个节点伸出若干枝,引出二阶节点作为码字,以此类推,显然所得码长最短,再根据建立的概率统计表合理分布和放置,使其平均码长最短就可以得到最佳码。实验截图:五、实验心得本次实验结合了之前所学的赫夫曼算法,并利用其原理实现赫夫曼编码/译码系统;实验难度较之前的几次实验有所增加,所以花了比较多的时间来编写,测试代码。期间参考了网上的一些程序,通过结合分析,了解其他人在实现这个算法时的思想,也借鉴了
5、其中的一些东西,同时加入了自己的想法。最终完成饿了本次的作业。通过这次实验,我了解了一个算法到一个可以执行的程序之间还有很多工作需要做,深刻体会到实践出真知的到了,看似简单的算法在实现时却话费了这么多时间,但是这个过程中也让我学到了很多。六、主要代码14Huffman_Tree.h:#ifndefHuffman_Tree_h#defineHuffman_Tree_h#endif#includetypedefstruct{unsignedintweight;unsignedintparent,lchild,rchild;}HTNode,*HuffmanTree;//存储赫夫
6、曼树的结点类型typedefchar**HuffmanCode;//用于存储字符集中各个字符相应的赫夫曼编码voidstrcpy(char*S1,char*S2){//将字符串S2复制到S1inti=0;while(S2[i]!=' '){S1[i]=S2[i];i++;}S1[i]=' ';}//在HT[1]到HT[t-1]中找出权值最小的两个S1和S2-----------------------------------------------voidSelect(HuffmanTreeHT,intt,int&s1,int&s2){inti=1;s1=s2=0;HT[0].weig
7、ht=50000;while(i<=t){//遍历查找权值最小的结点S1if(HT[i].parent==0&&HT[i].weight
此文档下载收益归作者所有