南理工多媒体技术霍夫曼编码的C++实现.doc

南理工多媒体技术霍夫曼编码的C++实现.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
南理工多媒体技术霍夫曼编码的C实现

课程:多媒体技术 任教老师:康其桔 学生:缪 菊 学号:1104210329 班级:电光11级电信3班 联系方式 完成时间:2014年3月24日 霍夫曼编码 一.实验内容: 从键盘输入一字符串,设计C++程序,统计字符串的长度,涉及的字母,字母的权值,进行字母的HUFFMAN编码,输出字符串的HUFFMAN编码,并统计平均码长。 问题描述: 1、读入sum个字符,算出字符出现的频率,根据字母数组和权值数组,建立一棵HUFFMAN树。 2、对生成的HUFFMAN树,求每个字符进行HUFFMAN编码。求出每个字符的HUFFMAN编码,形成码表,对应码表输出字符串的HUFFMAN编码。 三.算法设计: HUFFMAN编码的算法: A.统计输入字符串的长度,涉及的字母,字母的权值。形成字母表和对应的权值表。 B.用select函数遍历n个字符,找出权值最小的两个S1和S2,构造一个新的节点Hi,将S1和S2连接到Hi的lchild和rchild节点上,Hi节点的weight为S1和S2的weight之和。 C.将新建立的节点Hi替换S1和S2,继续步骤b(这时的字符数为n-i,i=1,2,…),直到只剩下一个节点为止。至此,HUFFMAN树构造完成。 D.给HUFFMAN的HT分配编码,形成每个字符的编码形成码表。对应字符串输出编码串。 四.具体实例: 步骤1:输入A—E的字符,统计出相应的字符表和权值表如下,构造子节点如下,构造备用的父节点如下。(n个字符的HUFFMAN编码,需要(2n-1)个节点) 节点序号 1 2 3 4 5 6 7 8 9 字符 A B C D E H1 H2 H3 H4 权值 3 5 2 4 1 0 0 0 0 图形表示状态如下: 步骤2和3: 步骤4: 于是得到最后的霍夫曼编码为: 字符 A B C D E 霍夫曼编码 00 11 010 10 011 程序的实现 字符的统计程序 构造存有26个字母的字母表b[],用26个字母扫描字符串,在相应的位置b[]中的内容加一。最后将字母表存入chstrl[],权值表存入wstrl[]。 (2)HUFFMAN树节点的存储表示 typedef struct{ unsigned int weight; unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree; //动态分配数组存储霍夫曼树 霍夫曼树节点的图形表示: 具体实现见源代码注释。 附上全部源代码: #include iostream #includestdio.h using namespace std; //***************************************动态分配数组存储霍夫曼树******************************* typedef struct{ int weight; //字符的权值 int parent,lchild,rchild; }HTNode,*HuffmanTree; //***************************************动态分配数组存储霍夫曼树******************************* //*****************************************动态分配数组存储霍夫曼编码***************************** typedef char* *HuffmanCode; //*****************************************动态分配数组存储霍夫曼编码***************************** //********************************选择n个(这里是k=n)节点中权值最小的两个结点********************** //调用HuffmanTree数组,k是结点,S1,S2 void Select(HuffmanTree HT,int k,int s1,int s2) { int i; i=1; while(i=k HT[i].paren

文档评论(0)

wuyuetian + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档