数据结构之哈夫曼树

目录

引入

什么是哈夫曼树?

基本概念

哈夫曼树的构造

哈夫曼编码


引入

【例】计算各个成绩区间之间的学生人数。

一共有5个区间,分别为[0,60) [60,70) [70,80) [80,90) [90,100] 。可构造如下判定树。

但是成绩在70分至80分之间的人数居多,而判断时,要判断4次才能获得结果,但是需要判断一次(即成绩低于60分)的人数很少。这种判断树不是最优的。

我们可以根据每个成绩区间之间学生人数的概率大小调整一下判断树的结构,让人数多的成绩区间先判断,这样便减少了判断次数。如:

什么是哈夫曼树?

哈夫曼树(带权路径长度最短的树)又叫做最优树

基本概念

  • 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。
  • 结点的路径长度:两结点间路径上的分支数。
  • 树的路径长度:从树根到每一个结点的路径长度之
  • 结点数目相同的二叉树中,完全二叉树是路径长度最短的二叉树。
  • 权(weight):将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。
  • 结点的带权路径长度:根结点到该结点之间的路径长度与该结点的乘积
  • 树的带权路径长度:树中所有叶子结点带权路径长度之和

记作:

 WPL(Weighted Path Length)

 

 假设叶子结点上的数字即为该结点的权值,那么此树的带权路径长度为:

5*1+3*2+2*2=15

满二叉树不一定是哈夫曼树;

哈夫曼树中权越大的叶子离根越近;

具有相同带权结点的哈夫曼树不唯一

哈夫曼树的构造

  1. 根据n个给定权值构成n棵只有根结点的森林
  2. 在n个树中,选择两个权值最小的构成左右子树,设置新的二叉树的根结点的权值为其左右子树上根结点的权值之和
  3. 删除森林中的这两棵树,同时将新构造的二叉树加入森林中
  4. 重复步骤2和3,直到森林中只有一棵树(即哈夫曼树)为止

 

 

 

 

由上图可以看出,哈夫曼树的结点的度数为0或2,没有度数为1的结点。

哈夫曼树中共有2n-1的结点:其中n个原本给定权值的结点,n-1个新构造的结点。

哈夫曼树的任意非结点的左右子树交换后仍是哈夫曼树。

哈夫曼编码

给定一段字符串,如何对字符串进行编码,使得该字符串的编码存储空间最少?

  • 可用等长编码:每个字符用的编码长度想等
  • 也可用不等长编码:出现频率高的字符用的编码短一些,出现频率低的字符用的编码长一些。

但在进行不等长编码时,要避免二义性,即任何字符的编码都不是另一个字符编码的前缀。

【例】

对a,b,c分别进行编码:a对应1,b对应0,c对应10。

那么字符串abc对应的编码为:1010。

但是这段编码同时可以看成是由字符串cab、cc、abab组成。

二叉树用于编码:

  1. 左右分支分别对应:0,1
  2. 字符只存在于叶子结点上(这种情况下不可能出现一个字符的编码是另一个字符编码的前缀。)

【例】给定四个字符的频率:a:2   b:1   c:1   d:4

a:00  b:01  c:10  d:11

编码总长度:2*(1+1+2+4)=16

相当于每个叶结点的长度与其频率的乘积之和

所以,要想让编码总长度最短,要构造哈夫曼树。

a:10  b:110  c:111  d:0

 编码总长度:1*4+2*2+1*3+1*3=14

************************

************************

欢迎大家的指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值