数据结构【哈夫曼树】

哈夫曼树

  • 哈夫曼树的概念
  • 哈夫曼树的构造
  • 构造算法的实现
  • 哈夫曼树应用
    • 哈夫曼编码
    • 哈夫曼编码的算法实现

哈夫曼树的概念

最优二叉树也称哈夫曼 (Huffman) 树,是指对于一组带有确定权值的叶子结点,构造的具有最小带权路径长度的二叉树。权值是指一个与特定结点相关的数值。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

涉及到的几个概念:
路径:
从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。
结点的路径长度:
两结点间路径上的分支数。
树的路径长度:
从树根到每一个结点的路径长度之和。记作: TL。
权(weight):
将树中结点赋给一个有着某种含义的数值则这个数值称为该结点的权。
结点的带权路径长度:
从根结点到该结点之间的路径长度与该结点的权的乘积。
树的带权路径长度:
树中所有叶子结点的带权路径长度之和。
二叉树的带权路径长度 (Weighted Path Length):
二叉树的路径长度是指由根结点到所有叶子结点的路径长度之和。
如果二叉树中的所有叶子结点都具有一个特定的权值,则可将这一概念加以推广。设二叉树具有n个带权值的叶子结点,那么从根结点到各个叶子结点的路径长度与该叶子结点相应的权值的乘积之和叫做又树的带权路径长度,记为:
在这里插入图片描述
其中,wk为第k个叶子结点的权值,Lk为第k个叶子结点的路径长度。
在这里插入图片描述
最优树:带权路径长度(WPL)最短的树

注:
“带权路径长度最短”是在“度相同”的树中比较而得的结果,因此有最优二叉树、最优三叉树之称等等。

最优二叉树:带权路径长度(WPL)最短的二叉树

因为构造这种树的算法是由哈夫曼教授于 1952 年提出的所以被称为哈夫曼树,相应的算法称为哈夫曼算法。

哈夫曼树的构造

哈夫曼算法(构造哈夫曼树的四句口诀)
(1)根据n个给定的权值{ w1、w2、…、wn}构成n棵二叉树的森林F=(T1、T2、…、Tn},其中Ti只有一个带权为 wi的根结点。
构造森林全是根
(2)在F中选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,且设置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
选用两小造新树
(3)在F中删除这两棵树,同时将新得到的二又树加入森林中。
删除两小添新人
(4)重复(2)和(3),直到森林中只有一棵树为止,这棵树即为哈夫曼树。
重复 2、3 剩单根
在这里插入图片描述

可以得出:
1)哈夫曼树的节点的度为0或2,没有度为1的节点。
2)包含n个叶子节点的哈夫曼树中共有2n-1个节点。
3)包含n棵树的森林要经过n-1次合并才能形成哈夫曼树,共产生n-1个新节点。

构造算法的实现

顺序结构存储–一维结构数组

typedef struct (
	int weight;
	int parent, lch, rch;
)HTNode,*HuffmanTree;

先初始化再构造
1.初始化HT[1…2n-1]: lch=rch=parent=0;
2. 输入初始n个叶子结点: 置HT[1…n]的weight值;
在这里插入图片描述
3.进行以下n-1次合并,依次产生n-1个结点HT[i],i=n+1…2n-1:
a) 在HT[1.i-1]中选两个未被选过(从parent ==_0 的结点中选)的weight最小的两个结点HT[s1]和HT[s2],s1、s2为两个最小结点下标;
修改HT[s1]和HT[s2]的parent值: HT[s1] .parent=i; HT[s2] .parent=i;b)修改新产生的HT[i]:
HT[il.weight=HT[s1].weight + HT[s2].weight
HT[i]. lch=s1; HT[i]. rch=s2;
在这里插入图片描述

哈夫曼树应用

哈夫曼编码

在这里插入图片描述

哈夫曼编码的算法实现

在这里插入图片描述
示例:
在这里插入图片描述

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

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

相关文章

【Hystrix技术指南】(6)请求合并机制原理分析

[每日一句] 也许你度过了很糟糕的一天,但这并不代表你会因此度过糟糕的一生。 [背景介绍] 分布式系统的规模和复杂度不断增加,随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中,【熔断、隔离、降级、限流】是经常被使…

源码分析——LinkedList源码分析

文章目录 1.LinkedList简介2.内部结构分析3.LinkedList源码分析3.1构造方法3.2add方法3.3根据位置取数据的方法3.4根据对象得到索引的方法3.5检查链表是否包含某对象的方法: 1.LinkedList简介 LinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底…

以技术驱动反欺诈,Riskified 为企业出海保驾护航

如今,全球对于线上消费的需求日益增长,各类新型支付方式也层出不穷。在国内,线上支付有着较为完善的法律及监管条例,格局基本已定型。但对于出海商家而言,由于不同国家和地区的支付规则和监管机制不同,跨境…

【PostgreSQL内核学习(十一)—— OpenGauss源码学习(CopyTo)】

可优化语句执行 概述什么是列存储?列存的优势 相关函数CopyToCStoreCopyToCopyStatetupleDescCStoreScanDesc CStoreBeginScanRelationSnapshotProjectionInfo GetCStoreNextBatchRunScanFillVecBatchCStoreIsEndScan CStoreEndScan 声明:本文的部分内容…

使用docker搭建GPT服务

不用ChatGPT账号,不用API,直接免费使用上官方原版的GPT4.0! 这个操作主要使用的是GitHub上的一个开源项目freegpt。 通过docker把这个项目打包到本地电脑上,直接就能使用上原版GPT4.0。 第一步:下载Docker 下载网址:docker.com 根据自己的电脑系统下载对应的版本即可 下…

虚拟ip地址软件哪个好 手机虚拟ip地址软件有哪些

虚拟ip地址修改器 IP转换器软件是一种用于把不同格式的IP地址转换为另一种格式的工具。下面是几种常见的深度IP转换器软件: 1. 深度IP转换器 深度IP转换器是一种收费的、简单易用的在线工具,可以将IPv4地址转换为16进制、2进制和10进制等格式。此外&am…

基于Byzer-LLM和ChatGLM-6B快速搭建一款免费的语言大模型助力电商企业

假设有一家电商企业,员工大概20-30人,企业是在淘宝等电商平台买衣服,目前在淘宝上已经上架十万种服饰, 之前淘宝限制服饰的标题描述字数,所以写的特别精简。以该公司售卖的阔腿裤为例,目前标题都是这样的: …

Kafka 概述

Kafka 为什么需要消息队列(MQ)使用消息队列的好处(1)解耦(2)可恢复性(3)缓冲(4)灵活性 & 峰值处理能力(5)异步通信 消息队列的两…

AI和ChatGPT:人工智能的奇迹

AI和ChatGPT:人工智能的奇迹 引言什么是人工智能?ChatGPT:AI的语言之王ChatGPT的工作原理ChatGPT的优势和挑战AI和ChatGPT的未来展望结论 引言 人工智能(Artificial Intelligence,简称AI)是一项令人兴奋的…

LeetCode 周赛 340,质数 / 前缀和 / 极大化最小值 / 最短路 / 平衡二叉树

今天讲 LeetCode 单周赛第 340 场,今天状态不好,掉了一波大分。 2614. 对角线上的质数(Easy) 这道题是最近第 2 次出现质数问题,注意 1 不是质数! 质数判断:$O(n\sqrt(U))$ 2615. 等值距离和…

小程序裂变怎么做?小程序裂变机制有哪些?

做了小程序就等于“生意上门”?其实并不是这样。小程序跟流量平台较为明显的区别就在于小程序并非“自带流量”,而是需要企业利用自己的营销推广能力来建立引流渠道,从而完成用户的拉新和留存、转化。因此,想要用小程序来增加自己…

直线电机模组在激光切割机上的作用

激光切割机是将从激光器发射出的激光,经光路系统,聚焦成高功率密度的激光束。激光束照射到工件表面,使工件达到熔点或沸点,同时与光束同轴的高压气体将熔化或气化金属吹走。激光切割加工是用不可见的光束代替了传统的机械刀&#…

【2.3】Java微服务:sentinel服务哨兵

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏:Java微服务 ✨特色专栏: 知识分享 &…

24v转3.3v输出3A用什么芯片

问:客户需要一个能够将24V输入电压转换为3.3V输出电压,并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗?(vin24v、5v,vout3.3v,Io1-3A) 答:推荐使用…

Python程序设计基础:函数(一)

文章目录 一、函数的基本概念二、函数的定义和使用1、函数的定义与调用2、函数的参数3、返回多个值 一、函数的基本概念 在使用Python实现某些复杂的功能的时候,容易遇到一些重复率较高的代码,为了代码能够重复使用并提升代码的整洁度,函数这…

aardio + customPlus 显示图片演示

看效果: 上代码: import win.ui; /*DSG{{*/ var winform win.form(text"aardio customPlus 显示图片演示 by 光庆";right927;bottom607) winform.add( button{cls"button";text"下一页";left664;top536;right794;bott…

支持多用户协同的思维导图TeamMapper

什么是 TeamMapper ? TeamMapper 是基于 Mindmapp 开发的用于绘制思维导图的 Web 应用程序。它使得思维导图变得简单,你可以托管并创建您自己的思维导图。与您的团队分享您的思维导图会议并在思维导图上进行协作。 软件特点: 创建&#xff1…

详细教程:如何搭建废品回收小程序

废品回收是一项环保举措,通过回收和再利用废弃物品,可以减少资源浪费和环境污染。近年来,随着智能手机的普及,小程序成为了推广和运营的重要工具。本文将详细介绍如何搭建一个废品回收小程序。 1. 进入乔拓云网后台 首先&#xf…

微服务架构基础--第3章Spring Boot核心功能讲解

第3章Spring Boot核心功能讲解 一.预习笔记 1.使用maven创建SpringBoot项目 1-1:创建一个maven项目 1-2:在pom文件中导入依赖 1-3:编写启动类(注意启动类的位置) 1-4:编写测试类 1-5:运行SpringBoot启动类 2.了解p…

成功解决Android设备adb连接后显示device unauthorized

一、提出问题 在电脑通过USB连接新的Android设备,想要通过adb来进行一些操作时,却发现命令提示符上在输入下面命令后显示设备未授权的信息也就是"unauthorized" adb devices二、不可行的解决方案 有人提出的解决方案是打开Android设备的开发…