14251102202陈晓俊哈夫曼树编码解码.doc
《14251102202陈晓俊哈夫曼树编码解码.doc》由会员分享,可在线阅读,更多相关《14251102202陈晓俊哈夫曼树编码解码.doc(34页珍藏版)》请在三一办公上搜索。
1、 课程设计课程名称数 据 结 构班级与班级代码14计算机2班,142511022专 业计 算 机 科 学 与 技 术指导教师罗 勇学 号14251102202姓 名陈晓俊电子邮箱827381654提交日期2016年6月29日广东财经大学教务处 制哈夫曼树编码解码1任务和要求哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。既然要设计哈夫曼树编码来进行通讯传输,那么就必须有一套哈夫曼树解码。通过对哈夫曼树编码解码的分析,此实验应该包含如下要求:(1)设计一组字符和字符出现的频率,即字符的权重,生成哈夫曼树;(2)
2、利用哈夫曼树求出所对应的哈夫曼树编码;(3)打印所有字符以及所对应的哈夫曼编码,并显示平均编码长度;(4)利用哈夫曼树解码原理编写解码函数,由哈夫曼编码求解出所对应的字符;(5)显示所有哈夫曼编码及其所对应的字符;(6)对比分析编码解码的正确性;2总体设计2.1系统功能模块图:图一初始化哈夫曼树构造哈夫曼编码构造哈夫曼树打印哈夫曼编码哈夫曼树译码打印哈夫曼树打印哈夫曼译码主函数2.2哈夫曼树的特点:哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树,权值较大的结点离根较近。2.3哈夫曼树的构造过程:步骤1:根据给定的n个权值w1,w2,wn,构造n棵只有根节点的二叉树,这n棵二叉树构成一个
3、森林F。步骤2:在森林F中选择两棵根节点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的权值为其左右子树上的根节点的权值之和。步骤3:在森林F中删除这两棵树,同时将新得到的二叉树放入到F中。步骤4:重复步骤2和步骤3,知道F中只有一棵二叉树为止。2.4哈夫曼树的编码相关性质:性质1:哈夫曼编码是前缀编码性质2:哈夫曼编码是最优前缀编码2.5哈夫曼树的编码过程:依次以叶子为出发点,向上回溯至根节点为止。回溯时走作分支则生成代码0,走右分支则生成代码1。3.详细设计3.1详细的涉及思路(1) 采用的节点类型:哈夫曼树的节点又四个类型,包括节点的权值weight、双亲节点parent、左
4、孩子节点lchild、右孩子节点rchild。采用的逻辑结构:哈夫曼树为最优二叉树,其采用的逻辑结构为树状结构。采用的存储结构:由于哈夫曼树中没有度为1的节点,则一棵有n个节点的哈夫曼树共有2n-1个节点,可以存储在一个大小为2n-1的一维数组中。树中没个节点还要包含其双亲信息和孩子节点的信息,因此,每个节点的存储结构如下表一所示,哈夫曼树的结构体如下面所示的结构体。表一weightparentlchildrchild/-哈夫曼树的存储表示-typedef structchar data5;/定义节点值double weight;/节点的权重int parent,lchild,rchild;
5、/定义哈夫曼树的双亲节点、左右孩子节点HTNode,*HuffmanTree;/动态分配数组存储哈夫曼树采用的算法:本系统采用的算法为哈夫曼算法。3.2哈夫曼树编码解码详细的构造过程(1)设计如下字符权重表(即26字权重表) 表二字符abcdefghij权重121323156724369010019字符klmnopqrst权重391392343578895714589029字符uvwxyz权重701234561189111(2)根据字符权重表,利用哈夫曼算法构造哈夫曼数。下面取图三表格中的前面10个字符权重进行构造哈夫曼树的思路说明。注:全部字符的构造与实现将在程序中体现!步骤1:根据给定的1
6、0个字符权值,构造10棵只有根节点的二叉树,这10棵二叉树构成一个森林F。1213231567森林F19100903624步骤2:在森林F中选择两棵根节点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的权值为其左右子树上的根节点的权值之和。如下图a251213图a步骤3:在森林F中删除这两棵树,同时将新得到的二叉树放入到F中。如下图b36246715232519100901312图b步骤4:重复步骤2和步骤3,知道F中只有一棵二叉树为止。最后得到如图四的哈夫曼树。图四1733992268390100126364759672324253412131519(3)哈夫曼树编码原理及其算法
7、: 哈夫曼编码是指利用哈夫曼树求得的用于通信的二进制编码。树中从根到每个叶子节点都有一条路径,对路径上的各分支约定指向左子树的分支表示”0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为各个叶子节点对应的字符编码,这就是哈夫曼编码原理。例如上图四的哈夫曼树的编码如下页图五所示,图五即为哈夫曼树的编码原理,编码是从叶子节点开始编起,往根节点回溯的过程。图五1733992268390100126364759672324253412131519000101011010110011abdjcfgehi 所以,图五中字符的二进制哈夫曼编码如下表三:字符abcdefghij哈夫曼
8、编码00011100110100010111111100000100111011表三表四为26个字母经过哈夫曼树的构造、编码得到的二进制编码:字符abcdefghij权重1100000100010000101111000100100011110000100111101110011110101110字符klmnopqrst权重010110001011010011100101001100110001010010000101字符uvwxyz权重001100000111110000000110111001表四(4) 哈夫曼树解码原理:首先得知道编码用的哈夫曼树以及字符对应的二进制编码如图五。然后从哈夫
9、曼树的根结点出发,逐个读入文件中的二进制码;若代码为“0”,则走左子树的根结点,否则走向右子树的根结点;一旦到达叶子结点,便译出代码所对应的字符。然后又重新从根结点开始继续译码,直到二进制文件结束。例如我想要对如下表五语句进行编码解码:表五canyougivemeakiss那么,得到的语句的二进制编码为下表六:表六canyougivemeakiss0101111110000010011100110101010001100011110111100000001111010001100011010110011111010解码只需发送上面表六的二进制编码进行解析即可得到:can you give me
10、 a kiss 这一语句。4 编码4.1 数据结构定义本实验所用的数据结构定义如下:typedef struct char ch; int weight; /权值,这个字符出现的频率 int parent; /父节点 int left; /左孩子 int right; / 右孩子HuffNode; typedef struct char codeMAXNUM; int start; HuffCode; HuffNode htMAXNUM*2; /存放哈夫曼树 HuffCode hcdMAXNUM; /存放ht数组中对应的字符的编码4.2 项目结构图4.3 功能函数的设计void chushih
11、uaHt(); /初始化哈夫曼树htvoid gouzaoHt(); /构造哈夫曼树,看成有n棵树,选择权值最小的两棵树合并void gouzaoHtCode(); /哈夫曼编码,通过父节点从下往上找,输出哈夫曼编码平均长度int jiemaHt(char *str,char* code); /哈夫曼解码,每次都从根节点开始搜索void fanzhuan(char *str); /将一个字符串反转(将编码从叶子节点开始编)void shurubainmaCode(); /用户输入编码字符,并将编码字符及其编码打印到文件当中void shurujiemaCode(); /用户输入解码字串void
12、 main(); /主函数4.4 函数调用关系图main.cppchushihuaHt.cppfanzhuan.cppgouzaoHt.cppshurubianmaCode.cppgouzaoHtCode.cppshurujiemaCode.cppJiemaHt.cppgouzaoHtCode.cppshurujiemaCode.cpp图八4.5 程序实现/*全部代码实现如下:*/#include #include #include #include/*定义最大长度为字符常量*/#define MAXNUM 60/*定义哈夫曼树编码解码结构体*/typedef struct char ch;
13、int weight; /权值,这个字符出现的频率 int parent; /父节点 int left; /左孩子 int right; /右孩子HuffNode; typedef struct char codeMAXNUM; int start; HuffCode;/*定义存放哈夫曼树、哈夫曼编码的全局变量*/extern HuffNode htMAXNUM*2; /存放哈夫曼树 extern HuffCode hcdMAXNUM; /存放ht数组中对应的字符的编码 extern int n; /字符的个数/*声明函数*/void main();void chushihuaHt(); vo
14、id gouzaoHt();void fanzhuan(char *str);void gouzaoHtCode();int jiemaHt(char *str,char* code);void shurubainmaCode();void shurujiemaCode();/*下列为哈夫曼编码解码的主函数,该函数调用了chushihuaHt()、gouzaoHt()、gouzaoHtCode()函数,其功能是读入文件ZiFuht.txt中的字符及其权重,生成对应的哈夫曼树编码并将其打印在dayinCode.txt文件中;同时显示系统选择菜单,提供输入选项,选项1、2、3分别调用了函数shur
15、ubainmaCode()、shurujiemaCode()、gouzaoHtCode()。*/void main() int choice=1;/设置while循环的标志 chushihuaHt();/初始化哈夫曼树 gouzaoHt(); /构造哈夫曼树 gouzaoHtCode(); /构造哈夫曼编码并将字符及其哈夫曼编码打印出来 while(choice) system(cls); printf(/*哈曼编码与解码*/n); printf( 在ZiFuht.txt 文件中存放着各个英文字母的权值n); printf( 程序从中读出各个字母的权值构造哈夫曼树并进行编码n); printf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 14251102202 陈晓俊哈夫曼树 编码 解码

链接地址:https://www.31ppt.com/p-4152816.html