当前位置: 首页 > news >正文

2023/2/13总结

今天主要学习了哈夫曼树。

哈夫曼树

哈夫曼树是二叉树的一种,它是一种WPL最优二叉树。

叶子结点(也称叶节点):指的是自己下面不再连接有节点的节点(即末端),称为叶子节点(又称为终端结点)

WPL是二叉树的带权路径长度,是指所有叶节点的路径长度乘以当前叶节点的权值之和,打一个比方:

下面有一个字符串,我们以字母出现次数作为权值,a所对应的权值4,我们需要构造一个二叉树,最优WPL的二叉树。 

这是最优的哈夫曼树了,你再也找不到一个比这更优的了,那么它的WPL值为

1*3+1*3+2*2+3*2+4*2=24

还有一个更简洁的计算方法就是将图中的非叶结点值相加,11+4+7+2=24.

存储元素的结点为2*n-1,我们原来有5个结点,最后变成了9个结点

这很巧妙了,接下来讲解如何构建一个哈夫曼树。

在表中找俩个最小值作为结点的左右孩子

很明显是d e所代表的权值,新结点的权值为俩孩子的权值之和,即是2

 

我们需要更新权值的数组,就是删除数组中c d的权值,把新节点的权值写入数组

 

再继续找俩最小值,是c代表的2和另外一个没名字的结点,从下往上插入哦。

重复这些操作知道权值数组没有数值,最后就会变成开篇讲的那样子。

构建哈夫曼树,主要是为了满足哈夫曼编码。

哈夫曼编码是编码的一种,它是用来压缩文本的,主要压缩一段较长并且重复率较高的代码。

之所以那样子建立树,是为了将出现次数多的字符放在前面,出现次数少的字符放在后面,保证访问率的快慢。

 

如上面所示将左边赋值为0,右边为1,我们可以发现一个特性,叶节点所构成的值,是不会有重复前缀的。(当然末尾俩个端点是会有一样的前缀,我们通常按照大小将其左右,左边是较小的,右边的较大的)

 

继而会变成上面那样子,我写的时候带了空格为了美观,实际存储时不带的,我们只需要根据哈夫曼树,按顺序找第一次出现的叶节点的编码,就可以凑成以上的字符串,(你可以自己试一试)。

哈夫曼编码是不等长编码。在一段长的重复率较高的文章特别适用。

http://www.lryc.cn/news/5403.html

相关文章:

  • webSock前端
  • AcWing 3956. 截断数组(每日一题)
  • Android 一体机研发之修改系统设置————屏幕亮度
  • C++通用算法
  • Springboot停机方式
  • Linux perf_event_open 简介
  • Java给定两组起止日期,求交集
  • 数组的复制与二维数组的用法
  • JS判断两个table数据是否完全相等(判断两个数组对象是否完全相等)
  • 关于小程序,你想知道的这些
  • WuThreat身份安全云-TVD每日漏洞情报-2023-02-13
  • 【Linux】软件安装(三分钟教会你如何在linux下安装软件)
  • Fluent Python 笔记 第 10 章 序列的修改、散列和切片
  • 在中国程序员工作是青春饭吗?
  • Linux tcpdump
  • redis知识汇总(部署、高可用、集群)
  • 【手写 Vuex 源码】第十篇 - Vuex 命名空间的实现
  • 面试腾讯测试岗后感想,真的很后悔这5年一直都干的是基础测试....
  • 知识图谱 方法、实践与应用 王昊奋 读书笔记(下)
  • vue实现打印浏览器页面功能(两种方法)
  • 【VictoriaMetrics】VictoriaMetrics单机版批量和单条数据写入(Prometheus格式)
  • 【青训营】分布式定时任务简述
  • golang语言本身设计点总结
  • PTA L1-046 整除光棍(详解)
  • 将小程序代码转成uni-app代码
  • C语言在游戏中播放音乐
  • 机器学习算法:随机森林
  • 如何做好多项目全生命周期的资源调配,提升资源利用效率?【橙子】
  • JVM - 内存分配
  • 【知识图谱论文】Bi-Link:通过转换器和提示的对比学习桥接来自文本的归纳链接预测