B组又现我不会的神奇东西了……
定义:
现在有n个元素,每个元素有一个值。
你需要把这n个元素放在一棵二叉树的叶子节点上,规定每个元素的代价为它所在叶子节点的深度乘上它的值,哈夫曼树就是使总代价最小的这样一棵树。
运用:
据说哈夫曼树是一棵最佳判定树,什么意思呢?举一个实例来看看。
问题:
给出一群学生的成绩,要你判断每个学生的成绩情况(不同分数段有不同的评价)。
解法:
这是一道信息学入门题,一贯的做法是打一坨if。
理论上当然是O(n)的,因为判断非常少,但是假设分数段非常非常多,我们知道最坏情况要把每个if都走一遍,在大数据中这非常慢。
然而事实上成绩的分布并不是均匀的,有些分数段人多,有些分数段人少,我们可以通过改变if的先后顺序来起到优化的目的。
举个例子,下面的图片盗自这里。
第一种构造方式:
第二种构造方式:
所以如果我们预先抽取一些数据知道了各个分数段的频数,把频数看作权值,建一棵哈夫曼树,按照哈夫曼树的顺序去判断,就可以大大优化时间。
构造:
首先需要明白的是,权值越大的深度肯定要越低,这个贪心显然。
动态规划做法:
先对元素从大到小排序。
设 fi,j 表示现在已经做了前i个元素,还空出来j个叶子节点的最小代价。
第一种转移显然,就是把第i+1个元素放到一个叶子节点上,