B树、B-树、B+树、B*树

B, B-, B+树的定义,特性,联系与区别(红黑树) B树的不同定义,有时B树即是B-树 为什么会有B树: 因为二叉树的查找平均时间是logN,是与二叉树的深度有关,所以为了减少二叉树的深度,增加查找速度,势必要增加树的叉树。如果该树是M叉的,M>2的话,logm(N)势必要小于log2(N),所以当数据量非常大的时候,B树的平均查找时间要少于二叉树。 红黑树:带有平衡性的二叉搜索树增强版 红黑树是每个节点都带有颜色属性的二叉查找树,颜色... 阅读详情

转自:http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html

B树

       即二叉搜索树:

       1.所有非叶子结点至多拥有两个儿子(Left和Right);

       2.所有结点存储一个关键字;

       3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

       如:

B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;

否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入

右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;

       如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树

的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构

(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;

       如:

但B树在经过多次插入与删除后,有可能导致不同的结构:

右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的

树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就

是所谓的“平衡”问题;      

       实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树

结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在B树中插入和删除结点的

策略;

 

 

B-树

       是一种多路搜索树(并不是二叉的):

       1.定义任意非叶子结点最多只有M个儿子;且M>2;

       2.根结点的儿子数为[2, M];

       3.除根结点以外的非叶子结点的儿子数为[M/2, M];

       4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

       5.非叶子结点的关键字个数=指向儿子的指针个数-1;

       6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

       7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的

子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

       8.所有叶子结点位于同一层;

       如:(M=3)

   B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果

命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为

空,或已经是叶子结点;

B-树的特性:

       1.关键字集合分布在整颗树中;

       2.任何一个关键字出现且只出现在一个结点中;

       3.搜索有可能在非叶子结点结束;

       4.其搜索性能等价于在关键字全集内做一次二分查找;

       5.自动层次控制;

       由于限制了除根结点以外的非叶子结点,至少含有M/2个儿子,确保了结点的至少

利用率,其最底搜索性能为:

其中,M为设定的非叶子结点最多子树个数,N为关键字总数;

       所以B-树的性能总是等价于二分查找(与M值无关),也就没有B树平衡的问题;

       由于M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占

M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并;

 

 

B+树

       B+树是B-树的变体,也是一种多路搜索树:

       1.其定义基本与B-树同,除了:

       2.非叶子结点的子树指针与关键字个数相同;

       3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树

(B-树是开区间);

       5.为所有叶子结点增加一个链指针;

       6.所有关键字都在叶子结点出现;

       如:(M=3)

  B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在

非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

       B+的特性:

       1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好

是有序的;

       2.不可能在非叶子结点命中;

       3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储

(关键字)数据的数据层;

       4.更适合文件索引系统;

 

 

B*树

       是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;

B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3

(代替B+树的1/2);

       B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据

复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父

结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

       B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分

数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字

(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之

间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;

       所以,B*树分配新结点的概率比B+树要低,空间使用率更高;

  

 

小结

       B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于

走右结点;

       B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键

字范围的子结点;

       所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

       B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点

中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

       B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率

从1/2提高到2/3;

 

为什么 MongoDB 索引选择B树,而 Mysql 选择B+树 前言 之前有人看了我的博客提出了这个问题,我懒省事让他自行百度,今天发现网上的答案很多,但是很啰嗦或者让人看不懂,所以就写下了这篇文章 一、B树和B+树的区别 很明显,我们要想弄清楚原因就要知道B树和B+树的区别。为了不长篇大论。我们直接给出他们的形式总结他们的特点。 1、B树 B树是一种自平衡的搜索树,形式很简单: 这就是一颗B树。针对我们这个问题的最核心的特点如下: (1)多路,非二叉树 (... 阅读详情

相关推荐

2020数据结构-查找之B树和B+树

一、B树和B+树 1.B树 应用场景 查找磁盘中地海量数据。 基本思想 1.若根结点不是终端结点,则至少有2棵子树。 2.除根节点以外的所有非叶结点至少有 M/2 棵子树,至多有 M 个子树(关键字数为M-1)。 3.所有的叶子结点都位于同一层。 与平衡二叉树的对比 (图片来自网络,侵删) B 树的每个节点可以表示的信息更多,因此整个树更加“矮胖”,这在从磁盘中查找数据(先读取到内存...

菜鸟算法 548

B-、B+树的区别

mysql

songtaiwu的博客 5576

编程规范(一):C/C++的命名原则

符合规范的统一命名是程序编写的基本规矩之一。很多时候我们不愿意接手别人的代码,原因之一就是代码命名很乱;我们自己写代码时经常写到后面忘了前面,也有可能是我们没有养成规范的命名习惯。当写代码成为一种艺术的美时,这种美的最直接的体现就是其中变量函数等命名的规范性。

烂笔头 7809

B-树、B树与B+树数据结构之间的区别

B-树、B树和B+树是常见且广泛应用的数据结构,用于高效地管理和检索大量数据,是在mysql数据库内部使用的索引结构,用于加快数据的访问速度和查询效率,也是mysql调优必须会的知识。虽然它们在某些方面相似,但它们在结构和应用上有一些重要的区别。

weixin_68919851的博客 7634

OneNet物联网项目实战:用‘匈牙利命名法’管理你的设备变量,告别上传混乱

本文介绍如何在OneNet物联网项目中应用匈牙利命名法管理设备变量,解决变量命名混乱问题。通过类型前缀标准化和云端设备端协同命名,提升变量调试效率,确保团队协作顺畅。文章包含STM32工程实现路径和大型项目管理策略,助力开发者打造高效的物联网变量管理体系。

weixin_29254673的博客 76

汇川CodeSys PLC编程:从‘iTemp’到‘fPressure’,手把手教你搞定变量命名与数据类型选择(附命名规范避坑清单)

本文详细介绍了汇川CodeSys PLC编程中变量命名与数据类型选择的工程化实践。通过实战案例和命名规范避坑清单,帮助工程师提升程序可读性和维护性,特别针对温度、压力等工业信号提供了数据类型匹配指南和调试技巧。

weixin_30776273的博客 438

编程命名规范

一、简介 无以规矩,不成方圆。 符合规范的统一命名是程序编写的基本规矩之一。很多时候我们不愿意接手别人的代码,原因之一就是代码命名很乱;我们自己写代码时经常写到后面忘了前面,也有可能是我们没有养成规范的命名习惯。当写代码成为一种艺术的美时,这种美的最直接的体现就是其中变量函数等命名的规范性。 首先总结一下命名的基本原则,也就是“道”的层次。 二、分类 目前业界共有四种常见的命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法。 1、匈牙利命名法 匈牙利命名法是早期的

Hyc_cheng的博客 927

C#变量命名别再瞎写了!Pascal和Camel命名法实战避坑指南

本文深入探讨C#变量命名规范,解析Pascal和Camel命名法的核心区别与应用场景,帮助开发者避免常见命名陷阱。通过实战案例和.NET生态工具推荐,提升代码可维护性和团队协作效率,特别适合Razor页面开发和.NET项目团队参考。

weixin_42530458的博客 228

4 命名规则_浅谈工控软件的符号变量命名规则

话说唐僧师徒被困平顶山莲花洞,金角大王的紫金葫芦着实厉害,孙悟空多次被银角大王用葫芦收了进去。危难之际,悟空变身为毕加索,继续叫阵。 各位看官,天生娇子_银角大王一战败北,“宝宝太难了,宝宝真是比窦娥还冤。”由此可见名字的重要性。 2010年以来,随着半导体行业的快速发展,工控行业的产品硬件进行了较大的升级换代,各品牌也推出了与之配套的全新软件平台,像西门子TIA Port...

weixin_36265507的博客 3035

汇川CodeSys PLC变量定义避坑指南:从BOOL到ARRAY,新手最易犯的5个命名与类型错误

本文详细解析了汇川CodeSys PLC变量定义中最常见的5个错误,包括数据类型选择不当、变量命名混乱、初始值遗漏、数组与结构体使用不当以及地址绑定错误。通过实际案例和代码示例,帮助新手避免这些陷阱,提升编程效率和系统稳定性。特别适合刚接触汇川PLC和CodeSys平台的开发者学习参考。

weixin_29173777的博客 332

变量与命名规则

本文介绍了C#中变量的基本概念、声明方法、命名规则及最佳实践。主要内容包括:1) 变量基础,如声明语法、初始化和作用域;2) 严格的命名规则,区分强制规则和推荐规范,包括驼峰命名法和帕斯卡命名法的适用场景;3) 命名最佳实践,如布尔类型和集合类型的特定约定;4) 变量类型与存储的基本数据类型介绍。文章强调使用描述性变量名和遵循命名规范的重要性,并提供了代码分析工具的使用建议。

飞上云层 129

C99变量命名之嵌入式改良匈牙利命名

标识符命名清晰,简明,有意义,使用完整英文单词,禁止使用单个字符,除了循环计数器外和汉语拼音.除头文件保护宏外,不使用下划线 _ 作为标识符的开头或结尾变量采用小写字母加下划线组合局部循环变量允许使用i、j、k 等单个字符;/* 符合规范 *//* 符合规范 *//* 不符合规范 *//* 不符合规范(拼音) */核心逻辑: 前缀=变量属性+类型,主体=业务含义:标记(g/st/pst/u32),工业、单片机、驱动代码主流。

2601_95221481的博客 247

读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书)

终于从头到尾把鱼书看完啦,真的是非常入门,非常查漏补缺,对新手很友好,对有一定基础的人也非常不错。看完不复习等于没看,所以今天开始复盘,顺便写这篇读书笔记。希望分享给没看过这本书或者看过这本书的同僚们参考,欢迎大家指教。我将从第三章神经网络开始复习,前两章内容书里已经非常基础and清楚了。(会持续更新滴).........

博客而已 1万+

使用在线变量命名自动生成辅助标记工具,轻松替换百度翻译。

前言:做开发,经常需要查翻译软件,目的就是要查询一些单词,并把他们形成合规的形式,并命名变量。但长期来讲翻译软件的效率确实不是很高。 首先代码命名的方法分为驼峰法、划线法、匈牙利法,共三个常见的大类,在我们日常工作中,基本上都是这几类的命名规则,通过此类的命名规则,来编写我们代码的相关变量。 方法一、利用翻译软件来实现变量名的编写 使用:翻译软件进行变量名的查询和命名 步骤一、打开百度翻译,输入中文,利用英文进行编写变量 步骤二、手动修改单词形成符合命名规范的变量名 listManager 驼峰法 l.

我不叫程序猿的博客 1110

招标信息爬取工具

一个能帮你节省大量时间的实用小工具,我自己用了挺久,分享出来给有需要的朋友

qq_56877290的博客 834

Linear超高PSRR线性稳压器-典型应用电路解析

本文整理完了LT3045数据手册内所有的典型应用电路,试图让沉默的电路开口,简单介绍了他们这样做的目的和原理,从中我们可以更加熟悉这颗经典芯片的应用。但也有一些电路并没有搞懂,遗留下了不少问题。

硬件工程师笔记 2939

js中定义变量名有哪些规范

学习js的朋友一定要知道和注意,其实每种语言都有它的命名规则。下面总结了几条: a、变量命名必须以字母或是下标符号”_”或者”$”为开头。 b、变量名长度不能超过255个字符。 c、变量名中不允许使用空格,首个字不能为数字。 d、不用使用脚本语言中保留的关键字及保留符号作为变量名。 e、变量名区分大小写。(javascript是区分大小写的语言) 举例: a:以字母或下划线_

小屋博客 1万+

PlutoSDR在matlab中的环境配置(包括驱动和硬件支持包)

双击下载到的驱动,除了点击接受协议和设置安装路径,其他只要点击下一步或者安装即可。登录或者注册你的账号,选择你的matlab版本(这里我的是2023b),点击下一步。设置安装路径,并选择我接受,点击下一步,即可安装完成,并在安装路径中得到。完成后,打开设备管理器,在端口和通用串行总线设备一栏,即可看见下图。点击进入,选择相应的系统安装包,这里我选择的Windows。可看到我们要安装的Pluto支持包,安装即可。右击桌面matlab,选择打开文件所在位置。右上角搜索pluto,选择并点击下一步。

weixin_53160338的博客 4864

Java基础——编码命名规范

规范的命名、合理的代码注释可以大大提高代码的可读性,所以要养成良好的习惯哦!

shouyeren_st的博客 866

霍尔式流量计背后的技术和算法

例如,在一项实验中,当流量低于最小操作范围(0.250 L/min)时,误差比其他流量大,但仍然在95%的精度范围内可接受。例如,在Honeywell电子学的测试中,使用30英寸水柱的压力计和热电偶测量气体特性,记录并计算实际和理论质量流量,以确定修正系数。霍尔式流量计的校准系数是通过一系列精确的测量和计算步骤确定的,以确保其测量结果的准确性和可靠性。霍尔式流量计的校准系数是通过严格的环境条件、精确的测量步骤和实验数据确定的。其中,Qs是标尺介质的流量,K是修正系数,Qm是用户介质的流量。

百态·数智思维 | 聚焦大数据、量化与未来AI 1233

51单片机IAP在线升级

51单片机IAP在线升级 爱矽半导体E85F3325单片机IAP在线升级教程,此处可查看更新及demo下载 文章目录前言一、ROM资源二、KEIL有关知识1.BL51连接器:2.LX51连接器:三、Keil其他相关项说明:四、MCU启动文件说明:五、例程BOOTLOADER使用说明六、例程使用可更改说明:七、程序使用通信方式:XMODEM八、APP程序说明九、APP代码升级说明十、代码合并烧写 前言 扩展-IAP 主要用于产品出厂后应用程序的更新作用 ,类似于其他引导装载升级程序的方法,在系统中必须始终

qq_42415953的博客 6666

java文件的命名_java命名规范

一,java文件命名规范1.包名(package)命名必须全部使用英文小写字母,禁止使用“下划线”等字符。(除常量外,Java命名习惯中均不推荐使用下划线等字符)项目包命名规则:..。相关项目可使用...的命名法则。2.Class/Object、Interface类和接口使用大驼峰命名法抽象类使用“Abstract”做为类命名的开头Exception类命名使用“Exception”做为类命名的结尾...

weixin_34856548的博客 4095

YOLOv8改进 | Conv篇 | 利用YOLO-MS的MSBlock轻量化网络结构(既轻量又长点)

本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块,我们将其用于C2f中组合出一种新的结构,来替换我们网络中的模块可以达到一种轻量化的作用,我将其用于我的数据集上实验,包括多个类别的数据集,其在轻量网络结构的同时,却能够提高一定的mAP精度,所以这是一种十分高效的模块,该网络结构非常适合那些模型精度已经无法提到,想要从轻量化模型的角度入手的读者使用。欢迎大家订阅本专栏,本专栏每周更新3-5篇最新机制,更有包含我所有改进的文件和交流群提供给大家。

Snu77的博客 6091

软件开发之命名规范

匈牙利命名法: 其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。关键是:标识符的名字以一个或者多个小写字母开头作为前缀。 属性部分: g_ 全局变量 c_   常量 m_ c++类成员变量 s_   静态变量 类型部分: 数组 a 指针 p 函数  fn 无效  v 句柄  ...

weixin_30709929的博客 110

从 QQ 聊天到 AI Agent:AstrBot + NapCat 接入 DeepSeek

<think>我们根据要求,根据提供的内容生成≤150字的文章摘要。内容是关于在Windows上使用Docker部署AstrBot+NaPCat,配置DeepSeek,实现QQ AI机器人。摘要需简洁概括主要步骤和结论。注意字数。</think>在Windows 11上通过Docker一键部署AstrBot与NapCat,实现QQ机器人。NapCat扫码登录QQ,AstrBot接入并配置DeepSeek API,完成AI对话。后续可扩展人格、插件及MCP工具,并通过cpolar提供公网管理入口,打造可扩展的

天道酬勤 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java基础篇之命名规范

其实命名规范不应该算在开发基础中,而是应该作为开发人员的职业素养来持续养成规范化的编程习惯。在Java开发中,命名规范是Java编程中的重要部分,良好的命名习惯能显著提高代码质量、代码的可读性以及可维护性。规范化命名的核心价值点体现在:1、:规范的命名使变量、方法、类等元素的用途一目了然。例如,使用calculateStudentGrades()命名,就会比calc()更能清晰表达方法体现的作用,可以减少团队成员的认知负担。2、

ILoveYou_Xuxu的博客 1091

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: c++高级---C++类中的常量以及cosnt指针的理解
下一篇: 家用路由器-- LAN与WAN通信的过程以及IP转换
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值