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

前言

       哈夫曼树(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. 编译器:在编译器中,哈夫曼编码可以用于词法分析中的关键字识别。通过为常用关键字分配较短编码,可以提高解析速度。

总结

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

 结语     

如果你曾歌颂黎明

那么也请你拥抱黑夜

!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio安装TalkX AI编程助手

文章目录 TalkX简介编程场景 TalkX安装TalkX编程使用ai编程助手相关文章 TalkX简介 TalkX是一款将OpenAI的GPT 3.5/4模型集成到IDE的AI编程插件。它免费提供特定场景的AI编程指导,帮助开发人员提高工作效率约38%,甚至在解决编程问题的效率上提升超过2倍…

泷羽sec-shell脚本(全) 学习笔记

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

开发者如何使用GCC提升开发效率IMG操作

看此篇前请先阅读https://blog.csdn.net/qq_20330595/article/details/144134160?spm1001.2014.3001.5502 stb_image库配置 https://github.com/nothings/stb 代码 #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #define STB_IMAGE_WRITE_IMPLEM…

vue3【实战】面包屑【组件封装】Breadcrumb (根据菜单自动生成,实时响应路由变化,添加顺滑的过渡动画)

效果预览 技术方案 vue3 ( vite | TS | vueUse | AutoImport ) Element Plus UnoCSS 技术要点 根据当前路由查询所有父级路由 /*** 从树状列表中获取指定节点的所有父节点** param treeList 树状列表,包含多个节点* param value 目标节点的路径值* param parents…

pdf也算是矢量图——pdf大小调整--福昕pdf

有时候需要把pdf作为矢量图放到latex论文中,有时候需要裁剪掉空白的部分,就需要用福昕pdf进行编辑, 参考文章:福昕高级PDF编辑器裁切工具怎么用?裁切工具使用方法介绍_福昕PDF软件工具集 (foxitsoftware.cn)

【k8s】kubelet 的相关证书

在 Kubernetes 集群中,kubelet 使用的证书通常存放在节点上的特定目录。这些证书用于 kubelet 与 API 服务器之间的安全通信。具体的位置可能会根据你的 Kubernetes 安装方式和配置有所不同,下图是我自己环境【通过 kubeadm 安装的集群】中的kubelet的证…

Java项目Docker部署

docker将应用程序与该程序的依赖打包在一个文件里。运行这个文件就会生成一个虚拟容器,就不用担心环境问题,还可以进行版本管理、复制修改等。 docker安装 由于在CentOS下安装docker最常用,所以以Linux环境安装为主 1.安装工具包 缺少依赖…

【数据结构与算法】排序算法(上)——插入排序与选择排序

文章目录 一、常见的排序算法二、插入排序2.1、直接插入排序2.2、希尔排序( 缩小增量排序 ) 三、选择排序3.1、直接选择排序3.2、堆排序3.2.1、堆排序的代码实现 一、常见的排序算法 常见排序算法中有四大排序算法,第一是插入排序,二是选择排序&#xff…

Flink四大基石之Time (时间语义) 的使用详解

目录 一、引言 二、Time 的分类及 EventTime 的重要性 Time 分类详述 EventTime 重要性凸显 三、Watermark 机制详解 核心原理 Watermark能解决什么问题,如何解决的? Watermark图解原理 举例 总结 多并行度的水印触发 Watermark代码演示 需求 代码演示&#xff…

虚拟机docker记录

最近看了一个up的这个视频,感觉docker真的挺不错的,遂也想来搞一下: https://www.bilibili.com/video/BV1QC4y1A7Xi/?spm_id_from333.337.search-card.all.click&vd_sourcef5fd730321bc0e9ca497d98869046942 这里我用的是vmware安装ubu…

[ACTF2020 新生赛]BackupFile--详细解析

信息搜集 让我们寻找源文件,目录扫描: 找到了/index.php.bak文件,也就是index.php的备份文件。 后缀名是.bak的文件是备份文件,是文件格式的扩展名。 我们访问这个路径,就会直接下载该备份文件。 我们把.bak后缀删掉…

AD单通道AD多通道

AD单通道接线图 滑动变阻器的内部结构 左边和右边的两个引脚接的是电阻的两个固定端,中间这个引脚接的是滑动抽头,电位器外边这里有个十字形状的槽可以拧,往左拧,抽头就往左靠,往右拧,抽头就往右靠。所以外…

解决Ubuntu DNS覆盖写入127.0.0.53

ubuntu22.04解析网址时报错如图所示: 因为/etc/resolve.conf中存在 nameserver 127.0.0.53回环地址造成循环引用 原因: ubuntu17.0之后特有,systemd-resolvd服务会一直覆盖 解决方法: 1、修改resolv.config文件中的nameserver…

hint: Updates were rejected because the tip of your current branch is behind!

问题 本地仓库往远段仓库推代码时候提示: error: failed to push some refs to 192.168.2.1:java-base/java-cloud.git hint: Updates were rejected because the tip of your current branch is behind! refs/heads/master:refs/heads/master [rejected] (…

[golang][MAC]Go环境搭建+VsCode配置

一、go环境搭建 1.1 安装SDK 1、下载go官方SDK 官方:go 官方地址 中文:go 中文社区 根据你的设备下载对应的安装包: 2、打开压缩包,根据引导一路下一步安装。 3、检测安装是否完成打开终端,输入: go ve…

关于VNC连接时自动断联的问题

在服务器端打开VNC Server的选项设置对话框,点左边的“Expert”(专家),然后找到“IdleTimeout”,将数值设置为0,点OK关闭对话框。搞定。 注意,服务端有两个vnc服务,这俩都要设置ide timeout为0才行 附件是v…

AIGC时代 | 如何从零开始学网页设计及3D编程

文章目录 一、网页设计入门1. 基础知识2. 学习平台与资源3. 示例代码:简单的HTMLCSSJavaScript网页 二、3D编程入门1. 基础知识2. 学习平台与资源3. 示例代码:简单的Unity 3D游戏 《编程真好玩:从零开始学网页设计及3D编程》内容简介作者简介…

virtualbox给Ubuntu22创建共享文件夹

1.在windows上的操作,创建共享文件夹Share 2.Ubuntu22上的操作,创建共享文件夹LinuxShare 3.在virtualbox虚拟机设置里,设置共享文件夹 共享文件夹路径:选择Windows系统中你需要共享的文件夹 共享文件夹名称:挂载至wi…

C#窗体简单登录

创建一个Windows登录程序,创建两个窗体,一个用来登录,一个为欢迎窗体,要求输入用户名和密码(以个人的姓名和学号分别作为用户名和密码),点击【登录】按钮登录,登录成功后显示欢迎窗体…

es 3期 第12节-选择合适的数据查询方式

#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性&#xff…