第3章 算法与数据结构(三).pptVIP

  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文档。上传文档
查看更多
第3章算法与数据结构(三)要点

*/67 例:已知某系统在通信联络中只可能出现八种字符,其概率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10,试设计赫夫曼编码。 解:先将概率放大100倍,以方便构造赫夫曼树。 权值集合w={7,19,2,6,32,3,21,10} 2 3 5 6 11 7 10 17 28 32 60 19 21 40 100 1101 0.10 01 0.21 11111 0.03 10 0.32 1110 0.06 11110 0.02 00 0.19 1100 0.07 编码 频率 3.4.5 赫夫曼树及其应用 《软件技术基础》电子教案 */67 《软件技术基础》电子教案 typedef struct{ int weight;//权值分量(可放大取整) int parent,lchild,rchild; //双亲和孩子分量 }HTNode,*HuffmanTree;//用动态数组存储Huffman树 typedef char**HuffmanCode; //动态数组存储Huffman编码表 1、Huffman树和Huffman树编码的存储表示: 四、如何编程实现Huffman编码? 参见教材P147 建议1:Huffman树中结点的结构可设计成4分量形式: rchild lchild parent weight 建议2: Huffman树的存储结构可采用顺序存储结构: 将整个Huffman树的结点存储在一个数组HT[1..n..m]中;各叶子结点的编码存储在另一“复合”数组HC[1..n]中 3.4.5 赫夫曼树及其应用 指针型指针 */67 2、先构造Huffman树HT Void HuffmanCoding(HuffmanTree HT, HuffmanCode HC, int *w, int n){ if (n=1)return; m=2*n-1; //n 个叶子的HuffmanTree共有2n-1个结点; HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0单元未用 *w存放n个字符的权值 for(p=HT,i=1; i=n; ++i,++p,++w)*p={*w,0,0,0}; //初始化前n个单元 for(;i=m; ++i,++p) *p ={0,0,0,0}; //对叶子之后的存储单元清零 for(i=n+1;i=m; ++i){ //建Huffman树(从叶子开始) Select(HT, i-1, s1, s2); //在HT[1…i-1]选择parent为0且weight最小的两个结点,其序号分别为S1和s2 HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+ HT[s2].weight; } 3.4.5 赫夫曼树及其应用 《软件技术基础》电子教案 */67 3、求出n个字符的Huffman编码HC HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); //分配n个字符编码的头指针 向量(一维数组) cd=(char*) malloc(n*sizeof(char)); //分配求编码的工作空间(n) cd[n-1]=‘\0’; //编码结束符(从cd[0]~cd[n-1]为合法空间) for(i=1;i=n;++i){ //逐个字符求Huffman编码 start=n-1; //编码结束符位置 for(c=i,f=HT[i].parent; f!=0; c=f, f=HT[f].parent)//从叶子到根逆向求编码 if(HT[f].lchild==c) cd[--start]=‘0’; else cd[--start]=‘1’; HC[i]=(char*)malloc((n-start)*sizeof(char));//为第i个字符编码分配空间 strcpy(HC[i],cd[start]); //从cd复制编码串到HC } free(cd); //释放工作空间 } 3.4.5 赫夫曼树及其应用 《软件技术基础》电子教案 */67 树 森林 二叉树 存储结构

文档评论(0)

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

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

1亿VIP精品文档

相关文档