每日学习一个数据结构-哈夫曼树Huffman Tree

文章目录

哈夫曼树(Huffman Tree)是一种特殊的二叉树,用于最小化带权路径长度,通常应用于数据压缩。以下是关于哈夫曼树的详细介绍:

基本概念

  • 带权路径长度(WPL):对于一棵二叉树,带权路径长度是所有叶子结点的权重与其到根结点的路径长度的乘积之和。哈夫曼树的目标是构造一棵带权路径长度最小的二叉树。
  • 叶子结点:二叉树中最底层的结点,没有子结点。
  • 非叶子结点:除了叶子结点之外的所有结点,拥有至少一个子结点。

构造方法

哈夫曼树的构造遵循以下步骤:

  1. 初始状态:给定一组带有权重的叶子结点,构造一个森林,其中每个结点都是一个孤立的树。
  2. 合并:从森林中找出两个具有最小权重的树,并创建一个新的结点作为它们的父结点,新结点的权重等于两个子结点的权重之和。
  3. 更新森林:用新创建的树替换原先的两棵树。
  4. 重复:重复上述步骤,直到所有结点合并成单棵树。

特点

  • 最优性:哈夫曼树构造的编码是前缀编码,即没有任何字符的编码是另一个字符编码的前缀,这样可以保证解码的唯一性。
  • 非唯一性:尽管哈夫曼树构造的编码是最优的,但是哈夫曼树本身并不是唯一的。根据不同的构造顺序可能会得到不同的树形,但它们的带权路径长度相同。
  • 编码规则:在哈夫曼树中,从根结点到叶子结点的路径可以定义为字符的编码,通常约定左分支编码为0,右分支编码为1。
  • 叶子结点度:哈夫曼树中不存在度为1的结点,只有度为0(叶子结点)和度为2(内部结点)的结点。

应用

哈夫曼树的主要应用领域包括数据压缩和传输优化。例如,在文件压缩软件中,使用哈夫曼编码可以有效地减少文件大小,从而节省存储空间或加快文件在网络上的传输速度。

实例

假设有四个字符A、B、C、D,它们的频率分别为5、9、12、13。构造哈夫曼树的过程如下:

  1. 初始森林:{A:5}, {B:9}, {C:12}, {D:13}
  2. 合并A和B,形成新结点AB(5+9=14)
  3. 当前森林:{AB:14}, {C:12}, {D:13}
  4. 合并C和D,形成新结点CD(12+13=25)
  5. 当前森林:{AB:14}, {CD:25}
  6. 合并AB和CD,形成新结点ABCD(14+25=39)

最终得到的哈夫曼树可以用来为每个字符生成一个唯一的编码,例如:

  • A: 00
  • B: 01
  • C: 10
  • D: 11

通过这种方式,可以有效地压缩原始数据。

相关推荐
爱吃西瓜的小菜鸡2 小时前
【C语言】判断回文
c语言·学习·算法
别NULL2 小时前
机试题——疯长的草
数据结构·c++·算法
小A1593 小时前
STM32完全学习——SPI接口的FLASH(DMA模式)
stm32·嵌入式硬件·学习
岁岁岁平安3 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA3 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
qq_589568103 小时前
数据可视化echarts学习笔记
学习·信息可视化·echarts
ZSYP-S4 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
唐叔在学习4 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
兔C4 小时前
微信小程序的轮播图学习报告
学习·微信小程序·小程序
海海不掉头发4 小时前
苍穹外卖-day05redis 缓存的学习
学习·缓存