试构造赫夫曼树.PPTVIP

  • 2
  • 0
  • 约3.13千字
  • 约 23页
  • 2018-08-05 发布于天津
  • 举报
试构造赫夫曼树

* * * * * * * * * * * * * * * * 赫夫曼树及其应用 路径 从一个结点到另一个结点的分支构成 路径长度 路径上的分支的个数 树的路径长度 从树根到每一个结点的 路径长度之和 * 赫夫曼树及其应用 以下我们只讨论二叉树 问题: 树的路径长度最短的是哪一种? 完全二叉树 * 赫夫曼树及其应用 权(weight) 给结点赋予一定的数值 结点的带权路径长度 从树根到该节点的路径长度×该结点的权 树的带权路径长度 Weighted Path Length 所有叶结点的带权路径长度之和 WPL = * 赫夫曼树及其应用 例 * 赫夫曼树及其应用 最优二叉树 又称赫夫曼树(Huffman) 有n个权值{w1,w2,...,wn} 构造一棵有n个叶结点的二叉树 每个叶结点的权值为wi 其中WPL最小的那一棵称作最优二叉树,即赫夫曼树 最优又能怎样? * 赫夫曼树及其应用 例 一个判断成绩等级的程序 if(a 60) b = “不及格” else if(a 70) b = “及格” else if(a 80) b = “中等” else if(a 90) b = “良好” else b = “优秀” 一个a最多要经过4次比较才能得出b 我们当然希望比较的总次数最小 * 假设有如下统计数据 原判定树为: 分数 0-59 60-69 70-79 80-89 90-100 概率 0.05 0.15 0.40 0.30 0.10 * 若一共有10000个输入数据 则总共的比较次数 = 500*1 + 1500*2 + 4000*3 + 3000*4 + 1000*4 = 31500 * 构造一棵赫夫曼树 有5个叶结点,权值分别为: 0.05, 0.15, 0.4, 0.3, 0.1 * 根据这棵赫夫曼树导出新的判定树: 总的比较次数 = 500*3 + 1500*3 + 4000*2 + 3000*2 + 1000*2 = 22000 * 赫夫曼树及其应用 赫夫曼树的构造算法 (1)根据给定的n个权值{w1,w2,…,wn}构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵二叉树只含一个带权的根结点,其左右子树均空 (2)在F中选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树根结点的权值之和 (3)在F中删除这两棵二叉树,同时将新得到的二叉树加入F (4)重复(2)和(3),直到F只含一棵二叉树 * 赫夫曼树及其应用 例: 设结点a,b,c,d的权值分别为7,5,2,4,试构造赫夫曼树 (1)F = { } (2)F = { } * (3)F = { } (4)F = { } * 赫夫曼树及其应用 理解 为什么赫夫曼树的带权路径长度最小? 它把权值小的结点放在底层 权值大的结点放在上层 * 赫夫曼树的应用——赫夫曼编码 例 某系统在通信联络中只可能出现八种字符(A,B,C,D,E,F,G,H),其使用概率分别为0.05、0.29、0.07、0.08、0.14、0.23、0.03、0.11,如何设计这些字符的二进制编码,以使通信中总码长尽可能短? 方案一:固定长度编码 8个字符,只需要3位二进制数就能表示 比如000代表A,001代表B,...111代表H 这样平均每个字符用3位二进制数表示 * 赫夫曼树的应用——赫夫曼编码 方案二:赫夫曼编码 平均每个字符的编码长度 = 4*0.05 + 2*0.29 + 4*0.07 + 4*0.08 + 3*0.14 + 2*0.23 + 4*0.03 + 3*0.11 = 2.71 A B C D E F G H 0.05 0.29 0.07 0.08 0.14 0.23 0.03 0.11 0110 10 1110 1111 110 00 0111 010 * 赫夫曼树的应用——赫夫曼编码 赫夫曼编码的方法 以字符出现频率为权值,构造赫夫曼树 左分支表示0,右分支表示1,把从根到叶子的路径上所有分支构成的0,1作为叶子的二进制编码,即为赫夫曼编码 比如 A:0110 B:10 C:1110 ... * 赫夫曼树的应用——赫夫曼编码 【数据结构】 typedef struct{  unsigned weight;  unsigned p;  unsigned lc;  unsigned rc; }HTNode,*HuffmanTree; typedef char * *Huffman

文档评论(0)

1亿VIP精品文档

相关文档