文章目录
了解哈夫曼树
先看一个例题:
将学生的百分制成绩转换为五分制成绩(编程),90-100:A 80-90:B 70-80:C 60-70: D <60:E
代码如下:
if(score<60)
grade=='E';
else if(score<70)
grade=='D';
else if(score<80)
grade=='C';
else if(score<90)
grade=='B';
else(score<100)
grade=='A';
同时这个判断的过程也可以画成一个二叉树(因为每个条件都有两个结果)
判断树
是它的名字,然后 它用于描述分类过程的二叉树,图如下
然后我们进一步分析一下,当输入量很大的时候,程序的操作时间,看看我们会发现什么?
实例一 浅了解哈夫曼树(最优二叉树)
假如学生的成绩数据共有10000个,并且二叉树从上到下每个等级占比依次是5%,15%,40%,30%,10%.
那么比较次数依次是:1,2,3,4,4次,所以10000个数据的比较次数为10000*5%*1+10000*15%*2+10000*40%*3+10000*30%*4+10000*10%*4=31500
这就是一个比较庞大的数字了,所以我们将条件顺序更改一下
这种情况下10000个数据的比较次数为:10000*20%*3+10000*80%*2=22000
这样看,两种判别树的效率是不一样,虽然这个看起来也不小,但是相对来说减少了1/3呢。
思考:能不能找到一种效率最高的判断树?
这个问题就间接提出了:哈夫曼树 (最优二叉树)
哈夫曼树的基本概念
路径:从树中的一个结点到另一个结点之间的分支构成这两个结点间的路径
结点的路径长度:两结点间路径上的分支数
树的路径长度:从树根到每一个结点的路径长度之和。记做:TL
结点数目相同的二叉树中,完全二叉树是路径长度最短的二叉树
权:将树中结点赋给一个有着某种意义的数值,则该数值称为该结点的权。(例:上面的百分数)
结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积
实例二 深入了解哈夫曼树的‘最优’
例:有4个结点a,b,c,d,权值分别为7,5,2,4,构造以这4个结点为叶子结点的二叉树,并计算其带权路径长度;
这里呢,先看两种
所有叶子结点路径一样
(a) WPL=(7+5+2+4)*2=36
叶子结点路径不同
(b) WPL=2