哈夫曼(Huffman)树的基本概念,构造算法以及哈夫曼编码

哈夫曼树的基本概念

  • 哈夫曼树: 假设有m个权值{w1,w2,···,wm},可以构造一棵含n个叶子结点的二叉树,每个叶子结点的权为wi,则其中带权路径长度WPL最小的二叉树称作最优二叉树或者哈夫曼树。
  • WPL(树的带权路径长度):所有叶子结点的权乘上到根节点的距离的总和。

例子:四个叶子结点a b c d,分别带权 6 3 4 2,则构建哈夫曼树如图:

WPL = 6 * 1 + 4 * 2 + 2 * 3 + 3 * 3 = 29

哈夫曼树的构造算法

  • 为了使WPL最小,用贪心思想容易知道,权越大的结点离根越近,这样构造出的树就是哈夫曼树。

哈夫曼树的构造过程

  1. 根据给定的n个权值{w1,w2,···,wm},构造n棵只有根结点的二叉树,这n棵二叉树构成一个森林F。
  2. 在森林F中选取两棵根结点最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
  3. 在森林F中删除这棵树,同时将新得到的二叉树加入F中。
  4. 重复2、3,直到F只含一棵树为止。这颗树便是哈夫曼树。

概括:说白了,就是每次在所有树中找到根最小的两个合并成一棵树,不断重复,直到剩一棵树为止。


例子:同样用四个叶子结点a b c d,分别带权 6 3 4 2,则构建哈夫曼树如图:

  1. 构造只有4棵只有根结点的二叉树。
  1. 不断合并最小的两棵树(① b和d最小,合并得到权值为5的树 ② c和权值为5的新树最小,合并得到权值为7的树 ③ 最后a和权值为7的树合并,得到权值为13的树)

哈夫曼树编码

  • 哈夫曼编码:对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1,则从根到每个叶子的路径上,各分支的赋值分别构成一个二进制串,该二进制串就为哈夫曼编码。

  • 哈夫曼编码是最优的前缀编码。

例子:

如图
哈夫曼编码为:
a:0
b:111
c:10
d:110

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值