目录
引入
【例】计算各个成绩区间之间的学生人数。
一共有5个区间,分别为[0,60) [60,70) [70,80) [80,90) [90,100] 。可构造如下判定树。
但是成绩在70分至80分之间的人数居多,而判断时,要判断4次才能获得结果,但是需要判断一次(即成绩低于60分)的人数很少。这种判断树不是最优的。
我们可以根据每个成绩区间之间学生人数的概率大小调整一下判断树的结构,让人数多的成绩区间先判断,这样便减少了判断次数。如:
什么是哈夫曼树?
哈夫曼树(带权路径长度最短的树)又叫做最优树
基本概念
- 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。
- 结点的路径长度:两结点间路径上的分支数。
- 树的路径长度:从树根到每一个结点的路径长度之和。
- 结点数目相同的二叉树中,完全二叉树是路径长度最短的二叉树。
- 权(weight):将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。
- 结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积。
- 树的带权路径长度:树中所有叶子结点的带权路径长度之和。
记作:
WPL(Weighted Path Length)
假设叶子结点上的数字即为该结点的权值,那么此树的带权路径长度为:
5*1+3*2+2*2=15
满二叉树不一定是哈夫曼树;
哈夫曼树中权越大的叶子离根越近;
具有相同带权结点的哈夫曼树不唯一
哈夫曼树的构造
- 根据n个给定权值构成n棵只有根结点的森林
- 在n个树中,选择两个权值最小的构成左右子树,设置新的二叉树的根结点的权值为其左右子树上根结点的权值之和
- 删除森林中的这两棵树,同时将新构造的二叉树加入森林中
- 重复步骤2和3,直到森林中只有一棵树(即哈夫曼树)为止
由上图可以看出,哈夫曼树的结点的度数为0或2,没有度数为1的结点。
哈夫曼树中共有2n-1的结点:其中n个原本给定权值的结点,n-1个新构造的结点。
哈夫曼树的任意非结点的左右子树交换后仍是哈夫曼树。
哈夫曼编码
给定一段字符串,如何对字符串进行编码,使得该字符串的编码存储空间最少?
- 可用等长编码:每个字符用的编码长度想等
- 也可用不等长编码:出现频率高的字符用的编码短一些,出现频率低的字符用的编码长一些。
但在进行不等长编码时,要避免二义性,即任何字符的编码都不是另一个字符编码的前缀。
【例】
对a,b,c分别进行编码:a对应1,b对应0,c对应10。
那么字符串abc对应的编码为:1010。
但是这段编码同时可以看成是由字符串cab、cc、abab组成。
二叉树用于编码:
- 左右分支分别对应:0,1
- 字符只存在于叶子结点上(这种情况下不可能出现一个字符的编码是另一个字符编码的前缀。)
【例】给定四个字符的频率:a:2 b:1 c:1 d:4
a:00 b:01 c:10 d:11
编码总长度:2*(1+1+2+4)=16
相当于每个叶结点的长度与其频率的乘积之和
所以,要想让编码总长度最短,要构造哈夫曼树。
a:10 b:110 c:111 d:0
编码总长度:1*4+2*2+1*3+1*3=14
************************
************************
欢迎大家的指正。