《数据结构-C语言描述》课件第6章.ppt

《数据结构-C语言描述》课件第6章.ppt

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

可以验证,该编码是前缀编码。若一段程序有1000条指令,其中I1大约有400条,I2大约有300条,I3大约有150条,I4大约有50条,I5大约有40条,I6大约有30条,I7大约有30条。对于定长编码,该段程序的总位数大约为3×1000=3000。采用哈夫曼编码后,该段程序的总位数大约为1×400+2×300+3×150+5×(50+40+30+30)=2200。可见,哈夫曼编码中虽然大部分编码的长度大于定长编码的长度3,却使得程序的总位数变小了。可以算出该哈夫曼编码的平均码长为:举例:数据传送中的二进制编码。要传送数据state,seat,act,tea,cat,set,a,eat,如何使传送的长度最短?首先规定二叉树的构造为左走0,右走1,如图6.32所示。为了保证长度最短,先看字符出现的次数,然后将出现次数当作权,如图6.33所示。图6.32左走0,右走1的二叉树图6.33对字符按权排序字符staec字符出现的次数38752图6.34构造哈夫曼树的过程按规定:0左1右,则有00000101101123578cseat所以有state的编码为00111101101,stat的编码为001111011。构造满足哈夫曼编码的最短最优性质:(1)若di≠dj(字母不同),则对应的树叶不同。因此前缀码(任一字符的编码都不是另一个字符编码)不同,一个路径不可能是其它路径的一部分,所以字母之间可以完全区别。(2)将所有字符变成二进制的哈夫曼编码,使带权路径长度最短,相当总的通路长度最短。若要求传送以上这些编码长度不一的数据,且还要求传送词间互相区分,应如何设计最优编码呢?为保证传送词间互相区别,则需加入一空白字符出现频率,空白字符^出现为7,再构造哈夫曼树,由此得到的哈夫曼编码一定满足最短且又互相区分的性质。csea^t2357786.5.3哈夫曼编码算法的实现由于哈夫曼树中没有度为1的结点,则一棵有n个叶子的哈夫曼树共有2×n-1个结点,可以用一个大小为2×n-1的一维数组存放哈夫曼树的各个结点。由于每个结点同时还包含其双亲信息和孩子结点的信息,所以构成一个静态三叉链表。静态三叉链表描述如下:typedefstruct{unsignedintweight;/*用来存放各个结点的权值*/unsignedintparent,LChild,RChild;/*指向双亲、孩子结点的指针*/}HTNode,*HuffmanTree;/*动态分配数组,存储哈夫曼树*/typedefchar**HuffmanCode;/*动态分配数组,存储哈夫曼编码*/创建哈夫曼树并求哈夫曼编码的算法如下:HuffmanTreeCrtHuffmanTree(HuffmanTree*ht,*HuffmanCode,*hc,int*w,intn){/*w存放n个权值,构造哈夫曼树ht,并求出哈夫曼编码hc*/HuffmanTreeht;m=2*n-1;ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode));/*0号单元未使用*/for(i=1;i=n;i++)ht[i]={w[i],0,0,0};/*叶子结点初始化*/for(i=n+1;i=m;i++)ht[i]={0,0,0,0};/*非叶子结点初始化*/for(i=n+1;i=m;i++)/*创建非叶子结点,建哈夫曼树*/{/*在ht[1]~ht[i-1]的范围内选择两个parent为0且weight最小的结点,其序号分别赋值给

文档评论(0)

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

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

1亿VIP精品文档

相关文档