数据构造第15讲_赫夫曼树及其应用_C.pptVIP

  • 12
  • 0
  • 约5.6千字
  • 约 30页
  • 2019-01-12 发布于江苏
  • 举报
数据构造第15讲_赫夫曼树及其应用_C

6.6 赫夫曼树及其应用 1.基本术语 1)路径和路径长度 若一棵树中存在一个结点序列k1,k2,…,kj,使得ki是kj的双亲(0ij),则称此结点序列是从ki~ kj的路径。从k1~kj所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1。 在许多应用中,常常将树中的结点赋上一个有着某种意义的实数,称其为该结点的权。 结点的带权路径长度(WPL)规定为从树根到该结点之间的路径长度与该结点上权的乘积。 树中所有叶子结点的带权路径长度之和。通常记为: 其中 n 表示叶子结点的数目,wi 和 li分别表示叶子结点ki的权值和根到ki之间的路径长度。 4)赫夫曼(Huffman)树 又称最优二叉树。它是 n 个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树。 4.赫夫曼编码(赫夫曼树的应用之二) 1)二进制编码 通信中,可以采用0、1的不同排列来表示不同的字符,称为二进制编码。 发送端需要将电文中的字符序列转换成二进制的0、1序列,即编码; 接受端需要把接受的0、1序列转换成对应的字符序列,即译码。 字符:A B A C C D A 若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样有可能缩短传送电文的总长度。 2)前缀编码 若对某一字符集进行不等长编码,则要求字符集中任一字符的编码都不能是其他字符编码的前缀。符合此要求的编码叫做前缀编码。 利用二叉树设计二进制的前缀编码 3)赫夫曼编码 建立赫夫曼树及求赫夫曼编码的算法 typedef struct { unsigned int weight; unsigned int parent,lchild,rchild; } HTNode, *HuffmanTree; //动态分配数组存储赫夫曼树 typedef char **HuffmanCode; 例: 已知某系统在通信联络中只可能出现八种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计Huffman编码。 设权w=(5,29,7,8,14,23,3,11),n=8,则m=15 存储结构的初始状态为: 第6章 树和二叉树 6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.6 赫夫曼树及其应用 A B C D E F G a c b d 7 3 9 8 例:结点c的路径长度为2,其WPL=2*9=18 2)结点的权和带权路径长度 a c b d 7 3 9 8 3)树的带权路径长度 例:有四个叶子结点a,b,c,d,分别带权为9、4、5、2,由它们构成三棵不同的二叉树。 a c b d 4 9 5 2 b c d a 4 9 5 2 a b c d 9 2 4 5 a) WPL=9×2 +4×2+5×2+2×2=40 b) WPL=4×1+2×2+5×3+9×3=50 c) WPL=9×1+5×2+4×3+2×3=37 a b c 1)根据给定的n个权值{w1, w2, …, wn},构造 n棵二叉树的集合 F = {T1, T2, …,Tn},其中每棵二叉树中均只含一个带权值为wi的根结点,其左、右子树为空树; 4) 重复(2)和(3)两步,直至F中只含一棵树为止。 3) 从F中删去这两棵树,同时加入刚生成的新树; 2) 在F中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和; 2.构造最优树 赫夫曼算法: 第一步: a b c d 9 2 5 4 a c 9 b d 2 4 5 6 第二步: a b c d 9 2 4 5 第三步: 6 11 第四步: a 9 b c d 2 4 5 6 11 20 3.判定树 (赫夫曼树的应用之一) 在解决某些判定问题时,利用赫夫曼树可以得到最佳判定算法。 例:编制一将学生百分成绩按分数段分级的程序。 若学生成绩分布是 均匀的,可用图(a) 二叉树结构来实现。 a60 a70 a80 a90 不及格 中等 良好 优秀 及格 Y N Y N Y N Y N (a) 输入10000个数据,则需进行31500次比较。 0.1 0.3 0.4 0.15 0.05 比例 90—99 80—89 70—79 60—69 0—59 分数 学生成绩分布不是均匀的情况: a60 a70 a80 a90 不及格 中等 良好 优秀 及格 Y N Y N Y N Y N (a) 有

文档评论(0)

1亿VIP精品文档

相关文档