2024/9/9 408“回头看”:b树

B树是什么?有什么作用?B树的插入和删除具体细节是什么?除了B树还有一个是B+树、还是B-树,他们有什么区别,又有什么相同点?

b树在王道考研查找这一章,所以他的主要作用就是查找。

在学习b树之前,先要回顾一下二叉查找树。他的结构体是:

typedef struct BSTNode{
int key;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

不难看出它的结构,下面给个图示,就更加简洁明了了。

我们有个想法,能不能增加更多的分类?就是说从二叉查找树变成m叉查找树。于是b树就产生了。

结构体如下:

struct Node{
ElemType keys[4];
struct Node *chile[5];
int num; //结点中有几个关键字
};

从上面我们可以知道,假如一个结点有四个关键字,那么有五个分叉。

即如图所示:

有了这张图片就清晰很多了,同时也指出了几个特点:节点内关键字有序(方便查找,从结构体内我们知道,结点里是数组),根结点最少有一个关键字(很好理解,根结点假如没有关键字,那他不能向下分叉)。

这里还有一个规定,除根结点外(老大特殊),每个接点都有最少得关键字限制(为了提高查找效率,如果都是一个关键字,那和二叉查找树有什么区别?)

先说分叉,至少有一半以上的分叉,假如child[4],->至少两个分叉、child[5]->至少是有3个分叉。即偶数/2,奇数/2再四舍五入。

还有一个策略是忽略的,就是在m叉查找树中,任何一个节点,其所有子树的高度都要相同。也就是说所有叶结点都在同一层。b树的叶子结点是查找失败的结点。

b树的插入:

一个一个插入:溢出之后把他们从中间劈开、分给左右孩子。注意:新节点一定是插在终端节点那一层!(未溢出时)

此时中间劈开原结点分给父节点(这里体会到了结点内关键字有序的好处)这里还是把80移到父节点。规律总结:在插入key后,若导致原结点的关键字数超过上限,则从中间位置将其分成两部分,左部分放在原结点,右部分包含的关键字放到新节点,中间位置插入原结点的父节点。

若根结点满了!继续分裂:

b树的删除:

分多种情况:

终端节点:直接删除!(但是要注意删除完成之后,该结点的关键字个数是否小于一半)

非终端结点:用直接前驱替代:

用直接后继替代:

兄弟够借(找父母要,然后兄弟补给父母):右兄弟富裕

删除38

左兄弟富裕:删除92

兄弟不够借:

b+树:

图中是四阶b+树,下面说一下特点:分叉情况和b树一样。

结点的子树与关键字数相等。

所有叶结点包含全部的关键字,大小顺序排列,且相邻叶结点按大小顺序相互链接起来。

所有分支结点中仅包含它的各个子节点中关键字的最大值及指向其子节点的指针。

对比:b树的关键字每一层都有,而b+树的关键字只可能是在叶子结点。

真题训练:

注意:b-树也叫作b树。

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

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

相关文章

spring常用注解(10)@Order

一、 1、作用 加Order()注解,在注解中加入数字,数字越小,优先级越高,最先执行。 2、使用方法 (1)自定义顺序 Component Order(1) public class XxxFilter extends OncePerRequestFilter{}Component Or…

Python编码系列—Python工厂方法模式:构建灵活对象的秘诀

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

P3565 [POI2014] HOT-Hotels

~~~~~ P3565 [POI2014] HOT-Hotels ~~~~~ 总题单链接 ~~~~~ 2024.9.10:DP方程有问题,已修改,同时更新了长链剖分优化版本。 思路 ~~~~~ 设 g [ u ] [ i ] g[u][i] g[u][i] 表示在 u u u 的子树内,距离 u u u 为 i i i 的点的…

Android 手机自动化测试工具有哪几种?

一、Android手机自动化测试工具,常用的有这7中: 1、首推Appium: 推荐理由:功能非常强大的移动端自动化测试框架,还免费 下载链接:Appium: Mobile App Automation Made Awesome. Appium是一种被广泛使用的…

SAP自动化-AS02修改资产信息

Python源码 #-Begin-----------------------------------------------------------------#-Includes-------------------------------------------------------------- import sys, win32com.client import os#-Sub Main-----------------------------------------------------…

赵进喜:不透析、不用肾移植,“三维护肾”巧治尿毒症

潜心研究中医药治疗尿毒症等慢性肾脏重症40余年来,北京名老中医,慢性肾病国医大师吕仁和教授医术传承人,全国优秀基层名中医赵进喜总结出弥足珍贵的重症良方,临床应用无数次守护近10万肾病重症患者生命。让仅有22岁的慢性肾衰尿毒…

搜索功能技术方案

1. 背景与需求分析 门户平台需要实现对服务信息的高效查询,包括通过关键字搜索服务以及基于地理位置进行服务搜索。面对未来可能的数据增长和性能需求,选择使用 Elasticsearch 来替代 MySQL 的全文检索功能。这一选择的背景与需求可以总结为以下几点&am…

【Android安全】Ubuntu 16.04安装GDB和GEF

1. 安装GDB sudo apt install gdb-multiarch 2. 安装GEF(GDB Enhanced Features) 官网地址:https://github.com/hugsy/gef 2.1 安装2021.10版本 但是在Ubuntu 16.04上,bash -c "$(curl -fsSL https://gef.blah.cat/sh)"等命令不好使&…

测试2sigma离群点过滤

椭圆跑道形内部的离群点移除失败,影响拟合结果

『功能项目』战士的伤害型技能【45】

我们打开上一篇44战士职业平A怪物掉血的项目, 本章要做的事情是制作技能按钮,点鼠标点击时释放对范围内怪物的伤害技能 首先双击打开资源脚本下的Canvas预制体 制作技能栏 在资源商店中下载免费资源 - 技能图片 将技能图片拖拽至技能栏的Button按钮组件…

使用 React Testing Library 测试自定义 React Hooks

自定义 React hooks为开发人员提供了在多个组件之间提取和重用常见功能的能力。然而,测试这些 hooks可能会有些棘手,特别是对于测试新手来说。在本文中,我们将探讨如何使用 React Testing Library 测试自定义 React hook。 测试 React组件 首…

【YashanDB知识库】单机升级典型问题及应急措施

升级典型问题 官网升级操作指引 离线升级,一般线上操作之前需要照着做一遍,但是由于数据量少、monit进程在测试环境没有启动等原因,一些操作、配置问题在测试过程中不会暴露,在生成操作的时候才暴露,下面3项是比较常见…

【Solidity】开发心得 receive payable 里面尽量避免写代码,以免其他合约调用transfer 不成功

加密社 最近调试一段solidity代码,本来想测试在收款的时候,记录一个receive 和发出一个log,哪个消耗gas更大 我创建了两个智能合约:一个是TestTransfer,另一个是TransferCount。在TestTransfer合约中,我定义了一个叫做sendOut的函数&#xff…

o1系列亮相!OpenAI的AI新高度,解锁复杂推理能力

OpenAI的——o1系列模型,传说中的「草莓」,终于来与大家见面了! 这个新模型可不一般,它可以进行复杂的推理,就像在认真思考一样,不再是简单的回答问题。CEO奥特曼称,这是一个全新的开始。它不仅…

Mysql基础练习题 1407.排名靠前的旅行者(力扣)

编写解决方案,报告每个用户的旅行距离。 # 返回的结果表单,以 travelled_distance 降序排列 ,如果有两个或者更多的用户旅行了相同的距离, 那么再以 name 升序排列 。 题目链接: https://leetcode.cn/problems/top-travellers/d…

ROADM(可重构光分插复用器)-介绍

1. 引用 https://zhuanlan.zhihu.com/p/163369296 https://zhuanlan.zhihu.com/p/521352954 https://zhuanlan.zhihu.com/p/91103069 https://zhuanlan.zhihu.com/p/50610236 术语: 英文缩写描述灰光模块彩光模块CWDM:Coarse Wave-Length Division …

【机器学习】使用Numpy实现神经网络训练全流程

文章目录 网络搭建前向传播反向传播损失计算完整代码 曾经在面试一家大模型公司时遇到的面试真题,当时费力写了一个小时才写出来,自然面试也挂了。后来复盘,发现反向传播掌握程度还是太差,甚至连梯度链式传播法则都没有弄明白。 网…

Wophp靶场寻找漏洞练习

1.命令执行漏洞 打开网站划到最下,此处的输入框存在任意命令执行漏洞 输入命令whoami 2.SQL注入 搜索框存在SQL注入,类型为整数型 最终结果可以找到管理员账户和密码 3.任意文件上传漏洞 在进入管理员后台后,上传木马文件 访问该文件&…

element表格合并列数据相同合并单元格

<!-- :span-method"objectSpanMethod"合并列 --><el-table stripe :data"morningdataList" style"width: 100%" :span-method"objectSpanMethod" ><el-table-column align"center" label"" :show…

使用 BentoML快速实现Llama-3推理服务

介绍 近年来&#xff0c;开源大模型如雨后春笋般涌现&#xff0c;为自然语言处理领域带来了革命性的变化。从文本生成到代码编写&#xff0c;从机器翻译到问答系统&#xff0c;开源大模型展现出惊人的能力&#xff0c;吸引了越来越多的开发者和企业投身其中。 然而&#xff0…