B-树

6.7 B-树★4◎3

  1.B-树的定义
  B-树是一种平衡的多路查找树,它在文件系统中很有用。
  定义:一棵m阶的B-树,或者为空树,或为满足下列特性的m叉树:
  (1)树中每个结点至多有m棵子树。
  (2)若根结点不是叶子结点,则至少有两棵子树。
  (3)除根结点之外的所有非终端结点至少有 棵子树。
  (4)所有的非终端结点中包含以下信息数据:其中:为关键码,且为指向子树根结点的指针(i=0,1,…,n),且指针所指子树中所有结点的关键码均小于所指子树中所有结点的关键码均大于为关键码的个数。

  (5)所有的叶子结点都出现在同一层次上,并且不带信息(可以看做是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。
  如图6-8所示为一棵5阶的B-树,其深度为4。

 

  2.B-树的查找
  B-树的查找类似于二叉排序树的查找,所不同的是,B-树每个结点是多关键码的有序表。在到达某个结点时,先在有序表中查找,若找到,则查找成功;否则,到按照对应的指针信息指向的子树中去查找,当到达叶子结点时,则说明树中没有对应的关键码,查找失败,即在B-树上的查找过程是一个顺指针查找结点和在结点中查找关键码交叉进行的过程。比如,在图6-8中查找关键码为93的元素。首先,从t指向的根结点(a)开始,结点(a)中只有一个关键码,且93大于它,因此,按(a)结点指针域A1到结点(c)去查找,结点(c)有两个关键码,而93也都大于它们,应按(c)结点指针域A2到结点(i)去查找,在结点(i)中顺序比较关键码,找到关键码93(K3)。
  【查找分析】
  B-树的查找是由两个基本操作交叉进行的过程,即:
  (1)在B-树上找结点。
  (2)在结点中找关键码。
  由于通常B-树是存储在外存上的,操作(1)就是通过指针在磁盘相对定位的,将结点信息读入内存之后,再对结点中的关键码有序表进行顺序查找或折半查找。因为在磁盘上读取结点信息比在内存中进行关键码查找耗时多,所以,在磁盘上读取结点信息的次数,即B-树的层次树是决定B-树查找效率的首要因素。
  那么,对含有n个关键码的m阶B-树,最坏情况下达到多深呢?我们可按二叉平衡树进行类似分析。首先,讨论m阶B-树各层上的最少结点数。
  由B-树定义:第一层至少有1个结点;第二层至少有2个结点;由于除根结点外的每个非终端结点至少有棵子树,则第3层至少有个结点;……依此类推,第k+1层至少有个结点。而k+1层的结点为叶子结点。若m阶B-树有n个关键码,则叶子结点即查找不成功的结点为n+1,由此有:

  即

 

  这就是说,在含有n个关键码的B-树上进行查找时,从根结点到关键码所在结点的路径上涉及的结点数不超过

 

  3.B-树的插入和删除
  (1)B-树的插入
  在B-树上插入关键码,即在最底层的某个非终端结点中添加一个关键码。若该结点上关键码个数不超过m-1个,则可直接插入到该结点上;否则,该结点上关键码个数至少达到m个,因而使该结点的子树超过了m棵,这与B-树定义不符。所以要进行调整,即结点的“分裂”。方法为:关键码加入结点后,将结点中的关键码分成3部分,使得前后两部分关键码个数均大于等于而中间部分只有一个结点。前后两部分成为两个结点,中间的一个结点将其插入到父结点中。若插入父结点而使父结点中关键码个数超过m-1,则父结点继续分裂,直到插入某个父结点其关键码个数小于m。可见,B-树是从底向上生长的。
  对关键码序列{20,54,69,84,71,30,78,25,93,41,7,76,51,66,68,53,3,79,35,12,15,6},建立5阶B-树的过程如图6-9所示。
  ①向空树中插入20,得图6-9(a)。
  ②插入54,69,84,得图6-9(b)。
  ③插入71,索引项达到5,要分裂成三部分:{20,54},{69}和{71,84},并将69上升到该结点的父结点中,得图6-9(c)。
  ④插入30,78,25,93,得图6-9(d)。
  ⑤插入41,又分裂得图6-9(e)。
  ⑥7直接插入。
  ⑦76插入,分裂得图6-9(f)。
  ⑧51,66直接插入,当插入68,需分裂,得图6-9(g)。
  ⑨53,3,79,35直接插入,12插入时,需分裂,但中间关键码12插入父结点时,又需要分裂,则54上升为新根。15,65直接插入得图6-9(h)。

 

  (2)B-树的删除
  B-树的删除操作分两种情况:
  【删除最底层结点中的关键码】
  ① 若结点中关键码个数大于(m/2)-1,直接删去。
  ② 否则,若与该结点相邻的右(或左)兄弟结点中的关键码个数大于(m/2)-1,则将其兄弟结点中最小(或最大)的关键码上移到双亲结点,而将双亲结点中与小于(或大于)且紧靠该上移关键码的关键字下移到被删关键码的结点中。以图6-9(h)为例,删除结点中的76后得图6-10。

 

  ③ 若被删关键码结点及其相邻的兄弟结点的关键码个数都等于(m/2)-1,假设该结点有右(或左)兄弟,且其地址由父结点中的Ai所指,则删除关键码后,余项与父结点中的Ki一起合并到Ai所指的结点中。此时如果父结点的关键码小于(m/2)-1,则转②处理。如删去图6-9(h)中的7,得图6-11。

 

  【删除为非底层结点中的关键码】
  若所删除关键码非底层结点中的Ki,则可以用指针Ai所指子树中的最小关键码X替代Ki,然后,再删除关键码X,直到这个X在最底层结点上,即转为(1)的情形。

B-树

转载于:https://www.cnblogs.com/guxuanqing/p/10582521.html

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

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

相关文章

mysql数据库交叉连接,MySQL数据库联合查询与连接查询

联合查询基本概念联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合在一起,使用为此为UNINO或UNION ALL联合查询:将多个查询的结果合并到一起(纵向合并):字段数不变&#xf…

原创:MD5 32位加密软件

网站后台数据库切勿使用明文保存密码,否则一旦黑客拿下你的Webshell,后果不堪设想。网站后台密码加密大多数采用的就是MD5算法加密。今天给大家送一个本人用c#简单编写的MD5 32位加密程序,虽然没有什么技术含量,但保证没有后门。 …

(教学思路 c#之类一)声明类和对象、定义类成员及其引用

上一节(教学思路 c#之面向对象二)初步理解面向对象的基本概念中,我没有提到任何的代码,只是用语言和实例来说明什么是类和对象以及面向对象的特性等基本概念,类是c#程序语言的重要核心,也是构建应用程序最主…

【springboot】之自动配置原理

使用springboot开发web应用是很方便,只需要引入相对应的GAV就可以使用对应的功能,springboot默认会帮我们配置好一些常用配置。那么springboot是怎么做到的呢?这篇文章将一步步跟踪源码,查看springboot到底是如何帮我们做自动化配置。 sprin…

阴雨连绵潮湿加剧 车辆防潮提升保值

近日来,申城阴雨绵绵,不但增加了行车的难度,也使爱车潮气严重,开上一会就会发现前车窗布满水汽,需要开空调吹干才能保证良好视野。此外潮气也容易对人体和车辆本身造成影响,首当其冲的是车内电器&#xff0…

php nsdata,iOS开发之数据存储之NSData

1、概述使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象。NSData可以为一些数据提供临时存储空间,以便随后写入文件,或者存…

asp.net控件开发基础(19)

上两篇讨论了基本数据绑定控件的实现步骤,基本上我们按着步骤来就可以做出简单的数据绑定控件了。过年前在看DataGrid的实现,本来想写这个的,但2.0出了GridView了,再说表格控件实现比较复杂,所以先放着。我们一起打开M…

1048 Find Coins

水题&#xff0c;详见代码&#xff5e; #include <iostream> #include <string.h> #include <cstdio> #include <algorithm> #include <cstdlib> #include <math.h> #include <queue> #include <stack> #include <vector&g…

php组件是啥,浅谈PHP组件、框架以及Composer

本篇文章主要介绍了PHP组件、框架以及Composer&#xff0c;具有一定的学习价值&#xff0c;感兴趣的朋友可以了解一下。什么是组件组件是一组打包的代码&#xff0c;是一系列相关的类、接口和Trait&#xff0c;用于帮助我们解决PHP应用中某个具体问题。例如&#xff0c;你的PHP…

{转}maven+continuum安装与配置

为什么80%的码农都做不了架构师&#xff1f;>>> 一、下载 1. maven: 项目管理工具&#xff0c;可以进行项目的编译、测试、布置、发布等 下载路径&#xff1a;http://apache.etoak.com/maven/binaries/apache-maven-2.2.1-bin.zip 2. continuum: 基本实现的功能&…

.net Excel导出出现乱码及excel打开出现错误提示

测试人员测试发现。导出excel出现乱码以及出现文件可正常导出、后几次导出却异常。 使用的系统浏览器&#xff1a; 其他360浏览器、谷歌浏览器均正常。 出现情况如下&#xff1a; 查资料发现&#xff0c;之前导出代码编写的 Response.AppendHeader("Content-Disposition&q…

rsync推拉模型及结合inotify实现推模型自动同步

一、前言 无论使用什么操作系统下&#xff0c;都经常有同步文件的需求&#xff0c;不管发生在本地&#xff0c;还是发生在本地和远程主机之间。那么应该怎么做呢&#xff1f; 使用拷贝类的命令&#xff0c;本地使用cp命令&#xff0c;复制到远程主机使用scp这样的命令&#xff…

oracle to pgsql,PostgresToOracle

PostgresToOracle官方版是一款十分专业和实用的PostgreSQL数据库迁移到Oracle工具&#xff0c;PostgresToOracle官方版功能出色&#xff0c;操作便捷&#xff0c;能够轻松快捷的帮助大家将PostgreSQL数据导入到oracle数据中&#xff0c;导入之后可以进行数据编辑&#xff0c;此…

Struts2中的OGNL详解

2019独角兽企业重金招聘Python工程师标准>>> 首先了解下OGNL的概念&#xff1a; OGNL是Object-Graph Navigation Language的缩写&#xff0c;全称为对象图导航语言&#xff0c;是一种功能强大的表达式语言&#xff0c;它通过简单一致的语法&#xff0c;可以任意存取…

C# 之 HttpResponse 类

Response 对象&#xff0c;派生自HttpResponse 类&#xff0c;该类封装来自 ASP.NET 操作的 HTTP 响应信息。存在于System.Web命名空间下。 注&#xff1a;MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型就是设定某种扩展名的文件用一种应用程序来打开的…

11个实用的CSS学习工具

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 盒子模型的幻灯片 通过3D转换效果产生的互动的幻灯片。按向左或向右箭头键切换&#xff0c;全屏观看会有更好的效果。 2. CSS Diner 通过一个简单的小游戏让你学习CSS selector&#xff0c;输入正确的selector来完…

Google 节日徽标全集 (1999-2009) (下)

这是 Google 节日徽标全集的第三部分&#xff0c;也是最后一部分&#xff0c;包含 Google 2006 至 2009 年 2 月全部节日徽标。需要指出的是&#xff0c;这些徽标均来自 Google 国际站点&#xff0c;也就是 www.google.com&#xff0c;Google 在众多本地站点上还有大量本土化的…

HBuilder:最快的Web开发IDE

HBuilder&#xff1a;最快的Web开发IDE http://www.csdn.net/article/2014-02-07/2818326-HBuilder-the-fastest-web-ide发表于2014-02-11 10:38| 26194次阅读| 来源CSDN| 59 条评论| 作者CSDN移动前端开发HBuilder数字天堂王安Web开发HTML5DCloud摘要&#xff1a;HBuilder是DC…

Pycharm 项目无法导入自己写的模块(问题记录贴)

问题&#xff1a; 从外部导入一个Python项目后&#xff0c;发现包错误&#xff0c;如图&#xff1a; 解决步骤&#xff1a; 1.将目录下的"5-6——apriori.py"复制一份&#xff0c;重命名为”apriori.py"&#xff1b; 2.查资料知&#xff0c;pycharm不会将当前文…

Win2000/XP/2003路由制作之Nat共享上网

Win2000/XP/2003&#xff08;必须SERVER&#xff08;服务&#xff09;版本的&#xff09;ROUTEROS不会或则你的路由器突然坏了。紧急情况下&#xff0c;为了让老板的网吧正常营业&#xff0c;随手找个电脑就可以正常工作了。好吧。言归正传。NAT服务器软硬件准备俗话说“巧妇难…