【数据结构】哈夫曼树与哈夫曼编码

哈夫曼树的定义

我们给树的结点赋予一个表示某种意义的值,称为该结点的权

我们再定义从根结点到某个结点需要经过的边数,与该结点的权的乘积,称为结点的带权路径长度

所有叶子结点的带权路径长度之和,称为树的带权路径长度,记为WPL

 
下面,先来直观感受一下WPL的含义:

在这里插入图片描述

(a) WPL = 7×2 + 5×2 + 2×2 + 4×2 = 36

(b) WPL = 4×2 + 7×3 + 5×3 + 2×1 = 46

(c) WPL = 7×1 + 5×2 + 2×3 + 4×3 = 35

 
好了,下面给出哈夫曼树的定义:

在含有n个带权叶子结点的所有二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树。

 
 
 

哈夫曼树的构造

给定n个带有权值的结点,构造哈夫曼树的算法描述如下:

选出权值最小的两个结点,构造成一个新的结点,且新结点的权值看作两个结点的权值之和;不断重复这个过程。

由此构造出的哈夫曼树有如下特点:

1)每个结点最终都会称为叶子结点,权值越小的叶子越靠下,权值越大的叶子越靠上;

2)构造过程是个两两结合的过程,因此共新建了 n-1 个结点,最终哈夫曼树的总结点数为 2n-1

3)构造过程是个两两结合的过程,因此不会出现度为 1 的结点;

4)构造出的哈夫曼树是不唯一的,但是最小带权路径长度(WPL)是最小且唯一的。

 
看看图解,一下就会!!!以 {3,5,6,9,12} 为例:

在这里插入图片描述

 
 
 

哈夫曼编码

在数据通信中,对字符的编码可以是长度固定的,也可以是长度不等的。可变长度编码有个极大的好处,就是可以使得字符的平均编码长度减短,起到数据压缩的效果。

想要对不同的字符使用不同长度的编码的前提是,一个编码不能是另一个编码的前缀。这不难理解,假设合法编码有“110”、“11”、“0”,那么在翻译“1100”时,分割结果是不唯一的。

哈夫曼树有一个优秀的性质,即权值越小的叶子越靠下,权值越大的叶子越靠上。那么,如果我们把叶子结点权值设置为字符出现的频度,比给边标记上0/1,将从根结点到叶子经过的边的所有标记序列作为编码的话——频度越高的字符编码越短,频度越低的字符编码越长,并且不会出现一个编码是另一个编码的前缀的情况!

还是看个栗子吧 >_<!!!

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值