数据结构----哈夫曼树

这里写目录标题

  • 基本概念
    • 引子
    • 基本概念
      • 各种路径长度
      • 各种带权路径长度
        • 结点的带权路径长度
        • 树的带权路径长度
        • 哈夫曼树
    • 哈夫曼树的构造
      • 理论基础
      • 构造思想
      • 总结
    • 哈夫曼树的实现
    • 哈夫曼编码
      • 前缀编码
      • 哈夫曼编码的思想
      • 案例
      • 代码实现
    • 编码与解码

基本概念

引子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
哈夫曼树就是寻找构造最优二叉树,用于提高效率

基本概念

各种路径长度

在这里插入图片描述
在这里插入图片描述

各种带权路径长度

结点的带权路径长度

在这里插入图片描述
在这里插入图片描述

树的带权路径长度

在这里插入图片描述

在这里插入图片描述

哈夫曼树

在这里插入图片描述
带权路径长度最短的树或者二叉树

也就是树的叶子结点带权路径长度之和 :也就是叶子结点的结点路径长度(根结点到叶子结点的路径数) *权重 再求和
在这里插入图片描述
在这里插入图片描述
总结:位高权重
并且哈夫曼树不唯一

哈夫曼树的构造

理论基础

在这里插入图片描述
在这里插入图片描述

构造思想

在这里插入图片描述
可以看到 先将所有结点看成根结点构造出森林 并将权重赋值给结点
之后 选择两个小权重的结点 二者构造出新树 如上图 新树根结点权重为子树结点权重之和
这时要先将森林中的两个树删除 之后 将两个树构造成的新树加入森林(为了进行下一次权重的比较 从而下一步构造的顺利进行)
重复23步 直到剩单根

在这里插入图片描述
在这里插入图片描述
度 是指结点有的子树个数

哈夫曼树结点的度只能是0或者2
n个叶子结点的哈夫曼树 一共有2n-1个结点 分析如上橙色框

总结

在这里插入图片描述

哈夫曼树的实现

在这里插入图片描述
首先是已知叶子结点的个数以及权重

依次放入结构数组的前面 数组一共长度是2n 因为结点一共有2n-1 所以构造2n的数组 不用0下标

进行第二步 合并的时候 将新合并出来的结点往后依次放入 所以根结点是数组中的最后一个位置

新节点合成的时候 要修改新节点数组中的孩子结点下标 两个孩子要修改数组中双亲的下标

之后重复查找最小的权重的两个结点 前提是parent值是空 这是判断的关键 一旦parent值不为空的时候 就相当于退出了比较

在这里插入图片描述
在这里插入图片描述
初始化

在这里插入图片描述
上图中select方法 功能是在HT[K]中选择两个双亲域为0并且权重最小的结点 并返回s1 s2 用于后续操作

方法参数中i-1 是新合成结点的下标 ,在选最小的两个结点时 要从新节点前面选 这里对应理论分析中“第三步的a步骤”
i会逐渐递增

哈夫曼编码

前缀编码

在这里插入图片描述
图中为非前缀编码 所以要设计任意一个字符的编码都不是另一个字符编码的前缀
但是可以前缀一样 后面不一样

哈夫曼编码的思想

在这里插入图片描述
要想出现次数最多的编码最短 正好对应哈夫曼树的权重越大离跟结点越近的特点
在这里插入图片描述
所以在路径上标注0 或者 1
看从根结点到某一个叶子结点经过的路径 那些路径得出来的编码就是字符对应的二进制编码

因为叶子结点不会出现一个字符的路径完全包含另一个字符的路径 所以也就是前缀编码
并且要想出现次数最多的编码最短 正好对应哈夫曼树的权重越大离跟结点越近的特点 所以哈夫曼编码效率更高
在这里插入图片描述
因为叶子结点不会出现一个字符的路径完全包含另一个字符的路径 所以也就是前缀编码
并且要想出现次数最多的编码最短 正好对应哈夫曼树的权重越大离跟结点越近的特点 所以哈夫曼编码效率更高

案例

在这里插入图片描述
先根据哈夫曼树的设计思想 画出来哈夫曼树 在路径上标注0 1
在这里插入图片描述

代码实现

在这里插入图片描述
在这里插入图片描述
其中HC数组是指针数组 每个指针指向对应的字符串 也就是字符串的头指针

编码与解码

在这里插入图片描述
进行哈夫曼编码时 构造指针数组
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先根据哈夫曼树的构造思想+字符频度表 构造出哈夫曼树 标上各个叶子结点代表的字符 之后开始解码 0就向左走 1就向右走 直到走到叶子结点 记录一个字符 重复此操作即可

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

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

相关文章

Docker容器基础

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Docker概述1、docker是什么2、Docker的设计宗旨3、容器在内核中支持2种重要技术: 三、Docker的核心概念四、Docker相关命令1.安装依赖包2.设置阿里云…

无线测温产品在半导体制造项目的应用

摘 要:半导体被誉为“制造业的大脑”,在关系国家安全和国民经济命脉的主要行业和关键领域占据支配地位,是国民经济的重要支柱。 随着数字技术的发展和数字经济在国民经济中所占比重越来越高,半导体产业的重要性还会进一步提升。安…

C++QT教程3——手册4.11.1自带教程(笔记)——创建一个QT快速应用

文章目录 创建一个QT快速应用创建项目创建主视图添加应用逻辑为视图添加动画素材文件 参考文章 创建一个QT快速应用 本教程使用内置的QML类型,介绍了Qt Quick的基本概念。有关可以选择的用户界面选项的更多信息,请参阅用户界面。 本教程描述了如何使用…

部署mysql到win10电脑上

中间出现了很多问题, 记录一下 我这边是去官网下载的 ,链接:https://dev.mysql.com/downloads/mysql/ 我这边选了不是最新版本的MySQL,因为第一次安装8.1.0版本的,死活运行不起来,直接卸载安重装了&#x…

常用的分布式计算引擎

记录一下,作为备忘。 常用的分布式计算引擎 多表关联的问题,由于NoSQL数据库主要用于海量存储和单表查询,一般都不支持join,需借助更上层的计算框架来实现多表关联,比如: 计算框架支持数据源执行效率Hive本地文件、…

后端项目打包上传服务器记录

后端项目打包上传服务器记录 文章目录 后端项目打包上传服务器记录1、项目打包2、jar包上传服务器 本文记录打包一个后端项目,上传公司服务器的过程。 1、项目打包 通过IDEA的插件进行打包: 打成一个jar包,jar包的位置在控制台可以看到。 2、…

ssm蜀都天香酒楼网站设计与实现

ssm蜀都天香酒楼的网站设计与实现028 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首…

selenium语法进阶+常用API

目录 浏览器操作 浏览器回退,前进 与刷新 浏览器窗口设置大小 浏览器设置宽高 浏览器窗口最大化 浏览器控制滚动条 信息打印 打印页面的标题和当前页面的URL 定位一组元素 鼠标和键盘事件 键盘 鼠标 下拉框操作 通过索引定位(se…

【BASH】回顾与知识点梳理(三十二)

【BASH】回顾与知识点梳理 三十二 三十二. SELinux 初探32.1 什么是 SELinux当初设计的目标:避免资源的误用传统的文件权限与账号关系:自主式访问控制, DAC以政策规则订定特定进程读取特定文件:委任式访问控制, MAC 32.2 SELinux 的运作模式安…

安科瑞变电所运维平台在电力系统中应用分析

摘要:现代居民生活、工作对电力资源的需求量相对较多,给我国的电力产业带来了良好的发展机遇与挑战。探索电力系统基本构成, 将变电运维安全管理以及相应的设备维护工作系统性开展,能够根据项目实践工作要求,将满足要求…

C语言暑假刷题冲刺篇——day2

目录 一、选择题 二、编程题 🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:C语言每日一练 ✨其他专栏:代码小游戏C语言初阶🤝希望作者的文章能对你…

最小生成树,prim算法

Prim算法和Kruskal算法都是用于解决最小生成树问题的经典算法,它们在不同情况下有不同的适用性和特点。 Prim算法: Prim算法是一种贪心算法,用于构建一个无向图的最小生成树。算法从一个初始节点开始,逐步添加与当前树连接且具有…

【自动电压调节器】无功功率控制的终端电压控制研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【加强管理】《别输在不懂管理上》学习记录,黄金41条

成功有时是很难效法的,但失败是可以避免的,从失败中吸取经验和教训才是管理者的必修课。释义: 图形含义🌲一级重要🍀二级重要🌿三级主要🍁存在问题🌼解决办法 1 不能从头管到脚 不…

【讨论】视频监控集中存储方案如何做?

视频监控集中存储是指将多个视频监控摄像头所捕捉到的视频信号集中存储于一个中央设备,这个中央设备可以是服务器、网络存储设备或其他专用设备。通过集中存储,可以避免因为存储设备分散而导致的管理不便和难以有效地管理和检索视频数据,同时…

RTT(RT-Thread)ADC设备(RTT保姆级介绍)

目录 ADC设备 前言 ADC相关参数说明 访问ADC设备 配置ADC设备 ADC实例 硬件设计 软件设计 ADC设备 前言 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。 对于ADC的详细介绍和在STM32中的裸机应用可参考以下…

pandas数据分析38——数据框表格拓展以及缩回对齐

案例背景 需求是这个样的: 把这个表格进行拓展。 代码实现: df pd.DataFrame(np.array([[1, 2, 3,4], [a,b, c,d], [小明,小红, 小马,小天]])) df 方法一:自定义函数: def expand_dataframe(df):m, n df.shapenew_df pd.Dat…

linux系统中设置服务开机自启动

1:背景描述 最近根据工作需要,需要服务实现开机自启动的效果,因为平时只使用过nohup的后台挂起操作,很少接触开机,镜像装机服务自启动的功能,因此,这里简单记录一下。 注意,开机自…

解锁数据潜力:信息抽取、数据增强与UIE的完美融合

解锁数据潜力:信息抽取、数据增强与UIE的完美融合 1.信息抽取(Information Extraction) 1.1 IE简介 信息抽取是 NLP 任务中非常常见的一种任务,其目的在于从一段自然文本中提取出我们想要的关键信息结构。 举例来讲&#xff0…

从NLP到聊天机器人

一、说明 今天,当打电话给银行或其他公司时,听到电话另一端的机器人向你打招呼是很常见的:“你好,我是你的数字助理。请问你的问题。是的,机器人现在不仅可以说人类语言,还可以用人类语言与用户互动。这是由…