赫夫曼树,也称最优二叉树。树的带权路径长度为树中所有叶子节点的带权路径长度之和最短。书上举例多if条件嵌套判断,但由于各个条件出现的概率不一样,优化条件排布的先生顺序,程序运行的总路径长度也不一样,将高概率的条件放在前面,就使总长度最小。 赫夫曼树的原理就是这样, 在程序优化时,可以使用这个原理。
发散:一个if,就可以理解是一次二叉树的分支。
运用:使用不等长的码,的确可以减少码流的长度,但是一个很大的困难就在于如何正确的解码。 使用赫夫曼码,可以保证不重复的歧义码,既使总体编码最短,又没有重复的歧义码,也就可以正确的解码。 但是有利有弊,他的扩展并不是很方便,尤其是在带权的情况下,增加节点,树要重新构造。
下面这个例子,就是以出现概率为权值,构造最优二叉树
以下是对应的数据结构, a 是初始值,B是计算后的值。 这里需要注意的是,当出现相同权值的时候, 排在前面的节点先加。
发下是构造树的算法。循环取出权值最小的节点。 对照上面的数据结构,比较容易理解。