问题引入:
我们有一个根据分数划分类型的问题,如果按部就班的这么干,在某些情况下会出出现效率问题。
超过70分的有80%,这些人需要做三次没用的判断。
然而改进后,我们可以提高效率:
从某个节点到另外一个节点的连线树就是路径长度,如果带有权值,那就是权值与路径长度的乘积。
二叉树a的路径总长度:1+1+2+2+3+3+4+4 = 20
二叉树b的路径总长度:1+1+2+2+2+2+3+3 = 16
二叉树a的WPL:1*5+2*15+3*40+4*30+10*4 = 315
二叉树b的WPL:3*5+15*3+40*2+30*2+10*2 = 220
哈夫曼树的构造
1. 将所有带权值的叶子结点按权值从小到大依次排序。
A5 E10 B15 D30 C40
2. 取前两个元素构成一个父节点。
N1=A+E = 15
3. 把A和E在列表中去掉,用N1代替,先排序,再次按照步骤2进行操作。
N1=15, B = 15, D = 30,C = 40
N2 = N1+B = 30
现在整体是:
4. 重复以上操作
哈夫曼编码
实际上,将哈夫曼树表达的数据转换成0和1表示的方法就是哈夫曼编码。
将左子树设为0,右子树设为1,就是我们得到的哈夫曼编码。