这一章就简单讲解一下哈夫曼树和哈夫曼树的原理以及另一种想法。首先我们来回顾一下数据结构中华说的哈夫曼树。
(1)两个结点之间的路径长度:从一个结点到另一个结点之间所经过的分支(边)数。
树的路径长度:是从根一点结点到树的每个叶结的路径长度之和。
PathLength=2×2+3×2
=10
(2) 带权路径长度
n个叶子的二叉树的带权路径长度记作:
其中:Wi是第i个叶子的权值,li是该叶子的路径长度
(3) 哈夫曼树(最优二叉树)
假设有n个权值{W1, W2,…, Wn},其中Wi≥0
(1≤i≤n),试构造一棵有n个叶子的二叉树,
每个叶子结点带权为Wi,则其中带权路径长度WPL
最小的二叉树称作最优二叉树或哈夫曼树(HaffmanTree)
哈夫曼算法
基本思想:
(1) 给定一组权值为数列{W1, W2,…, Wn},据此生成
一个森林F,F中每棵树只有一个根结点Ti,且使
Ti带有权值Wi;
(2) 选出根结点权值为最小和次小的二叉树作为左、
右子树,构造一棵新的二叉树,新二叉树的根的
权值为两棵二叉树根权值之和,然后将新二叉树
插到森林F中去,删去原来的两棵二叉树;
(3) 反复执行步骤(2),直到F中只有一棵树为止。
在这里我就不再贴代码了,就是讲讲他的公式为什么是这样的,当然了我们用的一般就是建造一棵哈夫曼树然后用他的权值乘以数值相加就行了,为什么??
我们设想有这么一棵树
那么我们就是WPL=5×2+2×3+4×3+7×2+8×2=58他的权值就是他和根节点的距离。我们以5来说,当你计算5+6=11的时候,5被用了一次,当你计算11+15=26的时候又被加了一次,所以就是两次,那么这个2就是他到根之间的距离。其余的数字是一样的代理。
下面我们用一种比较贴近生活的想法来,模拟这个过程。他要找的就是最小的中间数,假如说是2,4,5,7,8就是相加,然后求中间数2+4=6,6+5=11,7+8=15,11+15=26最后就是6+11+15+26=58,这个实现只需要基于一种排序即可,不过当数量巨大的时候,他的时间效率还是比较大的,但是这种方法简单,方便,对于哈夫曼可以解决的问题,他基本都可以解决。
如果给定一个序列2,7,4,8,5,让你不可以将之的顺序改变,还是求它的WPL,那么这个时候应用哈夫曼树就不好了,因为这样的话,会改变他的顺序,或者改变哈夫曼树的形态,那么这时候运用直接费排序的相合的方法是最直接方便的