【数据结构与算法】哈夫曼树与哈夫曼编码

news2024/9/22 12:46:13

文章目录

  • 哈夫曼树(最优二叉树)
    • 定义
      • 举个🌰(WPL的计算)
    • 哈夫曼树的构造(最优二叉树的构造)
      • 举个🌰
  • 哈夫曼编码
    • 定义
    • 构造

哈夫曼树(最优二叉树)

在介绍哈夫曼树之前,我们需要介绍一些概念:

  • 路径:路径是指从一个结点到另一个结点的之间所经过的所有结点构成的序列。

  • 路径长度:路径长度是路径上所经过的边的个数

  • :在应用树的时候,我们常常会将树的结点赋予一个表示某种意义的数值,这个值称为权。

  • 结点的带权路径长度:从根结点到一个结点的路径长度 * 该结点的权值 = 该结点的带权路径长度。

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

定义

在含有n个带权叶结点的二叉树中,其中带权路径最小的二叉树称为哈夫曼树,也称最优二叉树

举个🌰(WPL的计算)

在这里插入图片描述

第一棵树的 W P L = 7 ∗ 2 + 5 ∗ 2 + 2 ∗ 2 + 4 ∗ 2 = 36 WPL=7*2+5*2+2*2+4*2=36 WPL=72+52+22+42=36

第二棵树的 W P L = 4 ∗ 2 + 7 ∗ 3 + 5 ∗ 3 + 2 ∗ 1 = 46 WPL=4*2+7*3+5*3+2*1=46 WPL=42+73+53+21=46

第三棵树的 W P L = 7 ∗ 1 + 5 ∗ 2 + 2 ∗ 3 + 4 ∗ 3 = 35 WPL=7*1+5*2+2*3+4*3=35 WPL=71+52+23+43=35

第三颗树的 WPL 恰好是所有含有n个带权叶结点的二叉树中最小的,因此第三棵树为哈夫曼树。

注意:证明一个树是否为哈夫曼树,要看的是所有含有n个带权叶结点的WPL,而不是给几个二叉树选其中WPL最小的。(当然,由于这种证明几乎不可能实现,所以要证明一棵树为哈夫曼树,我们只需要证明它的结构符合最优构造方法即可——因为哈夫曼树并不唯一,例如把一颗哈夫曼树的左右子树交换,它就构成了一棵新的哈夫曼树)。

哈夫曼树的构造(最优二叉树的构造)

给定 n n n 个权值分别为 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn 的结点,构造最优二叉树的方法如下:

  1. 将这 n n n 个结点视为 n n n 棵只有一个结点的二叉树,它们构成了一个森林 F F F
  2. 在森林中选择两颗根节点权值最小的二叉树 T 1 , T 2 T_1,T_2 T1,T2,新增一个结点 N N N,把 T 1 , T 2 T_1,T_2 T1,T2 的根节点作为 N N N 的左、右孩子构成一棵新的二叉树 T 3 T_3 T3 N N N的权值等于 T 1 , T 2 T_1,T_2 T1,T2的根的权值之和。
  3. F F F 中删除 T 1 , T 2 T_1,T_2 T1,T2,把 T 3 T_3 T3加入到 F F F 中。
  4. 重复步骤 2 , 3 2,3 2,3,直到 F F F 中只剩下一颗树。

如果对哈夫曼树的构造方法的正确性感兴趣的同学,可以搜一搜哈夫曼树的构造方法的正确性证明。

举个🌰

在这里插入图片描述

把这几个叶结点按权值的从小到大排列,有:

在这里插入图片描述

选择权值最小的两个结点构成新的二叉树,有:

在这里插入图片描述

继续选择两个最小的结点,有:

在这里插入图片描述

继续:

在这里插入图片描述
这样我们就得到一颗哈夫曼树了

哈夫曼编码

在了解哈夫曼编码前,我们先了解一些相关的概念:

  • 定长编码:长度固定的编码。
  • 变长编码:长度不固定的编码。
  • 前缀编码:没有一个编码是另一个编码的前缀,这样的编码叫做前缀编码(显然,根据定义来说,定长编码一定是前缀编码,变长编码不一定是前缀编码)。

对于前缀编码来说,我们可以用树辅助构造前缀编码。

例如:假设要为a,b,c,d四个字符设计二进制前缀编码,那么我们可以用二叉树来辅助构造。

为了使编码能够符合前缀编码的要求,显然,a、b、c、d不会出现在分支结点上。

我们设从任意结点往左边走代表0,从任意结点往右边走代表1,(即指向左子树的边代表0,指向右子树的边代表1)那么a、b、c、d的编码为从根节点到对应叶结点所经过的边代表的值的序列。

我们可以得到如下所示的二叉树:

在这里插入图片描述

  • a的编码为:0
  • b的编码为:10
  • c的编码为:110
  • d的编码为:111

显然,没有一个编码是另一个编码的前缀,这种编码是前缀编码。

定义

哈夫曼编码是一种变长的二进制前缀编码,它利用哈夫曼树来辅助构造编码,能够非常有效地压缩二进制数据。

构造

我们将每一个字符当做一个独立的结点,其权值等于它出现的次数(或频度),构造一棵哈夫曼树。

设从任意结点指向左子树的边代表0,指向右子树的边代表1指向左子树的边表示1,指向右子树的边表示0。则各个结点的编码为从根节点到对应结点所经过的边代表的值的序列。

上面的例子就是一个构造哈夫曼编码的案例。

注意:相同结点构造出的哈夫曼树并不唯一,因为它并没有限制到底是左大右小还是右大左小。但相同结点构造出的不同的哈夫曼树的WPL一定是相同的。

同理,哈夫曼编码也是不唯一的。

全篇至此结束,感谢观看。

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

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

相关文章

中间件复习之-分布式存储系统

单机存储系统介绍 存储引擎:存储系统的发动机,提供数据的增、删、改、查能力,直接决定存储系统的功能(支持怎么样的查询,锁能锁到什么程度)和性能(增删改查速度)。 性能因素 写入方…

1939springboot VUE 高等院校求职信息管理系统开发mysql数据库web结构java编程计算机网页源码maven项目前后端分离

一、源码特点 springboot VUE高等院校信息(求职)管理系统是一套完善的完整信息管理类型系统 前后端分离,结合springboot框架和VUE完成本系统,对理解vue java编程开发语言有帮助系统采用springboot框架(MVC模式开发&a…

Spring Cloud全家桶(上)【Nacos、OpenFeign、LoadBalancer、GateWay、金丝雀灰色发布】

0.零基础入门微服务实战课 1.微服务和 Spring Cloud1.1 什么是微服务?1.2 什么是 Spring Cloud?1.3 微服务 VS Spring Cloud 2.为什么要学微服务?3.Spring Cloud 组件介绍1.什么是 Nacos?1.1 Nacos 功能1.1.1 配置中心1.1.2 注册中心 1.2 Na…

29、shell变量、重定向及运算符

一、shell脚本 1.1、shell的定义 脚本:可运行的代码的集合,脚本语言(计算机语言)。 脚本的特点:从上到下,按行执行。 python:脚本语言 格式更严谨的执行缩进。也是从上到下按行执行。 shel…

正式发布 | 极海首款GHD3440电机专用栅极驱动器,构建多元电机产品矩阵

​栅极驱动器是低压控制器和高功电路之间的缓冲电路,用于放大控制器的控制信号,从而实现功率器件更有效的导通和关断。随着各种智能电子设备的不断普及和应用,栅极驱动器的市场需求也在不断增加。据国际权威研究机构Yole Group预计&#xff0…

元灵诀 逆天纪系统搭建 零撸看广告升级模式 定制开发

在当今互联网飞速发展的时代,元灵诀逆天纪系统的出现无疑为游戏行业注入了新的活力。这款系统不仅是一个定制开发的youxiu作品,更是对游戏产业的一次深度思考和探索。其独特的零撸看广告升级模式,将游戏体验和商业模式完美结合,开…

HoloLens2系列讲解 - 05 HoloLens2 Appx 安装

安装准备 Hololens2设备打包好的Appx文件一台电脑Hololens2 和电脑需要处于同一局域网 安装Appx 1.在Hololens设备上点击设置->网络和Internet->选择“自己wifi名称”网络并点击自动连接。 2.查看HoloLens的IP地址,如192.168.0.1。 (1&#xff…

【Go语言】面向对象编程(二):通过组合实现类的继承和方法重写

通过组合实现类的继承和方法重写 要实现面向对象的编程,就必须实现面向对象编程的三大特性:封装、继承和多态。 1 封装 类的定义及其内部数据的定义可以看作是类的属性,基于类定义的函数方法则是类的成员方法。 2 继承 Go 语言中&#x…

微软将 AI 工具和软件的研发工作外包给 OpenAI

微软将 AI 工具和软件的研发工作外包给 OpenAI 科技媒体 CNBC 报道称,微软正计划将其人工智能(AI)工具和软件的开发工作外包给OpenAI,这对竞争对手谷歌来说无疑是一个利好消息。 Okta首席执行官Todd McKinnon表示,微…

【浏览器清空证书】

chrome://net-internals/#hsts 在地址栏输入并访问:chrome://net-internals/#hsts

.NET C# 读写Excel及转换DataTable

目录 .NET C# 读写Excel及转换DataTable1. 依赖库2. Nuget包与版本3. ExcelUtil3.1 Excel sheet 转 DataTable3.2 Excel sheet 转 DataSet3.3 DataTable 转 Excel sheet3.4 DataSet 转 Excel3.5 私有方法 .NET C# 读写Excel及转换DataTable 1. 依赖库 using NPOI.HSSF.UserMo…

[数据集][目标检测]中国象棋检测数据集VOC+YOLO格式300张12类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):300 标注数量(xml文件个数):300 标注数量(txt文件个数):300 标注类别…

串口通信的基本概念

串口通信(Serial Communications)的基本概念可以归纳为以下几个方面: 1、定义与原理: 串口通信是一种通过串行接口进行数据传输的通信方式。它可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可…

大学四年没写过一行代码?真实的计算机专业到底如何?

最近我帮一个学弟做了一个网站当作课程项目,我做好了发给他。他却问我怎么打开,可以用 eclipse 吗?当时直接给我整不会了。这个学弟是通过我们学校的一个代做项目群认识的,这个群有 600 多人,而且天天有人问有没有代做…

C# Web控件与数据感应之模板循环输出

目录 关于模板循环输出 准备数据源 ​范例运行环境 RepeatHtml 方法 设计与实现 如何获取模板内容 getOuterHtml 方法 getInnerHtml 方法 调用示例 小结 关于模板循环输出 数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互&…

国内前十款品质优秀贵金属交易平台app最新排名(功能评测)

投资者如果想要成功进行贵金属投资,则需要掌握相应的技巧和知识。首先,需要对市场进行充分的研究和分析,了解市场走势和资讯,确保自己能够作出明智的投资决策。其次,需要在投资时控制好风险,不将全部资产投…

Angular封装高德地图组件实现输入框搜索,地图点击选地点

Angular封装高德地图组件实现输入框搜索,地图点击选地点(Angular17版本) 话不多说直接上代码 创建一个独立组件 html代码: <div style"position: relative;"><input #searchInput nz-input placeholder"请输入地址"/><div #mapContaine…

ai变声小妙招:分享5个免费变声器,建议收藏!

你曾想过模仿别人的声音吗&#xff1f;也许你看过电影&#xff0c;并为电影中可能出现的变声而惊叹不已。但你知道在现实生活中也可以变声吗&#xff1f;虽然它可能不像你在大屏幕上看到的那样令人印象深刻&#xff0c;但它仍然可以为各种目的带来乐趣和帮助。在以下情况下&…

6月1号关于伊拉克COC清关严控

伊拉克目的港清关严控&#xff0c;所有管控范围内的产品务必申请COC证书&#xff0c; 到港货物&#xff0c;也可以补办了 具体咨询 办理伊拉克COC认证的流程包括&#xff1a; 准备必要的文件&#xff0c;如装箱单、形式发票、产品的测试报告&#xff08;已有测试报告的无需重…

Flutter笔记:关于WebView插件的用法(上)

Flutter笔记 关于WebView插件的用法&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…