当前位置: 首页 > news >正文

数据结构——哈夫曼编码、哈夫曼树

1 哈夫曼树、哈夫曼编码

定义

哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0 层,叶结点到根结点的路径长度为叶结点的层数)。

哈夫曼编码是一种基于哈夫曼树的变长编码方式。它利用字符出现的频率来构造哈夫曼树,然后根据哈夫曼树对每个字符进行编码,使得出现频率高的字符编码较短,出现频率低的字符编码较长,从而达到数据压缩的目的。

路径和路径长度,节点的权,带权路径长度

在理解哈夫曼树和哈夫曼编码时,路径、路径长度、节点的权以及带权路径长度是几个关键概念。

路径

在树结构里,从一个节点到另一个节点所经过的节点序列就被称作路径。比如在二叉树中,从根节点到某个叶子节点的一系列节点连接起来就构成了一条路径。

路径长度

路径长度指的是路径上所经过的边的数量。边是连接两个节点的线段

从根节点 A 到节点 B 的路径 A -> B 只经过了 1 条边,所以这条路径的长度为 1;而从根节点 A 到节点 C 的路径长度同样为 1。若节点 B 还有一个左子节点 D,那么从根节点 A 到节点 D 的路径为 A -> B -> D,经过了 2 条边,路径长度就是 2。

节点的权

节点的权是为树中的每个节点赋予的一个数值,这个数值可以代表不同的含义,具体取决于应用场景。在哈夫曼编码中,节点的权通常表示对应字符出现的频率。

举个例子,字符 a 出现了 5 次,字符 b 出现了 3 次,字符 c 出现了 2 次。若构建哈夫曼树,那么代表字符 a 的节点的权就是 5,代表字符 b 的节点的权是 3,代表字符 c 的节点的权是 2。

带权路径长度(Weighted Path Length, WPL)

 从根节点到该节点的路径长度 与 该节点权值的乘积

WPL= \sum_{i=1}^{n} w_{i}*l_{i},其中 w是第 i 个叶子节点的权值,l 是第 i 个叶子节点到根节点的路径长度,n 是叶子节点的数量。

树的带权路径长度

所有叶子节点的带权路径长度之和

示例:假设有一棵哈夫曼树,有 5 个叶子节点,分别为 ABCDE,权值依次为 5、2、3、4、1。它们到根节点的路径长度分别为 2、3、3、2、4。则该树的带权路径长度为:WPL = 5×2 + 2×3 + 3×3 + 4×2 + 1×4 = 10 + 6 + 9 + 8 + 4 = 37

生成步骤

  1. 统计节点权值:首先要统计每个节点的权值,在哈夫曼编码的应用场景中,权值通常代表字符出现的频率。
  2. 构建初始森林:把每个节点当作一棵只有一个节点的树,从而构建一个森林。
  3. 选择最小权值节点:从森林里挑选出两个权值最小的树。
  4. 合并节点:将这两个权值最小的树合并成一棵新树,新树的根节点权值为这两个树的根节点权值之和。
  5. 更新森林:从森林中移除这两个被合并的树,再把新树加入森林。
  6. 重复步骤 3 - 5:不断重复上述步骤,直至森林中只剩下一棵树,这棵树就是哈夫曼树。

压缩比: 

在数据压缩中,压缩比是衡量压缩效果的一个重要指标,它表示原始数据大小与压缩后数据大小之间的比例关系。对于哈夫曼编码,其压缩比的计算方式如下:

压缩比 = 原始数据存储空间 / 压缩后数据存储空间

原始数据 “hello”,字符数量为 5,那么原始数据大小40bit ,5字节。假设字符 “h” 的哈夫曼编码为 “00”,“e” 为 “01”,“l” 为 “10”,“o” 为 “11”。那么 “hello” 的哈夫曼编码为 “0001101011”,总位数为 10 bit。\left \lceil 10/8 \right \rceil=2 字节。在计算压缩后数据大小时向上取整,是因为计算机存储数据的最小单位是字节,即使数据不足一个字节,也需要占用一个完整的字节来存储。

压缩比为2.5。

相关文章:

  • SAP-ABAP:SAP BW模块架构与实战应用详解
  • 使用Python将视频转化为gif
  • AF3 Rotation 类解读
  • stc8g1k08a+cd4017红绿灯
  • 嵌入式学习(31)-Lora模块A39C-T400A30D1a
  • 数据结构5(初):续写排序
  • HarmonyOS NEXT(九) :图形渲染体系
  • 嵌入式八股文学习——STL相关内容学习
  • 测试专项4:AI算法测试在测试行业中,该如何定位自己自述
  • 地理编码/经纬度解析/经纬度地址转换接口如何用JAVA对接
  • ui_auto_study(持续更新)
  • 当今前沿科技:改变世界的最新技术趋势
  • 【Spring】深入理解 Spring 事务管理
  • VScode
  • Java 中的多线程:核心概念与应用场景
  • 机器学习——KNN数据均一化
  • Qt文件管理系统
  • Spring AI相关的面试题
  • 算法如何测试,如果数据量很大怎么办?
  • 逆波兰表达式
  • 讲武谈兵|视距外的狙杀:从印巴空战谈谈超视距空战
  • 普京确定俄乌谈判俄方代表团名单
  • 七旬男子驾“老头乐”酒驾被查,曾有两次酒驾两次肇事记录
  • 西北大学副校长成陕西首富?旗下巨子生物去年净利超20亿,到底持股多少
  • 学者的“好运气”:读本尼迪克特·安德森《椰壳碗外的人生》
  • 人民币对美元即期汇率盘中创半年新高,离岸市场升破7.2