- 1、本文档共56页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Huffman树及其应用 Huffman树简介: 构造霍夫曼树的基本思想: 构造Huffman树的步骤: 操作要点2:按左0右1对Huffman树的所有分支编号! 例2:假设用于通信的电文仅由8个字母 {a, b, c, d, e, f, g, h} 构成,它们在电文中出现的概率分别为{ 0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10},试为这8个字母设计哈夫曼编码。如果用0~7的二进制编码方案又如何? 为清晰起见,重新排序为:w={2, 3, 6, 7, 10, 19, 21, 32} 对应的哈夫曼编码(左0右1): 例3:设字符集为26个英文字母,其出现频度如下表所示。 采用C语言的编程方法在VC++6.0环境下实现本题目的要求。主程序流程图 压缩部分 #includestdio.h #includestring.h #includestdlib.h #define MAX_SIZE 1000000 #define n 150 #define m 2*n-1 typedef struct { char ch; int weight; int lchild,rchild,parent; }HuffmanTree; typedef HuffmanTree HTree[m]; typedef struct { char ch; char bits[n+1]; }HuffmanCode; typedef HuffmanCode HCode[n]; int FileRead(int count[],char s[],char filename[]) { int i=0,N=0,k=0,temp[n]; char c; FILE *rf; rf=fopen(filename,r); if (rf==NULL) { printf(cannot open file\n); exit(0); } for (i=0;in;i++) { temp[i]=0; count[i]=0; } while (!feof(rf)) { c=fgetc(rf); k=c; temp[k]++; i++; } fclose(rf); for (i=0;in;i++) { if (temp[i]!=0) { s[N]=i; count[N]=temp[i]; N++; } } return N; }//FileRead 三 生成Huffman树函数 选取字符中权值最小的两个节点建树,将权值相加放在根节点中,将原节点删除,新节点放入数组。递归进行上述操作直到数组中只有一个节点为止。 算法如下: 2、建立哈夫曼树 构造哈夫曼数时,首先将n个权值的叶子结点存放到数组huffTree[2*num]的前n个分量中,然后不断的将两棵子树合并为一棵子树,并将新子树的根结点顺序存放到数组huffTree[2*num]的前n个分量的后面。设n个叶子的权值保存在数组cnt[n]中,哈夫曼树的存储主要是利用数组存储,例如将已知字符窜s为abcdeacedaeadcedabadadaead统计出的字符频率分别为a:9,b:2,c:3,d:7,e:5则构造哈夫曼树的存储空间的初始状态 最后状态如图: 四 求Huffman编码函数: 从叶子节点找到根节点,若该节点是双亲节点的左孩子为1,反之为0,直到根节点为止求得该节点Huffman编码的逆序列; 1.、对哈夫曼树进行编码函数void Huffmancoding(element huffTree[],Code CodeNode[],char str[],int n) ; 主要思想:规定哈夫曼编码树的左分支代表0,右分支代表1,则从根结点对应的字符的编码,称为哈夫曼编码。例如上面所举例子的哈夫曼编码构造树及哈夫曼编码 对每个叶子结点进行编码: a.1初始化编码深度为0,将孩子结点的双亲结点付给一个变量,双亲结点不为空时,深度加1,继续向上查找
文档评论(0)