北邮数据结构实验—Huffman编码解码器.docxVIP

北邮数据结构实验—Huffman编码解码器.docx

  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文档。上传文档
查看更多
欢迎下载 欢迎下载 PAGE # 北京邮电大学电信工程学院 北京邮电大学电信工程学院 数据结构 实 验 报 告 实验名称: Huffman编码/解码器 学生姓名: 班 级: 班内序号: 学 号: 日 期: 实验要求 利用二叉树结构实现哈夫曼编 /解码器。 基本要求: 1?初始化(Init):能够对输入的任意长度的字符串 s进行统计,统计每个 字符的频度,并建 立哈夫曼树 字符串输出。 码,并输出译码结果。编码的压缩效果。2?建立编码表(CreateTable): 字符串输出。 码,并输出译码结果。 编码的压缩效果。 3?编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的 4?译码(Decoding):利用已经建好的哈夫曼树对编码后的字符串进行译 5?计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼 程序分析 2.1存储结构 静态三叉链表 Weight Lchild Rchild pare nt 2?2程序流程(或程序结构、或类关系图等表明程序构成的内容, 一般为流程 图等) 221.流程图 开始 输入进行编码的字符串 统计各个字符的频度,并对各叶子节点 的权重赋值 初始化各节点的 Lchild, Rchild和pare nt 进行哈弗曼编码 该节点是否为根节点 否 对字符串进行编码 找到当前字符编码,复制到总编码中 是否最后一个字符 输岀各字符串编码 对哈弗曼码进行译码 输岀译码结果 计算分析内存占用情况 if 输出占用情况 结束 2.2.1 .伪代码 1.输入进行编码的字符串 2?遍历字符串,并为叶子节点权重赋值 依次对各字符进行哈弗曼编码,自下往上,若是双亲节点左孩子则编码前插入’ 0 若是双亲节点右孩子则编码钱插入’ 1 显示各字符的哈弗曼编码。 对字符串进行编码,挨个遍历字符,找到相应的编码,复制到总的编码里,最后输出 字符串的编码 对字符串的哈弗曼码进行译码。自上往下,若是‘ 0则递归到左孩子,若是‘ 1 则递归到右孩子,知道叶子节点,输出该叶子节点代表字符,再继续遍历。 7?分析内存占用情况。若用 ASCII编码,每个字符占1个字节,即8bit,该情况下占用 内存就是(字符长度)*8。若用哈弗曼编码,占用内存是各(字符频度) * (每个字符占用 位数)之和。 2.3关键算法分析 该程序关键算法即哈弗曼编码,语句如下: void CHTree::huffma ncode() { int i; if(n=1)return; m=2* n-1; for(i=1;i=n;i++)〃叶子节点的初始化 { ht[i].pare nt=0; ht[i]」child=0; ht[i] .rchild=0;} for(;i=m;i++) //非叶子节点的初始化 { ht[i] .weight=0; ht[i].pare nt=0; ht[i] .lchild=0; ht[i] .rchild=0;} for(i=n+1;i=m;++i)〃 构造哈夫曼树 { s1= select(i-l);//函数在ht[1]到ht[i-1]中选择pare nt为0且weight最小的结点, 并将结 点序号返s,并将ht[s1].parent设为-1 s2=select(i-1); ht[s1].pare nt=i; ht[s2].pare nt=i; ht[i]」child=s1; ht[i].rchild=s2; ht[i].weight=ht[s1].weight+ht[s2].weight; } int c,f; for(i=1;i=n;++i) { for(c=i,f=ht[i].pare nt;f!=O;c=f,f=ht[f].pare nt)〃 逆向求叶子结点的哈夫曼编码 if(ht[f].lchild==c){ str[i].insert(0,0,0,1);}// 在字符串 str[i]的第 0 位置插入字符 “ 0” else{ str[i].insert(0,1,0,1);}// 在字符串 str[i]的第 0 位置插入字符“ 1 ” } } 分析:这段语句实现的功能是根据统计出来的各字符的频度, 建立哈弗曼。建立哈弗曼 树的过程如程序所展示, 每次选取权重最小且无双亲节点的节点组合, 并将其权重之和赋给 其双亲节点,加入到总结中进行下次判断。 哈弗曼树建立完全以后, 开始对各字符进行编码, 从下往上,以叶子节点为起始点,若它是双亲节点的左孩子,其编码前插入’ 0若是右孩 子则插入‘1再判断双亲节点使其双亲节点的左孩子还是右孩子,以此类推直到根节点。 依次对每个字符进行上述过程编码。 算法复杂度: 最好情况为只有根结点和叶子节点: O (n) 最坏情况为满二叉树情况:

文档评论(0)

梦幻飞迷0411 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档