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,一经查实,立即删除!

相关文章

dom4j和jaxp解析工具的

dom4j解析中的几个对象node --branch --document --element --commment --attribute --text branch --document --element jaxp解析中的几个对象 node --document --element --commment --attr --text dom4j解析 中全部对象都是node对象的子节点,也就是说它把说有…

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

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

C#-委托和事件

要为类构造一个事件,必须用 event 来声明一个 delegate 型的字段,如: puclic calss Test{ public delegate EventHandler(object sender, EventArgs e); //声明为delegate 型的事件; } 然后要指定一个事件的名称,并写出处…

性能测试四十五:性能测试策略

1、项目具体需求,及业务场景:关注真实用户会是怎样的一个业务场景,确定用户的用户习惯。 2、指标:响应时间在多少以内,并发数多少,tps多少,总tps多少,稳定性交易总量多少,事务成功率…

原创:MD5 32位加密软件

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

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

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

matlab数值过小为0,MATLAB数值计算——0

MATLAB数值计算MATLAB中文论坛基础板块常见问题归纳(出处: MATLAB中文论坛)登录http:www.mathworks.com/moler 获取NCM文件,注册账户,下载Toolbox格式,点击安装——在MATLAB中输入ncmgui出现图案即为success!(pathtool添加默认路径…

【springboot】之自动配置原理

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

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

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

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

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

php:兄弟连之面向对象版图形计算器1

曾经看细说PHP的时候就想做这个&#xff0c;可是一直没什么时间&#xff0c;这次总算忙里偷闲搞了代码量比較多的project。 首先&#xff0c;文档结构&#xff0c;都在一个文件夹下就好了&#xff0c;我的就例如以下。 一開始&#xff0c;进入index.php文件。 <html><…

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

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

Mapreduce的序列化和流量统计程序开发

一、Hadoop数据序列化的数据类型 Java数据类型 > Hadoop数据类型 int         IntWritable float        FloatWritable long        LongWritable double       DoubleWritable String       Text boolean      BooleanWr…

matlab标准化出现负值,为什么我求出来的约束条件是负值

本帖最后由 renwoxinfen 于 2016-11-8 09:01 编辑程序如下&#xff1a;a.m% 设计变量(螺杆平均直径D和长度L)的初始值x0[30;5000];% 设计变量(螺杆平均直径D长度L)的下界与上界Lb[30;5000];Ub[200;6000];% 调用多维约束优化函数% 线性不等式约束放入约束函数文件&#xff0c;参…

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…

P2P之UDP穿透NAT的原理与实现(转)

论坛上经常有对P2P原理的讨论&#xff0c;但是讨论归讨论&#xff0c;很少有实质的东西产生&#xff08;源代码&#xff09;。呵呵&#xff0c;在这里我就用自己实现的一个源代码来说明UDP穿越NAT的原理。 首先先介绍一些基本概念&#xff1a; NAT(Network Address Transla…

基于MATLAB的turbo码代码,一种基于Simulink的Turbo码仿真实现

一种基于Simulink的Turbo码仿真实现Implementation of Turbo Code Simulation Based on SimulinkDOI: 10.12677/HJWC.2014.43010,PDF, ,下载:2,684 浏览:6,349作者:王 丁&#xff1a;杭州电子科技大学&#xff0c;杭州摘要:介绍了Turbo码的编解码原理&#xff0c;并且提出了一…

数组各元素出现的次数

var str "abcabcaaaaa";var map {};  for(var i 0;i<str.length;i){    var s str[i];    var r map[s];    if(r){      map[s] 1;      }else{        map[s] 1;      }    }console.log(JSON.stringify(map)…

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: 基本实现的功能&…