数据结构 (22)哈夫曼树及其应用

news2025/1/19 3:31:12

前言

       哈夫曼树(Huffman Tree),又称最优二叉树或最优树,是一种特殊的二叉树结构,其带权路径长度(WPL)最短。

一、哈夫曼树的基本概念

  1. 定义:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称为哈夫曼树。

  2. 带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。其中,结点的带权路径长度为从根结点到该结点之间的路径长度与该结点的权的乘积。

  3. 特点

    • 哈夫曼树中权越大的叶子离根越近。
    • 哈夫曼树的结点的度数为0或2,没有度为1的结点(除了根节点可能外)。
    • 包含n个叶子结点的哈夫曼树中,共有2n-1个结点(包括n个叶子结点和n-1个内部结点)。

二、哈夫曼树的构造算法

  1. 构造规则

    • 将给定的n个权值分别看作n棵只有根结点的二叉树,构成森林F。
    • 在F中选取两棵根结点权值最小的树作为左右子树,构造一棵新的二叉树,且新树的根结点权值为其左右子树根结点权值之和。
    • 在F中删除这两棵树,同时将新得到的二叉树加入森林中。
    • 重复上述步骤,直到森林中只剩下一棵树为止,该树即为所求得的哈夫曼树。
  2. 构造过程

    • 初始化:将每个权重作为一个叶子节点,放入一个优先队列(优先级基于节点权重,通常使用最小堆实现)。
    • 合并节点:从队列中取出两个权重最小的节点,创建一个新的内部节点,其权重为这两个节点的权重之和,新节点作为这两个节点的父节点。
    • 将新创建的节点放回优先队列,重复上述过程,直到队列中只剩下一个节点,该节点即为哈夫曼树的根节点。

三、哈夫曼树的应用

  1. 哈夫曼编码

    • 哈夫曼编码是一种基于哈夫曼树的数据压缩方法。它使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的。
    • 出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码。这样可以使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。
    • 哈夫曼编码广泛应用于文本、图像、音频等数据的无损压缩。
  2. 通信系统:在通信系统中,哈夫曼编码可以优化数据传输,减少带宽需求。通过将需要传输的数据进行哈夫曼编码,可以减小数据的大小,从而提高传输效率。

  3. 文件存储:哈夫曼编码还可以用于文件存储中,通过减小文件的大小来节约存储空间。这对于需要存储大量数据的系统来说是非常有用的。

  4. 编译器:在编译器中,哈夫曼编码可以用于词法分析中的关键字识别。通过为常用关键字分配较短编码,可以提高解析速度。

总结

       综上所述,哈夫曼树是一种非常重要的数据结构,在数据压缩、通信系统、文件存储和编译器等领域都有广泛的应用。通过了解其基本概念和构造算法,可以更好地理解和应用哈夫曼树及其相关技术。

 结语     

如果你曾歌颂黎明

那么也请你拥抱黑夜

!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins 的HTTP Request 插件为什么不能配置Basic认证了

本篇遇到的问题 还是因为Jenkins需要及其所在的OS需要升级,升级策略是在一台新服务器上安装和配置最新版本的Jenkins, 当前的最新版本是: 2.479.2 LTS。 如果需要这个版本的话可以在官方站点下载,也可以到如下地址下载&#xff1…

1.1 Beginner Level学习之“创建 ROS msg 和 srv”(第十节)

学习大纲: 1. msg 和 srv msg 文件是描述 ROS 消息字段的简单文本文件。它们用于为不同语言生成消息的源代码。srv 文件则描述了一个服务,包括两部分:请求和响应。Srv 文件用于生成服务的源代码。msg 文件存储在包的 msg 目录中。srv 文件存…

ubuntu中使用ffmpeg库进行api调用开发

一般情况下,熟悉了ffmpeg的命令行操作,把他当成一个工具来进行编解码啥的问题不大,不过如果要把功能集成进自己的软件中,还是要调用ffmpeg的api才行。 ffmpeg的源码和外带的模块有点太多了,直接用官网别人编译好的库就…

deepsort复现报错TypeError: tuple indices must be integers or slices, not tuple 解决

deepsort复现中遇到的TypeError: tuple indices must be integers or slices, not tuple问题的解决-CSDN博客 以上为参考教程。 复现的时候出现这个报错,搞了好久试了好多方法,包括降 scikit-learn版本,都不行,最后终于找到这个博…

Rigol DP711自动控制--SCPI命令

通过串口的SCPI命令来控制通道输入输出 也可以用UltraSigma UI来发送SCPI 物理连接: Pin2_2, Pin3_3, Pin5_5 串口命令控制: 命令:9600, 8bit, None SCPI CMD(Standard Commands for Programmable Instruments) OUTPut CH1, On…

【Java Web】Tomcat 快速入门

通常,为了让 Java 开发的应用程序(app)能够在服务器上正常运行,必须安装 Java 运行时环境(JRE)。JRE 主要支持 Java SE,而如果要运行 Java EE 应用,则需要更多的支持,比如…

RabbitMQ延迟消息的实现

RabbitMQ延迟队列的实现 延迟消息是什么延迟消息的实现死信交换机代码实现 延迟消息插件 延迟消息是什么 延迟消息是将消息发送到MQ中,消费者不会立即收到消息,而是过一段时间之后才会收到消息,进行处理。在一些业务中,可以用到延…

SpringMvc完整知识点一

SpringMVC概述 定义 SpringMVC是一种基于Java实现MVC设计模型的轻量级Web框架 MVC设计模型:即将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离…

强化学习新突破:情节记忆与奖励机制引领多智能体协作

简介 本推文介绍了韩国科学技术院发表在人工智能顶会ICLR 2024上的论文《Efficient Episodic Memory Utilization of Cooperative Multi-Agent Reinforcement Learning》。该论文提出创新性高效情节记忆利用(Efficient Episodic Memory Utilization,EMU…

密码翻译

密码翻译 C语言实现C实现Java实现Python实现 💐The Begin💐点点关注,收藏不迷路💐 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报…

【C++初阶】第7课—标准模版库STL(string_1)

文章目录 1. 什么是STL2. STL六大组件3. 标准库中string类3.1 auto关键字3.2 范围for3.3 string类的类型3.4 string类的常用接口(string类对象的常见构造)3.5 string的析构和赋值运算符重载3.6 string类对象的容量操作 1. 什么是STL STL(standard template library—标准模板库…

uniapp扭蛋机组件

做了一个uniapp的扭蛋机组件,可以前往下载地址下载 支持vue2、3、h5页面微信小程序,其余小程序未测试 示例图片

MyBatis的工作流程是怎样的?

大家好,我是锋哥。今天分享关于【MyBatis的工作流程是怎样的?】面试题。希望对大家有帮助; MyBatis的工作流程是怎样的? MyBatis 的工作流程可以分为几个主要步骤:从配置、映射到执行 SQL,最终获取数据库结…

MYSQL PARTITIONING分区操作和性能测试

PARTITION OR NOT PARTITION IN MYSQl Bill Karwin says “In most circumstances, you’re better off using indexes instead of partitioning as your main method of query optimization.” According to RICK JAMES: “It is so tempting to believe that PARTITIONing wi…

[软件工程]九.可依赖系统(Dependable Systems)

9.1什么是系统的可靠性(reliability) 系统的可靠性反映了用户对系统的信任程度。它反映了用户对其能够按照预期运行且正常使用中不会失效的信心程度。 9.2什么是可依赖性(dependablity)的目的 其目的是覆盖系统的可用性&#x…

vue3中使用watchEffect和watch函数时应当防止内存泄漏

官方文档:https://cn.vuejs.org/api/reactivity-core.html#watcheffect 也就是说当使用他们两个时候,使用完成之后要及时停止他们,防止一直在运行,停止他们之后,也可以再次开启。 watchEffect()​ 立即运行一个函数…

Wwise SoundBanks内存优化

1.更换音频格式为Vorbis 2.停用多余的音频,如Random Container的随机脚步声数量降为2个 3.背景音乐勾选“Stream”。这样就让音频从硬盘流送到Wwise,而不是保存在内存当中,也就节省了内存 4.设置最大发声数Max Voice Instances 5.设置音频…

Windows宝塔面板下IIS环境如何部署SSL证书?

Windows宝塔面板下IIS环境如何部署SSL证书? 平时服务器linux宝塔用的较多,所以linux系统宝塔,如何部署SSL证书还是比较熟悉,今天遇到一个windows的部署SSL证书,还是头一次,所以记录一下,以防忘…

【计算机视觉】图像的几何变换

最常见的几何变换有仿射变换和单应性变换两种,最常用的仿射变换有缩放、翻转、旋转、平移。 1. 缩放 将图像放大或缩小会得到新的图像,但是多出的像素点如何实现----插值 1.1 插值方法 最近邻插值 双线性插值 cv2.resize() 是 OpenCV 中用于调整图像…

深入浅出 Go 语言:数组与切片

深入浅出 Go 语言:数组与切片 引言 在 Go 语言中,数组和切片是两种非常重要的数据结构,用于存储和操作一组相同类型的元素。虽然它们看起来相似,但在使用上有很大的区别。理解数组和切片的区别以及如何正确使用它们,…