一:基本概念:
1.路径:由一结点到另一结点间的分支所构成
2.路径长度:路径上的分支数(A->E=2)
3.树的路径长度:从树根到每一结点的路径长度之和=10
4.结点带权路径长度:结点到根的路径长度与结点上权的乘积
F的带权路径长度WPL=9*2=18
5.树的带权路径长度:WPL=,Wi表示第i个结点的权值,Li表示结点的路径长度。
二.赫夫曼树:
2.思想:我们可以这样想,要想使得WPL最小,即权值Wi越大的Li就让它越小,越小的Wi的Li值就让它越大。
做法:
(1) 由给定的 n 个权值{w0, w1, w2, …, wn-1},构造具有 n 棵扩充二叉树的森林F = { T0, T1, T2, …, Tn-1 },其中每一棵扩充二叉树 Ti 只有一个带有权值 wi 的根结点, 其左、右子树均为空。
(2) 重复以下步骤, 直到 F 中仅剩下一棵树为止:
① 在 F 中选取两棵根结点的权值最小的扩充二叉树, 做为左、右子树构造一棵新的二叉树。置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
② 在 F 中删去这两棵二叉树。
③ 把新的二叉树加入 F。
三.赫夫曼树的应用:
1.判定树:
我们想能不能找到一种方式让它比较的少一点呢?很明显,我们让比例大的分数就让它少比较一点,让比例小的分数让它多比较一点,
这样的话就能达到比较次数少的目的了,,,很显然我们可以采用赫夫曼树的思想。。。
再将每一比较框的两次比较改为一次得到:
2.赫夫曼编码
1)通信中,可以采用0、1的不同排列来表示不同的字符,称为二进制编码。发送端需要将电文中的字符序列转换成二进制的0、1序列,即编码 ;
接受端需要把接受的0、1序列转换成对应的字符序列,即译码。
2)等长编码:用相等长度的01序列来编码,如A:01 B:10 C:11等;
不等长编码:用不同长度的01序列来编码,如A:001 B:01 C:1等(不等长的目的是让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,缩短传送电文的总长度), 采用不等长编码很明显不应该存在:字符集中任一字符的编码都不能是其他字符编码的前缀。符合此要求的编码叫做前缀编码。
3)利用二叉树就可以实现这种编码,让左分支为0,右分支为1就可以实现前缀编码(可以证明的)
如图:a:0 b:110 c:10 d:111
4).赫夫曼编码:
设计电文总长最短的二进制前缀编码即:以n种字符出现的频率作权,设计一棵赫夫曼树的问题,由此得到的二进制前缀编码称赫夫曼编码
例:
可得对应的哈夫曼编码(并与二进制编码比较)为: