哈夫曼树与哈夫曼编码

哈夫曼树

构建哈夫曼树的步骤:

  1. 将每一个数据从小到大进行排序,每个数据都是一个节点,每个【节点】可以看成是一颗【最简单的二叉树】
  2. 取出根节点权值最小的两颗二叉树,组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和
  3. 再将这颗新的二叉树,以根节点的权值大小再次排序, 不断重复 1-2-3 的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树

举例:求hello_world 进行哈夫曼编码后的长度

各个字符出现的次数:

h: 1
e: 1
l: 3
o: 2
_: 1
w: 1
r: 1
d: 1

开始构建哈夫曼树

  1. 排序,得到8个叶子节点,即最简单的8棵二叉树

    image-20220316165444126

  2. 取出值最小的2棵树,这里有6个节点权值均为1,任选2个,对其权值求和为2,所以得到一个新的节点”2“

    image-20220316165729164

  3. 将新生成的节点2与剩下的节点重新排序

    image-20220316170109916

    排序后:

    image-20220316170312985

    继续构造:

    image-20220316170414918

    继续排序……如此重复下去,然后把每次生成的节点在同一幅图中绘制,就得到一棵哈夫曼树,最终构建的哈夫曼树是这样的:

    image-20220316171027407

从图中可以看出,红色的都是生成的节点,其WPL值为 1*4+1*4+1*4+1*4+1*3+1*3+3*2+2*2=32

也可以直接将红色节点的值加起来 2+2+2+4+4+7+11=32

二叉树的带权路径长度(WPL):从根节点到各个叶子节点的路径长度(即路径边数,如从11到h叶子节点长度为4)与相应节点权值(h的权值为1)的乘积的和:

\[WPL=\sum_{i=1}^n w_il_i \]

哈夫曼树就是构建出使得WPL最小的一棵二叉树

哈夫曼编码

构建出 hello_world这一字符串对应的哈夫曼树后,按如下位置添加 01

image-20220316172746276

可以看出,每个叶子节点都可以用边上的 0 和 1 来唯一表示

所以hello_world 各个字符的哈夫曼编码为:

h: 0000  r: 0001  _: 0010 e: 0011 
w: 100  d: 101  o: 11
l: 01
posted @ 2022-03-16 17:37  aJream  阅读(1156)  评论(0编辑  收藏  举报