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、所有叶子结点位于同一层。


B树的特点: 

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

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

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

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

5、自动层次控制。


二、B+树

B+树 B+树是B树的变体,也是一种多路搜索树,特点如下:

1、其定义基本与B-树同;

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

3、非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间); 

4、为所有叶子结点增加一个链指针;

5、所有关键字都在叶子结点出现。


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-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;


B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;


B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3。


参考资料:

1、七月算法--从B树、B+树、B*树谈到R 树 http://blog.csdn.net/v_july_v/article/details/6530142

2、B树、B+树、B*树 http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html

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

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

相关文章

微软正在开发基于Rust的安全编程语言

此前&#xff0c;微软表示正探索将 Rust 作为 C 和 C 的安全替代方案&#xff0c;并且也对外展示了使用 Rust 重写 Windows 组件的体验。根据微软的说法&#xff0c;Rust 是一种从根本上考虑安全性的编程语言&#xff0c;他们将尝试使用 Rust 重写各种产品&#xff0c;因为在过…

堆树(最大堆、最小堆)详解

一、堆树的定义 堆树的定义如下&#xff1a; &#xff08;1&#xff09;堆树是一颗完全二叉树&#xff1b; &#xff08;2&#xff09;堆树中某个节点的值总是不大于或不小于其孩子节点的值&#xff1b; &#xff08;3&#xff09;堆树中每个节点的子树都是堆树。 当父节点的键…

HttpClientFactory日志不好用,自己扩展一个?

前言.NetCore2.1新推出HttpClientFactory工厂类&#xff0c; 替代了早期的HttpClient&#xff0c;并新增了弹性Http调用机制 (集成Policy组件)。替换的初衷还是简单说下&#xff1a;① using(var client new HttpClient()) 调用Dispose()方法&#xff0c;并不会很快释放底层So…

树、二叉树简介

一、树的定义 树是由n&#xff08;n>1&#xff09;个有限节点组成一个具有层次关系的集合&#xff0c;它有如下特点&#xff1a; 1、每个节点有零个或多个子节点&#xff1b; 2、没有父节点的节点称为根节点&#xff1b; 3、每一个非根节点有且只有一个父节点&#xff1b; 4…

Quartz.net定时任务的使用及获取正在运行的JOB

定时任务管理类实现了如下功能&#xff1a;1、对定时任务进行管理 2、创建定时任务&#xff0c;需要给定时任务一个job的名称 3、判断给定的job的任务是否已存在 4、停止定时任务的功能namespace MyUKD.Quartz{ public class QuartzSchedulerMgr { private static readonly ILo…

漫谈认证与授权

漫谈认证与授权Intro认证与授权一直以来都是很多人在讨论的话题&#xff0c;之所以想这次谈一谈认证和授权&#xff0c;主要是因为最近看到许多文章都把认证和授权混为一谈&#xff0c;把认证方式当作是授权方式。所以想写篇文章谈谈我眼中的认证与授权。Authentication什么是认…

【译】gRPC vs HTTP APIs

本文翻译自 ASP.NET Blog | gRPC vs HTTP APIs&#xff0c;作者 James&#xff0c;译者 Edison Zhou。现在&#xff0c;ASP.NET Core使开发人员可以构建gRPC服务。gRPC是一个远程过程调用框架&#xff0c;专注于高性能和开发人员的生产力。ASP.NET Core 3.0中集成了gRPC&#x…

.NET Core 3.0 的新改进:针对分布式应用程序的故障诊断和监控

由于分布式应用是由多个组件组成的&#xff0c;且这些组件往往是由不同的团队拥有和操作&#xff0c;所以在与应用程序发生交互时&#xff0c;就会需要跨多个组件执行代码的分布式跟踪。如果用户遇到了问题&#xff0c;想要确定是哪个组件出现了差错&#xff0c;基本就是一件不…

【翻译】.NET Core3.1发布

.NET Core3.1发布我们很高兴宣布.NET Core 3.1的发布。实际上&#xff0c;这只是对我们两个多月前发布的.NET Core 3.0的一小部分修复和完善。最重要的是.NET Core 3.1是长期支持&#xff08;LTS&#xff09;版本&#xff0c;并且将支持三年。和过去一样&#xff0c;我们希望花…

JVM(1)——JVM内存分区

一、JVM简介 JVM&#xff0c;即Java虚拟机&#xff08;Java Virtual Machine&#xff09;&#xff0c;一种能够运行Java bytecode的虚拟机&#xff0c;是Java实现跨平台的基础。 引入Java语言虚拟机后&#xff0c;Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚…

使用Azure Pipelines从GitHub发布NuGet包

[本文目录]ps: 阅读本文大概需要20分钟欢迎大家点击上方公众号链接关注我&#xff0c;了解新西兰码农生活什么是 YAML?name/value 名称/值collections 集合multiple data types 复合数据类型comments 注释Pipelines 的 YAML 结构在 Azure DevOps Pipelines 中创建第一个任务为…

JVM(2)——JVM类加载机制

一、JVM类加载机制简介 虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是虚拟机的类加载机制。 在Java语言里面&#xff0c;类型的加载和连接过程都是在程序运…

PYPL 12月榜单发布,编程语言、IDE与数据库市场如何?

PYPL&#xff08;PopularitY of Programming Language&#xff0c;编程语言流行指数&#xff09;12 月份的榜单已经发布了。PYPL 是非常流行的参考指标&#xff0c;其榜单数据的排名均是根据榜单对象在 Google 上相关的搜索频率进行统计排名&#xff0c;原始数据来自 Google Tr…

JVM(3)——JVM类加载器

一、类加载器简介 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现&#xff0c;以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。 类加载器虽然只用于实现类的…

.NET Core应用框架AA介绍(二)

AA的开源地址https://github.com/ChengLab/AAFrameWork AA框架是一个基础应用框架&#xff0c;是建立在众多大家熟知的流行工具之上并与之集成。比如&#xff1a;ASP.NET Core、Automapper、Dapper、Dapper-FluentMap、RabbitMQ、Redis、MassTransit、Log4net等等大家可以很方便…

JVM(4)——对象访问

一、对象创建过程在Java语言中&#xff0c;对象是如何访问的呢&#xff1f;对象访问在Java语言中无处不在&#xff0c;是最普通的程序行为&#xff0c;但即使是最简单的访问&#xff0c;也会涉及Java虚拟机栈、Java堆区、方法区。 对于下面这行代码&#xff0c; Object obj ne…

鹅厂后台开发工程师的工作日常

写在前面 &#xff1a;本故事纯属虚构&#xff0c;如有雷同&#xff0c;不负责任。为了整理 Linux 开发和日常使用的常用命令&#xff0c;想了好几天才串了这么个故事。虽然有点牵强&#xff0c;但是内容还是挺干的~欢迎大家点评。在很久很久以前&#xff0c;鹅厂开发类工程师职…

.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏...

经过一段时间的努力&#xff0c;iNeuDA产品组件已经开发和测试完成&#xff0c;现在正式上线。现在iNeuOS工业互联网操作系统的技术体系和产品体系更佳完善&#xff0c;为中小企业提供更佳全面解决方案。如下图&#xff1a;iNeuDA 一站式大数据分析平台作为国内领先的新一代自助…

asp.net core 从 3.0 到 3.1

asp.net core 从 3.0 到 3.1Intro今天 .net core 3.1 正式发布了&#xff0c;.net core 3.1 正式版已发布&#xff0c;3.1 主要是对 3.0 的 bug 修复&#xff0c;以及一些小优化&#xff0c;而且作为 LTS 版本&#xff0c;建议大家升级。值得一提的是.net core 2.2 这个月就要寿…

身边的设计模式(三):抽象工厂 与 依赖注入

上篇文章&#xff0c;我们说到了简单工厂和工厂方法&#xff0c;如果没看过的&#xff0c;请先看上篇&#xff0c;不然的话&#xff0c;可能有些吃力&#xff0c;或者直接点击阅读原文&#xff0c;查看我博客园的对应详细版的文章。大家学到了这里&#xff0c;我建议自己可以练…