一、什么是B树?

B树是一棵是具备以下特点的有根树

1、节点属性

a)x.n:为节点中存储的关键字个数

b)x.key:为节点中存储的关键字。x.key1、x.key2 ... x.keyx.n 非降序顺序排列,满足 x.key<= x.key2 ... <= x.keyx.n。

c)x.leaf:为当前节点是否为叶子节点(true | false)

d)x.c:为指向子节点的指针,内部节点包含指针个数为 x.n + 1,叶子节点没有子节点,所以没有此属性。

2、分割

关键字 x.key 对存储在子树中的关键字进行分割。某个子节点的所有关键字值范围总是在节点 x 的某两个关键字之间。这个值可能是任何可排序的表示,比如:

3、深度

每个叶子节点具有相同的深度,即树的高度(由根节点到叶子节点的路径长度)。

4、度数

每个节点包含的关键字个数有上下界限制。基本表示单位为B树的最小度数 t(满足 t >= 2):

a)除了根节点外(空树没有关键字,非空树根节点至少包含一个关键字),每个节点至少有 t - 1 个关键字,进而可以推导,每个内部节点至少有 t 个子节点【1.d】。

b)每个节点至多包含 2t - 1 个关键字(此时称之为【满】 状态),进而可以推导,每个内部节点至多有 2t 个子节点【1.d】。

二、B数的高度

首先树的根节点至少包含 1 个关键字,其它节点至少包含 t - 1 个关键字,至少有 t 个子节点【一.4.a】。

我们知道 B 树的度数 t >= 2,所以:

深度为 1 的位置上至少有 2 个节点。

深度为 2 的位置至少有 2 * t 个 节点。

深度为 3 的位置至少有 2 * t * t 个 节点。

... ...

深度为 h 的位置至少有 2 * t * ... * t 个 节点。

图示:

【1】所以所有非根节点个数至少为:2 + 2 * t +  2 * t * t  + 2 * t * ... * t = 2 * t0 + 2 * t1+  2 * t2  + 2 * th-1,标识为 sum(node)

【2】相应的非根节点关键字个数至少为:(t - 1) * sum(node)

【3】那么总的关键字个数至少为: 1 + (t - 1) * sum(node)

【4】我们用 n 表示关键字个数,所以存在  n >= 1 + (t - 1) * sum(node),代入【1】中的求和,最终经过一系列的变换,可以得出B树的高度满足:h <= logt(n+1)/2

三、B树的搜索

假定我们要查找的关键字为 k,入口节点 x:

a)需要找到 k 在 x 所有关键字中的位置,临界关键字 keyi 满足 k <= keyi

b)如果存在 k == keyi 那么查找结束,否则继续。

c)如果 x 为叶子节点,则查找结束,否则继续

d)由 keyi 临界关键字,我们可以得到相应指向子节点的指针 ci

然后,继续由 ci 指向的子节点作为入口节点,继续上述过程。

四、B树的插入

B树插入新关键字后,必须仍然是一颗合法的B树。

由【一.4.b】我们直到 B 树节点存在一种状态【满】,即当前节点关键字个数为 2t -1。【满】状态的节点插入新节点必须经过特定的前置处理:分裂

所谓分裂,即将节点由中间关键字作为分割点,分割为两个节点,每个节点包含 t - 1 个关键字,中间节点 x.kt 则上升到父节点中,作为两棵子树的划分点,参见【一.2】。

此处需要注意的是,如果父节点同样为【满】节点,那么在分割点上升之前,同样需要对父节点执行【分裂】操作。

满节点的分裂行为会沿着树向上传播直到不再需要分裂为止

上面我们描述的过程,是一个自下而上的【满】状态分裂传播行为。

我们知道,要实现节点的插入,首先需要经过一个B树的搜索查找的过程,搜索过程自上而下

显然,两个过程,有些重复,我们需要的是单向查找插入。

鉴于此,在执行查找的过程中,遇到路径上的满节点,则执行分裂操作,直到找到位置插入节点,这样就避免了自下而上的【分裂】传播行为。

五、B树的删除

B树删除特定关键字后,必须仍然是一颗合法的B树。

B树的插入是一个对节点最大关键字数量的约束满足过程,相应的,B树的删除是一个对节点最小关键字数量的约束满足过程

保障沿途节点关键字数量至少为度数 t,一遍自根而下执行删除。

你好,我是B树的更多相关文章

  1. poj 1195:Mobile phones(二维线段树,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14391   Accepted: 6685 De ...

  2. SGU 531. Bonnie and Clyde 线段树

    531. Bonnie and Clyde 题目连接: http://acm.sgu.ru/problem.php?contest=0&problem=531 Description Bonn ...

  3. hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值

    Conturbatio Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...

  4. 【ACM/ICPC2013】线段树题目集合(一)

    前言:前一段时间在网上找了一个线段树题目列表,我顺着做了一些,今天我把做过的整理一下.感觉自己对线段树了解的还不是很深,自己的算法能力还要加强.光练代码能力还是不够的,要多思考.向队友学习,向大牛学习 ...

  5. HDU3727--Jewel (主席树 静态区间第k大)

    Jewel Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. HDU 2689 Sort it【树状数组】

    Sort it Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. 【BZOJ】1699: [Usaco2007 Jan]Balanced Lineup排队(rmq/树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1699 我是用树状数组做的..rmq的st的话我就不敲了.. #include <cstdio& ...

  8. 【LeetCode】线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)

    第一部分---线段树:https://leetcode.com/tag/segment-tree/ [218]The Skyline Problem [307]Range Sum Query - Mu ...

  9. css基本选择器

    CSS:层叠样式表 (Cascading Style Sheets) 结构层:HTML表现层: CSS行为层: DOM,JavaScript CSS语法结构:div{background:#f00;} ...

随机推荐

  1. THINKPHP_(5)_THINKPHP6接收ajax下拉菜单提交的数据,存在的bug

    反思: 国产总是不尽人意,但是要支持国产. ThinkPHP的6接收ajax的post数据,存在一个bug.即ajax传递的json数据,在thinkphp后端解析出来后,并非直接的json格式. 描 ...

  2. OneFlow 并行特色

    OneFlow 并行特色 在 Consistent 与 Mirrored 视角中,已经知道 OneFlow 提供了 mirrored 与 consistent 两种看待分布式系统的视角,并且提前知道了 ...

  3. 主成分分析法(PCA)原理和步骤

    主成分分析法(PCA)原理和步骤 主成分分析(Principal Component Analysis,PCA)是一种多变量统计方法,它是最常用的降维方法之一,通过正交变换将一组可能存在相关性的变量数 ...

  4. 3D点云完美匹配

    3D点云完美匹配 The Perfect Match: 3D Point Cloud Matching with Smoothed Densities 地址链接: http://openaccess. ...

  5. cuSPARSELt开发NVIDIA Ampere结构化稀疏性

    cuSPARSELt开发NVIDIA Ampere结构化稀疏性 深度神经网络在各种领域(例如计算机视觉,语音识别和自然语言处理)中均具有出色的性能.处理这些神经网络所需的计算能力正在迅速提高,因此有效 ...

  6. 用NVIDIA Tensor Cores和TensorFlow 2加速医学图像分割

    用NVIDIA Tensor Cores和TensorFlow 2加速医学图像分割 Accelerating Medical Image Segmentation with NVIDIA Tensor ...

  7. 如何运行具有奇点的NGC深度学习容器

    如何运行具有奇点的NGC深度学习容器 How to Run NGC Deep Learning Containers with Singularity 高性能计算机和人工智能的融合使新的科学突破成为可 ...

  8. Java 将PPT幻灯片转为HTML

    本文以Java程序代码为例展示如何通过格式转换的方式将PPT幻灯片文档转为HTML文件.这里的PPT幻灯片可以是.ppt/.pptx/.pps/.ppsx/.potx等格式. 代码实现思路:[加载PP ...

  9. python django框架+vue.js前后端分离

    本文用于学习django+vue.js实现web前后端分离协作开发.以一个添加和删除数据库书籍应用为实例. django框架官方地址:https://www.djangoproject.com/ vu ...

  10. spring boot 加载web容器tomcat流程源码分析

    spring boot 加载web容器tomcat流程源码分析 我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> <groupId>o ...