霍夫曼树与霍夫曼编码.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
霍夫曼树与霍夫曼编码

实验五 霍夫曼树与霍夫曼编码 实验目的 掌握霍夫曼树的概念 掌握霍夫曼树的构造过程; 掌握霍夫曼树编码; 掌握霍夫曼树译码。 实验内容与要求 本实验要求对输入的一串电文字符实现霍夫曼编码,再对霍夫曼编码生成的代码串进行译码,输出电文字符串。具体要求: 建立霍夫曼树; 霍夫曼编码的生成; 霍夫曼译码。 实验编程指导 1)霍夫曼树的建立 由霍夫曼树的定义可知,含有n个叶子结点的霍夫曼树中共有2n-1个结点,而且霍 夫曼中没有度为1的分支结点。我们可以用一个大小为2n-1的一维数组来存储霍夫曼树中的结点。霍夫曼树的参考存储结构描述如下: #define n 100 #define m 2*n-1 typedef struct { int weight; char ch; int parent,lchild,rchild; }HTNode; typedef HTNode HuffmanTree[m]; 要实现霍夫曼树,首先要实现HT[1…n]中选择parent为-1且权值最小的两个根结点的选择算法;另外,还要有一个实现统计输入电文字符串中各种字符出现的频率以及字符的种类的算法,假设电文中仅含有大写字母。霍夫曼树的建立主要包括以下三个部分: 选择parent为-1且权值最小的两个根结点的算法; 统计字符串中字符的种类以及各种字符的个数的算法; 构造霍夫曼树。 2)霍夫曼编码 要求电文的霍夫曼编码,必须先定义霍夫曼编码的类型。参考的定义如下: typedef struct{ char ch; //存放编码的字符 char bits[n+1]; // 存放编码位串 int start; //编码起始位置 } CodeNode; 该部分主要包括如下内容: 霍夫曼编码:根据霍夫曼树求霍夫曼编码表; 建立正文的编码文件:将要编码的字符串中的字符逐一与预先生成的霍夫曼树保存的字符编码对照表进行比较,找到之后,将该字符的编码写入代码文件,直至所有的字符处理完毕为止。功能:输入任意一个字符串(要求其中的字符在原始字符串中出现过),能够进行霍夫曼编码。 3) 霍夫曼译码 读取编码,并与原生成的霍夫曼编码表比较,遇到相等时,即取出其对应的字符存入一个新串中。 注意:具体编解码算法可以参考讲义。以上为参考实验方案,不局限于此方案。 实验报告要求 分组方式:按小组方式进行,2个人为1组,选1名为组长,负责计划整个题目的进展,要???分工明确,任务详实。 实验报告要求以word文件形式发到老师邮箱。内容包括: (1)报告封面包括实验名称、班级、姓名、学号以及实验完成日期。 (2)各程序模块名称及功能说明。并绘制出主要功能函数的程序流程图。 (3)个人小结。包括实验难点分析、进一步的工作、个人希望等。 (4)完整的程序清单。 完成日期:2012—4—30 各模块名称以及功能说明: int Init( HTNode ht[])函数:初始化函数,通过读取输入的信息,统计哪一些字符出现过,并且统计出现次数来确定权值,最后存入ht[]中。 void select(HTNode ht[],int q,int *p1,int *p2)函数:选出包含新增结点在内的权值最小的两个结点,p1为最小的结点的下标,p2为次小的结点的下标。 void huffman_setup(HTNode ht[],int s)函数:霍夫曼树的建立函数,在所有的叶子结点数组之后依次增加新增结点,其权值依次增加,每一个新的结点的权值为当前结点中权值最小的两个结点权值之和,并建立相应的双亲关系。 void huffman_show(CodeNode hc[],HTNode ht[],int s)函数:给每个输入的信息元素按照权值编01码,其基本原理是按照已经建立的霍夫曼树从最后一个元素(跟结点)开始,根据子树是否满足左右子树的条件来判断0还是1编码。 void huffman_code(CodeNode hc[])函数:根据人为输入的字母信息进行比对编码,得到相应的01码。 void huffman_read(HTNode ht[],int s)函数:根据人为输入的01码,从跟结点开始往下查找得到并输出对应的字母信息。 主要功能函数的程序流程图: int Init( HTNode ht[])函数 进入函数 初始化各个元素信息 读取元素 N 统计各个元素的出现次数 为‘!’ Y 把统计的结果给ht[]赋值 返回元素的个数 void select(HTNode ht[],int q,int *p1,int *p2)函数 进入函数 N 树中继续查找 双亲非零 Y 后项后移 权值后项 Y N 取最小赋值为P1 N 树中继续查找 双亲非零 Y 后项后移 权值后项,且

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档