数据结构中常见的树

ittbank 2023-05-29 17:56

哈夫曼树(Huffman Tree)
    哈夫曼树,又被称为最优二叉树,属于带权值二叉树的一种。它的真实节点全部分布在叶子节点中,是各种可能的组合中 WPL 值最小的形式。组合形式可能不唯一,但 WPL 值一定为最小。

    介绍一下 WPL(Weighted Path Length),也就是 带权路径长度,说简单一些就是【节点到根节点的路径长度 * 该节点的权值】。说白了就是权值越大的节点,离根节点越近就对了。
WPL_A = 9x2+4x2+5x2+2x2 = 40
WPL_B = 9x1+5x2+4x3+2x3 = 37
WPL_C = 4x1+2x2+5x3+9x3 = 50
    看一下上面这张图和三个对应的 WPL 的值,很明显可以看出来(b)是[9,4,5,2]这几个节点对应的哈夫曼树(的一种表现形式)。我们刚才也提了,哈夫曼树组成的形式可能不唯一,就比如说把(b)镜像过来看,也是哈夫曼树。
    哈夫曼树的应用中,最有名的就是哈夫曼编码了。通过这种编码方式,可以使得整体编码的长度最短。还需要说明的是,它是一种前缀编码,任何一个编码值,都不会为其他编码值的前缀(最左子串)。
    在 NLP(自然语言处理)领域划时代之作—— word2vec 的过程中,也通过哈夫曼树结构来加速查询高频词语,有兴趣的朋友可以了解一下。

最小生成树(Minimum Spanning Tree)

    最小生成树,虽然叫做“树”,但是它更多地出现在“图”相关的知识中,描述的是将一个有权图,转化成 所有节点均可连通,并且连接两边的权值之和最小的树形结构。提到这个,就肯定要说一下大名鼎鼎的 Prim 算法 和 Kruskal 算法,这两种算法分别是从 随机顶点的角度 和 权值最小的边的角度 出发,一步一步地选出适合的边,然后最终形成一颗包含全部 n 个节点和 n-1 条边的最小生成树。

    这方面比较经典的应用,就比如多个城市之间建铁路,要求每个城市都连通、并且铁路距离总和最小这种问题。后来我想想,送外卖的时候兴许也能用到这个方法,该为 35 岁之后的职业生涯提前规划起来了。

线段树(Segment Tree)

    线段树,是一种特殊的平衡二叉查找树,每个叶子节点表示一个真实的节点信息。而路径上所有的非叶子节点,用来表示它包含的各层级子节点的范围,并用于标记这个范围内的一些信息,比如范围内的 max 值或 sum 值等。
    线段树可以较好地兼顾区间插入新数据和单点数据修改的逻辑。当更新叶子节点内容的时候,只要更新该节点对应路径上的节点信息即可。主要用于一些对范围查询有很高要求的场景。

    值得一提的是,线段树可以通过一个一维数组来表示,如上图中绿色数字所示(其中 10、11 为空缺信息)。还需要说明的一点是,类似的概念还有区间树,也有人将这两个概念画了等号,大家自行了解分辨。

伸展树(Splay Tree)

    伸展树是一颗非平衡二叉搜索树。它的设计思路是基于一种假设:最频繁被查询的信息,它(和它附近的节点)在下次查询的时候更可能被查到。所以,通过 Splay Tree 查询的时候,会随着被查询的信息,反复调整树本身的结构,从而将经常被查询到的节点,放到 root 附近。这样就可能会加速查询的效率。
    这个乍一听,有点像 LRU 或者 LFU 类似的结构,但又有所不同。首先,Splay Tree 中会保留所有的节点信息,不存在过期(或超限)销毁的情况。还有一点就是它并不是被查到之后立即置顶,会有一些其他的综合考量(比如,每次最多进行两次 n 次旋转)。

    看一下上面这张图吧,它模拟的是(频繁)查询 R 的时候,Splay Tree 的变化情况。说白了就是把 R 节点放到根节点的位置,下次查起来就方便多了。Splay Tree 比较适合做缓存,特别是在热点数据相对集中的情况下,查询效率很高。举个应用的例子吧:我们常用的输入法,当你输入完拼音之后,会根据你的之前的选择情况,优先出现某些词语。但很多情况下,又不会直接把你上次选择的词语直接置顶,这就可以理解为是参考了伸展树的思路(当今输入法的排序,实际更多的应该是用 AI 算法是做概率预测,而非单纯的 Splay Tree)。

数据库领域

    数据库中非常核心的一个部分,就是索引结构的设计——这几乎决定了数据库的应用领域。而索引结构的设计,又是数据结构和算法的“重灾区”。下面我们就来列举几种数据库领域中,常见的树结构。

B 树

    传统的二叉树中,每个节点中包含一个信息,这样如果节点数比较多,路径就会很深。路径深了,对应的问题就是查询的过程中,需要经过更多的节点,从而造成性能下降。基于此,B 树诞生了。
    B 树也属于一种自然平衡树。内部通过分裂机制,能够保持数据的有序。它的单个节点中可以保存 2~4 个信息。单个节点内部有序,节点之间信息的间隔,可以作为划分下面部分的依据。

    看上面这张图,树中一共有 10 个人信息,按照红黑树的形式存储,最长的路径应该是 4。而通过 B 树进行存储,就会显得“矮胖”了,对应的跨节点查询次数也就缩短了。
    B 树比较适合于单点查询的场景,比较常见的应用就是 MongoDB 了。当然了,B 树也有一些不适合的场景,比如所有节点都放在磁盘上,则读写性能相对差;再比如说,如果我想查 5~9 范围内的所有数据,用 B 树是不是就需要在 3 个节点中反复横跳?

B+树

    B+树就是为了解决上面抛出的两个问题而设计的。与 B 树相同的是,B+树的节点中也包含了多个信息。但相比于 B 树,B+树做了一些改动:非叶子节点中仅保留数据之间的相对关系,而所有的真实信息均包含在叶子节点中。这样的话,相对关系信息就可以放到内存中,而将所有节点信息(可以认为量较大)保留在磁盘中。

    每次查询,通过相对关系,在内存中就可以快速的定位到具体的节点信息,从而减少磁盘的 IO 次数。这样做还有一个好处,可以通过一条“线”将所有叶子节点串联起来,从而方便做范围查询。大名鼎鼎的 Mysql 的存储引擎 InnoDB,使用的就是这种思路。
    不知道有没有朋友跟我一样,在很长的一段时间内,把数据库索引和 B+树画上了等号。其实不然,不同应用领域的数据库,有着不同的索引结构。B+树的信息存放在磁盘中,且属于非顺序写入,所以查询性能很高,但写入的性能偏低。在大数据存储和日志服务等需要频繁写入操作的领域,就有些不合适了——这就要引出我们接下来的话题了。
日志结构化合并树(Log Structured Merge Tree)
    多年前,谷歌在发大据领域发表了Big Table相关论文,LSM 树是其中的实现思路。我第一次听说 LSM Tree,是有幸跟一位 HBase 领域的资深大佬一起喝茶的时候。当时我红着脸表示,只听说过其中的一部分。

    与其说它是一种数据结构,其实它更像是基于此思想而衍生出的一系列算法操作的集合。它描述了将实时产生的大批量信息在内存中排序、更新,然后按批次顺序写入磁盘固化、合并的流程,从而兼顾了大批量数据的高效写入存储和范围查询等使用场景。
    我们刚才提到,B+树结构的存储索引并不适合在频繁写入的场景,其中一个很重要的原因就是因为它属于非顺序写入。而针对传统磁盘来说,由于扇区物理结构轮转,顺序写入的性能远好于非顺序写入。

•随机写入磁盘慢了咋办?
    将非顺序的信息在内存中攒成有序的一批信息(Segment),然后一次性写入磁盘不就好了么。
•攒批的时候,数据丢失或者进程崩溃了咋办?
    提前把数据写到一个本地日志文件(WAL 机制)里做备胎(不对,是备份)不就好了。
•需要在批量数据中做范围查找了咋办?
    在内存中记录每个 Segment(默认有序)的起止范围,每次查询的时候仅查询范围内的 Segment 不就好了。
•数据量太大,磁盘中的 Segment 太多,影响查询性能了咋办?
    当每个 Segment 大到一定的程度的时候,把几个 Segment 做归并排序,然后合并到一个大的 Segment 里不就好了么。
•写入数据之后,想删除咋办?
    根据 key 找到最后一次写入的信息,打上墓碑记号。查询到的时候,返回“这个真没有”不就好了么。
•墓碑记号太多,占用大量内存,咋办?•单点信息查询,数据太多,而且经常 miss,咋办?•范围查询,不好确认从哪个 Segment 开始,咋办?•...

    随着大数据的爆火,LSM Tree 被广泛用于 KV 型数据库和 OLAP 场景中,比如纯序员熟悉(拼写方式)的 HBase、Cassandra、LevelDB 等。相关领域的实际问题太多了,同样的,解法也很多。有兴趣的朋友可以深入了解一下。

ittbank 让电子库存因技术而改变的ITT模式电商平台。引领和适应市场,以共享经济理念的创客及工程师为核心、以免费开放用户生成的数据为基础,为其提供高性价比的应用解决方案和及时精准的供求信息,快速提高产品开发周期和生产直通率、提升电子器件的应用附加值。
评论
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 69浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 202浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 93浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 61浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 141浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 116浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 158浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 124浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 222浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 58浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 119浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 98浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 164浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 92浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 106浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦