B树、B+树

B树(也叫B-树)、B+树、B*树 0. 简介 在此声明,B-Tree最正确的翻译应该为B树,而不是B-树,也即并没有B-树的说法,二叉树叫Binary Tree,二叉搜索树叫Binary Search Tree(BST)B树叫Balance Tree,简写为B-Tree (注意是这两个单词连起来的意思,不是减号),B+树是B+ Tree。 1. BST(Binary Search Tree,即二叉搜索树,并不是B树) ... 阅读详情

B树、B+树


一、B树

B树类似于红黑树,但它在降低磁盘I/O操作数方面要更好一些。许多数据库操作系统使用B树或者B树的变种来存储信息。

B树与红黑树不同之处在于B树的结点可以有很多孩子。所以,可以使用B树在时间O(lgn)内完成一些动态集合的操作。

若B树的一个内部结点x包含x.n个关键字,那么结点x就有x.n+1个孩子。结点x中的关键字就是分隔点。

这里写图片描述

1. B树的定义

一棵B树T是具有以下性质的有根树(根为T.root):

  • 每个结点x有下面属性:
    • x.n,当前存储在结点x中的关键字个数;
    • x.n个关键字本身x.key1,x.key2,⋯,x.keyx.n,以非降序存放,使得x.key1⩽x.key2⩽⋯⩽x.keyx.n;
    • x.leaf,一个布尔值,如果x是叶结点,则为TRUE;如果x为内部结点,则为FALSE。
  • 每个内部结点x还包括x.n+1个指向其孩子的指针x.c1,x.c2,⋯,x.cn+1,叶结点没有孩子,所以它们的ci属性没有定义;
  • 关键字x.keyi对存储在各子树中的关键字范围加以分割:如果ki为任意一个存储在以x.ci为根的子树中的关键字,那么
    k1⩽x.key1⩽k2⩽x.key2⩽⋯⩽x.keyx.n⩽kx.n+1
  • 每个叶结点具有相同的深度,即树的高度h;
  • 每个结点所包含的关键字个数有上界和下界。用一个被称为B树的最小度数 的固定整数t⩾2来表示这些界:
    • 除了根结点以外的每个结点必须至少有t−1个关键字。因此,除了根结点以外的每个内部结点至少有t个孩子。如果树非空,跟结点至少有一个关键字;
    • 每个结点至多可包含2t-1个关键字。因此一个内部结点至多可有2t个孩子。当一个结点恰好有2t-1个关键字时,称该结点是满的。

B树的高度

如果n⩾1,那么对于任意一棵包含n个关键字、高度为h、最小度数t⩾2的B树T,有:

h⩽logtn+12

这里写图片描述

与红黑树对比,尽管二者的高度都以O(lgn)的速度增长,但是对于B树来说,对数的底数可以大很多倍。因此,对大多数树的操作来说,要检查的结点数在B树中要比在红黑树中少大约lgt 的银子。

2. B树上的基本操作

搜索B树

输入为一个指向某子树根结点x的指针,以及要在该子树中搜索的一个关键字k。

B_Tree_search(x, k)
    i = 1
    while i<=x.n and k>x.key_{i}
        i = i + 1
    if i <= x.n and k == x.key_{i}
        return (x, i)
    elseif x.leaf
        return NIL
    else Disk_read(x, c_{i})
        return B_Tree_search(x.c_{i}, k)

搜索图例:

这里写图片描述

由B_tree_search过程访问的磁盘页面数为O(h)=O(logtn),其中h为B树的高,n为B树中所含关键字个数。由于x.n<2t,所以程序中,while循环在每个结点中话费的时间为O(t),总的CPU时间为O(th)=O(tlogtn)。

创建一颗空的B树

B_Tree_create(T)
    x = allocte_node()
    x.leaf = TRUE
    x.n = 0
    Disk_write(x)
    T.root = x

B_tree_create需要O(1)次的磁盘操作和O(1)的CPU时间。

向B树中插入一个关键字

将新的关键字插入一个已经存在的叶结点上,由于不能将关键字插入一个满的叶结点,故引入一个操作,将一个满的结点y (有2t-1个关键字)按其中间关键字y.keyt分裂为两个各含t−1个关键字的结点。中间关键字被提升到y的父节点,以标识两棵新树的划分点。但是如果y的父结点也是满的,就必须在插入新的关键字之前将其分裂,最终满结点的分裂会沿着树向上传播。

分裂B树中的结点

输入:非满的内部结点x,使x.ci为x的满子结点的下标i。

要分裂一个满的根,首先要让根成为一个新的空根结点的孩子,这样才能使用B_tree_split_child,树的高度因此增加1;分裂是树长高的唯一途径。

这里写图片描述

B_Tree_split_child(x, i)
    z = allocate_node()
    y = x.c_{i}
    z.leaf = y.leaf
    z.n = t - 1
    for j = 1 to t-1
        z.key_{j} = y.key_{j+1}
    if not y.leaf
        for j = 1 to t
            z.c_{j} = y.c_{j+t}
    y.n = t - 1
    for j = x.n+1 downto i+1
        x.c_{j+1} = x.c_{j}
    x.c_{i+1} = z
    for j = x.n downto i
        x.key_{i+1} = x.key_{i}
    x.key_{i} = y.key_{t}
    x.n = x.n + 1
    Disk_write(y)
    Disk_write(z)
    Disk_write(x)

以沿树单程下行方式向B树插入关键字

需要O(h)次磁盘存取;
需要O(tlogtn)的CPU时间。

B_Tree_insert(T, k)
    r = T.root
    if r.n == 2t-1
        s = allocate_node()
        T.root = s
        s.leaf = FALSE
        s.n = 0
        s.c_{1} = r
        B_Tree_split_child(s, 1)
        B_Tree_insert_nonfull(s, k)
    else B_Tree_insert_nonfull(r, k)

这里写图片描述

辅助函数B_Tree_insert_nonfull将关键字插入结点x,要求假定在调用该过程时x是非满的。

B_Tree_insert_nonfull(x, k)
    i = x.n
    if x.leaf
        while i>=1 and k < x.key_{i}
            x.key_{i+1} = x.key_{i}
            i = i - 1
        x.key_{i+1} = k
        x.n = x.n + 1
        Disk_write(x)
    else while i >= 1 and k < x.key_{i}
            i = i - 1
        i = i + 1
        Disk_read(x.c_{i})
        if x.c_{i}.n == 2t-1
            B_Tree_split_child(x, i)
            if k > x.key_{i}
                i = i + 1
        B_Tree_insert_nonfull(x.c_{i}, k)

这里写图片描述

3. 从B删除关键字

删除关键字的各种情况:
这里写图片描述
这里写图片描述

这里写图片描述

这里写图片描述

尽管在B树中的删除操作看起来很复杂,但是对一棵高度为h的树,它只需要O(h)次磁盘造作,因为在递归调用该过程之间,仅需O(1)次对Disk_read和Disk_weite的调用,所需要的CPU时间为O(th)=O(tlogtn).

算法——B树,B-树,B+树,B*树全面解析笔记 算法——B树,B-树,B+树,B*树全面解析笔记 https://zhuanlan.zhihu.com/p/54102723 https://www.cnblogs.com/lianzhilei/p/11250589.html B树 = B-树 B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是一种树。而事实上是,B-tree就是指的B树,目前理解B的意思为平衡 B树的出现 阅读详情

相关推荐

手把手教你用ET-BERT预训练模型搞定加密流量分类(附完整代码)

本文详细介绍了如何使用ET-BERT预训练模型实现加密流量分类,包括环境配置、数据预处理、模型微调及优化策略。通过实战代码示例,帮助开发者快速掌握这一技术,提升网络安全领域的加密流量分析能力。

weixin_29166013的博客 493

数据结构——B+树

B+树

weixin_52821814的博客 3万+

从SolidWorks到Simulink:手把手教你用URDF文件搭建六轴机械臂仿真模型(含STL文件配置避坑)

本文详细介绍了从SolidWorks到Simulink的六轴机械臂URDF仿真全流程,包括URDF文件导出、Simscape模型生成与调试、动力学参数获取与验证等关键步骤。重点解决了STL文件配置、关节接口设置等工程化难题,帮助开发者高效构建可控制的数字孪生体。通过实战案例和优化技巧,提升机械臂仿真效率与准确性。

weixin_26812607的博客 265

算法导论---B树

B树 这是为磁盘存储而专门设计的一类平衡搜索树。由于磁盘访问相对访存极慢,因此度量B树的性能,考虑 a. 动态集合操作消耗的计算时间 b. 执行了多少次的磁盘存取。 对每个B树操作,磁盘存取的次数随着B树的高度增加。 B-tree定义 第1. 每个节点x有: a. x.n保存节点x的关键字个数。 b. x.n个关键字不严格...

玩着玩着就完了的博客 390

YOLOv10改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 103

【MATLAB-app】系列教程(含视频)第4、5、6课:实战_制作简单的图像处理软件

写作时间: 2020-12-27 我的教程目录 第1课:初步了解appdesigner 第2课:学会制作一个计算器 第3课:学习更多的控件(重点!) 第4课:实例1:制作一个图像处理软件 第5课:学习APPdesigner的设计精髓,框架 第6课:结合使用多种控件,函数等,丰富我们的实例1 第7课:app设计打包,完成工程应用导出 标题: 第4课:我的实例_学会制作一个图像处理软件 本文目录: 1.先看看我之前的一个工程 2.常用的基本组件控件 3.最常用且实用的控件的用法 -3.1 editfilel

wind 4054

B树(B-树)最大最小高度的推导

B树(B-树)最大最小高度的推导

weixin_46127065的博客 2708

数据分析必问:Pandas面试题及参考答案

DataFrame是Pandas库中的一个核心数据结构,它类似于Excel中的表格,可以存储不同类型的数据。在Pandas中,抽样操作通常很简单,但是需要根据数据的特点和分析的需求来选择合适的抽样方法。数据标准化和归一化是数据预处理中常用的技术,目的是将数据调整到一个合适的范围内,以消除不同特征量纲和数值范围的差异,从而保证模型训练的有效性。CSV文件是一种文本文件,其中的数据以逗号分隔。不平衡数据集指的是数据集中各类别样本的数量差异较大的情况,这可能导致模型训练出现偏差,影响模型的泛化能力。

大模型大数据攻城狮的专栏 3008

B树最大高度推导

文章目录B树最大高度推导推导B树的最小高度推导最大高度B+树:MySQL数据库索引是如何实现的?1. 遇到问题2. 尝试用学过的数据结构解决这个问题3. 改造二叉查找树4. 索引的弊端 B树最大高度推导 【声明几个重要概念】 B树的关键字就是要查找的东西 B树中的 阶:可理解为分支数. 三阶树也可理解三叉树 按照定义: m阶B tree,每个节点最多有 m 个subnode,除根节点和叶子节点外,...

Guo_ping'blog 1万+

Unity插件NodeCanvas之行为树的详细教程

NodeCanvas 是一个用于 Unity 的可视化脚本工具,主要用于游戏开发中的行为树、状态机和流程图的设计。它通过节点编辑器的方式,让开发者可以更直观地创建和管理游戏逻辑,减少了传统编码的复杂性。今天我们就来详细介绍一下NodeCanvas插件。

TxNet 1958

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析7 8

本关任务:编写一个能查询预定的程序。输入餐馆名称,查询用户账号为当前登录用户且餐馆名称为当前输入餐馆名称的结点信息,并输出其预定时间。本关任务:编写一个能查看预定的程序。创建链队列,从文件order.txt中读取数据,依次进入链队列中。遍历链队列,筛选出用户账号为当前登录用户的结点信息,并依次输出相应的餐馆名称和预定时间。烤肉刘老北京炙子烤肉(四道口店) 11月20日晚餐 0。外婆家(清河华润五彩城店) 12月12日午餐 0。甜鸭梨烤鸭店(农大店) 12月5日晚餐 0。鼎坤朋湘菜馆 12月8日晚餐 0。

m0_62222486的博客 1344

推导B树的最大高度和最小高度得出B树的高度范围

前提条件:n>=1,则对于任意一棵包含n个关键字、高度为h、阶数为m的B树。 一、最小高度: 对于任意树类型的数据结构,如果其每层节点能够分布的足够满,其高度也会随之变得足够的低。基于这个思路,对于B树无外乎也是一种树,B树的关键子树以及儿子节点个数满足这样的条件(ceil代表向上取整): //根节点 儿子节点个数[2, m] 关键字个数[1, m-1] //非根节点 儿子节点个数[...

乐行僧的博客 1万+

6.10华为OD机试真题 新系统 - 查找温度记录统计信息 (Java/Py/C/C++/Js/Go)

6.10华为OD机试真题 新系统 - 查找温度记录统计信息 (Java/Py/C/C++/Js/Go)

算法大师! 436

B树、B-树、B+树、B*树 详细总结

B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关...

杰哥一号号的博客 5427

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

从B树、B+树、B*树谈到R 树

从B 树、B+ 树、B* 树谈到R 树   作者:July、weedge、Frankie。编程艺术室出品。 说明:本文从B树开始谈起,然后论述B+树、B*树,最后谈到R 树。其中B树、B+树及B*树部分由weedge完成,R 树部分由Frankie完成,全文最终由July统稿修订完成。 出处:http://blog.youkuaiyun.com/v_JULY_v 。   第一节、B树、B+树、B*...

结构之法 算法之道 66万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

B树,B-树和B+树、B*树的区别

之前一些概念混淆,现在更正一下。 B树 B-tree树即B树,B即Balanced,平衡的意思。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这种直译不好,容易产生误解。如人们可能会以为B-树是一种树,而B树又是一种树。事实上,B-tree就是指B树。特此说明。 先介绍一下二叉搜索树: 1.所有非叶子结点至多拥有两...

qq_22613757的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

B树,B-树和B+树的区别

B树       即二叉搜索树:       1.所有非叶子结点至多拥有两个儿子(Left和Right);       2.所有结点存储一个关键字;       3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;       如:              B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入...

chensi16114的博客 2万+

B树、B-树、B+树、B*树简介

B树 (二叉搜索树): 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结...

二十同学 7万+

B树、B-树、B+树、B*树都是什么

B树、B-树、B+树、B*树都是什么         今天看数据库,书中提到:由于索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片,这和磁盘碎片、内存碎片产生原理是类似的,这些存储碎片不仅占用了存储空间,而且降低了数据库运行的速度。如果发现索引中存在过多的存储碎片的话就要进行“碎片整理”了,最方便的“碎片整理”

史迪阳的博客 9739

B树、B+树、B*树

每个结点最多有m棵子树(子结点)根节点最少有一个子树,除根节点外,其他结点至少有[m/2]个子树所有叶节点都在同一层,按从小到大的顺序存放全部关键码,各个叶节点顺序连接有n个子树的结点有n个关键码所有非叶节点可以看成是叶节点的索引,节点中关键码Ki与指向子树的指针Pi构成对子树(即下一层索引块)的索引项(Ki,Pi),Ki是子树中最大的关键码B+ 树是 B 树的变体,也是一种多路搜索树。B*树是 B+ 树的变体,在 B+ 树的非根和非叶子节点再增加指向兄弟的指针B*树定义了非叶子节点。

2302_76977379的博客 1859

什么是B-树、B树、B+树、B*树?

文件系统的灵魂数据结构 B树什么是B-树、B树、B+树、B*树? 正如标题所言,本文介绍经常使我们混淆的B-树、B树、B+树和B*树。 首先,B-tree树即B树。B即Balanced平衡,因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,这是个非常不好的直译,很容易让人产生误解,人们可能会以为B-树和B树是两种树。 1、B树 1.1、B树产生的背景 不管是二叉树、二叉查找树还是平衡二叉树,它们都有诸多限制,比如: 每个结点只能存储一个元素。 ..

学无止境! 2468

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

B树 即二叉搜索树: 1. 所有非叶子结点至多拥有两个儿子(Left和Right); 2. 所有结点存储一个关键字; 3. 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子

idber的学习笔记 6998

B树、B-树、B+树

B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: image.png ...

ii偏闹i的博客 2017

B树(B-树 B_树)、B+树、B*树

B树 B-tree树即B树,B即Balanced,平衡的意思。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是另一种树。而事实上是,B-tree就是指的B树。特此说明。 先介绍下二叉搜索树 1.所有非叶子结点至多拥有两个儿子(Left和Right)...

艾斯-李的博客 3560

B树、B-树、B+树、B树都是什么

为什么80%的码农都做不了架构师?>>> ...

weixin_34087307的博客 1056

B树、B-树、B+树、B*树++ R tree总结

B树        即二叉搜索树:        1.所有非叶子结点至多拥有两个儿子(Left和Right);        2.所有结点存储一个关键字;        3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;        如:                B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询

把握自己。 2617
上一篇: 贪心算法
下一篇: 斐波那契堆
大树先生的博客
博客等级 码龄9年 2692粉丝 200原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值