数据结构复习之哈夫曼树及应用

本文详细介绍了哈夫曼树的概念及其构造方法,并通过实例展示了如何利用哈夫曼算法生成最优二叉树及哈夫曼编码。文章还探讨了哈夫曼树的特点及其在数据压缩中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


最优二叉树,必考的内容,软考已经搞懂了,只是记录下。

哈夫曼树

概念

树的路径长度

从树根到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。

带权路径长度wpl

结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。

结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。

树的带权路径长度(WPL):定义为树中所有叶结点的带权路径长度之和。

哈夫曼树

带权路径长度WPL最小的二叉树称为最优二叉树或哈夫曼树。

哈夫曼算法

构造哈夫曼树方法

步骤:
① 将给定的权值按照从小到大排列成{W1,W2,…,Wm},并且构造出树林F={Tl,T2,…,Tm}。此时,其中的每棵树Ti (1≤i≤m)为左、右子树均为空的二叉树,二叉树的根结点的权值为Wi 。

② 把F中树根结点的权值最小的两棵二叉树T1和T2合并为一棵新的二叉树T(T的左子树为T1,右子树为T2),并令T的根结点的权值为T1和T2的根结点的权值之和,然后将T按其根结点的权值大小依次加入到树林F中。同时,从F中删去T1和T2这两棵二叉树。简言之,找两个最小的,合成一个,就删除这两个数,将合成的再加入到森林中,再找最小的两个合成一棵树…

③ 重复步骤②,直到构造成一棵哈夫曼树。

哈夫曼树的特点

① 在哈夫曼树中,权值越大的叶子离根结点越近。
② 若有n0个权值,需要进行n0-1次合并,构造成为哈夫曼树。
③ 哈夫曼树没有度为1的结点。
④ 由n0个权值构成的哈夫曼树,叶结点数为n0,度为2的结点数为 n0-1(二叉树的性质3),结点总数为n0+ n2= n0+ n0-1=2n0-1。
⑤ 给定一组权值,构造出的哈夫曼树的形态可能不唯一,但它们的带权路径长度都一样。

哈夫曼编码

编码和解码

数据压缩过程称为编码。即将文件中的每个字符均转换为一个唯一的二进制位串。

数据解压过程称为解码。即将二进制位串转换为对应的字符。

前缀码方案

对字符集进行编码时,要求字符集中任一字符的编码都不是其它字符的编码的前缀,这种编码称为前缀(编)码。设有abcd需要编码表示(其中,a=0、b=10、c=110、d=11,则110的前缀表示的可以是c或者是d跟a,出现这种情况是因为d的前缀11与c的前缀110有重合部分,这个是关键。)
等长编码:最常见的就是 ASSIC 编码,8位等长的二进制0-127来表示字符。可以预见,任何一个等长编码的字符,不可能是另一个字符的前缀,所以等长编码是前缀码。

哈夫曼编码

设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作为权构造一棵哈夫曼树,由哈夫曼树求得的编码就是哈夫曼编码。哈夫曼编码是最优前缀编码。

真题

假设通信电文使用的字符集为{a,b,c,d,e,f,g,h},各字符在电文中出现的频度分别为:7,26,2,28,13,10,3,11,试为这8个字符设计哈夫曼编码。要求:

(1)画出你所构造的哈夫曼树(要求树中左孩子结点的权值不大于右孩子结点的权值);

(2)按左分支为0和右分支为1的规则,分别写出与每个字符对应的编码

解决:如下图:
在这里插入图片描述

算法实现

看之前写过的算法:构建哈夫曼树和编码输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值