首页 > 其他分享 >数据结构之B树

数据结构之B树

时间:2023-06-06 10:56:59浏览次数:31  
标签:数据项 存储 叶子 插入 键值 数据结构 节点

1 引言

B-tree,B即Balanced,是自平衡的多叉搜索树,用于组织和存储大量数据,以及数据库和文件系统等需要高效查找和插入操作的应用中。

为什么是“大量数据”?当主存不足以放入大量数据时,不常用的数据应存储于外存,而访问外存有额外时间开销(如磁盘转动时间、磁头移动时间等),于是我们需要一个数据结构来减少磁盘访问次数

B树每个节点包含多个关键字(键)和对应的数据指针(节点),关键字按照大小排序,并且每个节点的关键字都对应子节点的范围。

B树的根节点存储在主存中,而其他节点存储在磁盘或其他外部存储设备上

M阶B树是有以下特性的M叉树:

  1. 数据项(data items)存储在叶节点(leaves);
  2. 非叶节点(nonleaf nodes)最多存储指引搜索路线的M-1个关键字Key,并且Key i是该节点子树i+1的最小值;
  3. 根节点(root)也是非叶节点,它有2至M个子节点;
  4. 所有非叶节点(root除外)有\(\lceil M/2 \rceil\)至M个子节点;
  5. 所有叶节点都位于最底层,有\(\lceil L/2 \rceil\)至L个数据项。L是指定值,由存储块和记录大小决定,即L=存储块大小/记录大小

五阶B树示例如下图所示:

在这里插入图片描述

上图中,M=5,L=5,于是,根节点有2到5个子节点,非叶节点最多有4个关键字,除根节点外的非叶结点有3到5个子节点,叶节点有3到5个数据项。每个节点都是一个磁盘块(disk block)

2 B树的操作

添加

如图2,插入57到图1。

在这里插入图片描述

插入操作步骤如下:

  1. 从根节点开始,按照键值的大小进行搜索,直到找到合适的叶子节点。在这个例子中,我们找到了可以插入57的叶子节点。
  2. 检查叶子节点是否已满。如果叶子节点未满,则可以直接将57插入到适当的位置。
  3. 如果叶子节点已满,需要进行节点的分裂操作。首先,将叶子节点中的数据项和新的数据项按照键值的顺序重新排序。然后,将前一半数据项保留在原始叶子节点中,将后一半数据项移动到新创建的叶子节点中。同时,更新父节点中的键值和分支信息,以反映新的叶子节点的存在。
  4. 如果父节点也已满,可能需要继续进行分裂操作,以保持B树的平衡性。

如图3,插入55到图2,共两步:分裂页节点和更新父节点。所以一共有三次disk write操作。

在这里插入图片描述

如图4,插入40到图3,由于父节点满项,所以除了分裂子节点,更新父节点,还需要再分裂父节点。一共五次disk write。

在这里插入图片描述

添加操作可能导致的根节点分裂是B树高度增加唯一方式。

删除

flowchart TD A(寻找键值) ==> B{是否存在} B ==是==> C[删除键值] B ==否==> D(结束) C ==> E{该节点是否符合最小占用} E ==是==> D E ==否==> F{邻居节点是否比最小占用多} F ==是==> G[从邻居节点借一个] F ==否==> H[合并邻居节点] G ==> D H ==> I{父节点是否符合最小占用} I ==是==> D I ==否==> J{是否为根节点} J ==否==> F J ==是==> K{根节点是否只有一个子节点} K ==否==> D K ==是==> L[删除根节点,子节点作为新根节点] L ==> D

上图删除根节点是B树高度减小的唯一方式。

标签:数据项,存储,叶子,插入,键值,数据结构,节点
From: https://www.cnblogs.com/LiJunLin1231/p/17459888.html

相关文章

  • 每日记录(数据结构 第一章 绪论)
    这些天准备学一下数据结构,面对越来越多的问题都需要使用设计一些算法,所以从网上摘抄总结的数据结构有关的知识 数据(data)是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。数据元素(dataelement)是数据的基本单位,在计算机程......
  • 每日记录(数据结构 第二章 线性表() )
     线性表的定义:存在唯一一个“第一个”元素存在唯一一个“最后一个”元素除第一个元素外,每一个元素都有且只有一个前驱除最后一个元素外,每个元素都有且只有一个后继一、线性表顺序存储结构(顺序表)0.线性表的基本概念线性表强调元素在逻辑上紧密相邻,所以首先想到用数组存储。但是......
  • 数据结构(4天)
    带权并查集:维护一个数组,保存一个fa[x]与x之间的关系,路径压缩时直接要记得修改关系intfind(intx){if(fa[x]==x){returnfa[x];}introot=find(fa[x]);w[x]=f(w[x],w[fa[x]]);//关键fa[x]=root;returnfa[x];}对于区间修......
  • 数据结构小结
    个人认为数据结构有点偏向理论知识点,从这些理论知识点,我们可以知道各种数据结构的特点,然后在特定的场景下使用对应的数据结构来存储。基础的数据结构从逻辑上来说基础的数据结构只有线性结构、非线性结构,也就是数组、链表。其他复杂一点的如队列、栈、树、图、hashtable都可......
  • 数据结构第一天
    数据>数据元素>数据项 数据项是构成数据元素的不可分割的最小单位 数据是由数据项组成的,数据项是由数据元素组成的 数据元素-----组成数据的基本单位与数据的关系:是集合的个体 数据对象------性质相同的数据元素的集合与数据的关系:是集合的子集  数据元素......
  • C#数据结构-红黑树实现
    参考网址: https://zhuanlan.zhihu.com/p/353948322二叉查找树,他对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。红黑树保证在最坏的情况下插入和查找效率都能保证在对数的时间复杂度内完成。红黑树的性质:性质1.节点是红色或黑色性质2.根是......
  • 数据结构--Dijkstra算法最清楚的讲解
    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止###基本思想通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。此外,引进两个集合S和U。S的......
  • [学习笔记]数据结构_线性表_顺序表and单链表
    线性表线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构,两者属于不同层面上的概念。线性表的基本操作boolInitList(&L)//初始化表,构造一个空的线性表intLength(L)//求表长。返回线性表L的长度,即L中数据元素的个数intLocateElem(L,e)//按......
  • R数据结构-列表
    列表(List)是一种数据结构,它可以包含不同类型的对象,包括向量、矩阵、数据框、函数等。列表允许您将多个对象组合到一个结构中,以便以统一的方式进行处理和访问#创建一个包含向量、矩阵和数据框的列表vec<-c(1,2,3)mat<-matrix(1:9,nrow=3)df<-data.frame(x=c(1,2......
  • 《数据结构》之栈和堆结构及JVM简析
    导言:在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代?一.程序在内存中的分布作为一个程序猿,我们应该会常常跟代码打交道,那么我们所编写的程序或代码,是怎么跑......