09-看图理解数据结构与算法系列(B树)
B树
B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树、B_树。是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找、插入和删除。B树一般较多用在存储系统上,比如数据库或文件系统。
B树特点
- B树可以定义一个m值作为预定范围,即m路(阶)B树。
- 每个节点最多有m个孩子。
- 每个节点至少有ceil(m/2)个孩子,除了根节点和叶子节点外。
- 对于根节点,子树个数范围为[2,m],节点内值的个数范围为[1,m-1]。
- 对于非根节点,节点内的值个数范围为[ceil(m/2)-1,m-1]。
- 根节点(非叶子节点)至少有两个孩子。
- 一个有k个孩子的非叶子节点包含k-1个值。
- 所有叶子节点在同一层。
- 节点内的值按照从小到大排列。
- 父节点的若干值作为分离值分成多个子树,左子树小于对应分离值,对应分离值小于右子树。
以下是一个四阶B树,
插入
假设现在构建一棵四阶B树,开始插入“A”,直接作为根节点,
插入“B”,大于“A”,放右边,
插入“C”,按顺序排到最后,
继续插入“D”,直接添加的结果如下图,此时超过了节点可以存放容量,对于四阶B树每个节点最多存放3个值,此时需要执行分裂操作,
分裂操作为,先选取待分裂节点的中值,这里为“B”,然后将中值“B”放到父节点中,因为这里还没有父节点,那么直接创建一个新的父节点存放“B”,而原来小于“B”的那些值作为左子树,原来大于“B”的那些值作为右子树。
继续插入“E”,"E"大于“B”,往右子节点,
分别于“C”和“D”比较,大于它们,放到最右边,
插入“F”,“F”大于“B”,往右子树,
“F”分别与“C”"D""E"比较,大于它们,放到最右边,此时触发分裂操作,
选取待分裂节点的中值“D”,然后将中值“D”放到父节点中,父节点中的“B”小于“D”,于是放到“B”右边,而原来小于“D”的那些值作为左子树,原来大于“D”的那些值作为右子树。
继续插入“M”,结果为,
插入“L’,大于“B”“D”,往右子树,
“L”大于“E”“F”小于“M”,于是放到第三个位置,此时触发分裂操作,
选取待分裂节点的中值“F”,然后将中值“F”放到父节点中,父节点中的“B”“D”都小于“F”,于是放到最右边,而原来小于“F”的那些值作为左子树,原来大于“F”的那些值作为右子树。
插入“K”,结果为,
插入“J”,大于“B”“D”“F”,往右子树,
“J”小于“K”“L”“M”,于是放到第一个位置,此时触发分裂操作,
选取待分裂节点的中值“K”,然后将中值“K”放到父节点中,父节点中的“B”“D”“F”都小于“K”,于是放到最右边,而原来小于“K”的那些值作为左子树,原来大于“K”的那些值作为右子树。此时父节点也触发分裂操作,
选取待分裂节点的中值“D”,然后将中值“D”放到父节点中,由于还没有父节点,那么直接创建一个新的父节点存放“D”,而原来小于“D”的那些值作为左子树,原来大于“D”的那些值作为右子树。
插入“I”,大于“D”,往右子树,
右子树不是叶子节点,继续往下,这时“I”大于“F”而小于“K”,所以往第二个分支,
“I”小于“J”,于是放到左边,
类似地,插入“H”,结果如下,
插入“G”,往左子树,
往中间分支,
触发分裂操作,
选取待分裂节点的中值“H”,然后将中值“H”放到父节点中,"H"大于父节点中的“F”而小于“K”,于是放到中间,而原来小于“H”的那些值作为左子树,原来大于“H”的那些值作为右子树。
综上所述,插入操作的核心是分裂操作。无需分裂的情况比较简单,直接插入即可;如果插入后超过节点容量,这个容量可预先自定义,则需要进行分裂操作,需要注意的是分裂可能引起父节点需要继续分裂。
查找
对B树进行查找就比较简单,查找过程有点类似二叉搜索树,从根节点开始查找,根据比较数值找到对应的分支,继续往子树上查找。
比如查找“I”,"I"大于“D”,往右子树,
“I”分别与节点内值比较,大于“F”“H”而小于“K”,往第三个分支,
逐一比较节点内的值,找到“I”。
作者:超人汪小建
链接:https://juejin.im/post/5b873a1af265da43741e2328
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
09-看图理解数据结构与算法系列(B树)的更多相关文章
- 06-看图理解数据结构与算法系列(AVL树)
AVL树 AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写.AVL树属于树的一种,而且它也是一棵二叉搜索树,不同的是他通过一定机制能保证二叉搜索树的平衡,平衡的二叉搜索树的查询效率更高. AVL ...
- 19-看图理解数据结构与算法系列(Radix树)
Radix树 Radix树,即基数树,也称压缩前缀树,是一种提供key-value存储查找的数据结构.与Trie不同的是,它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩.同样的,Rad ...
- 13-看图理解数据结构与算法系列(Trie树)
Trie树 Trie树,是一种搜索树,也称字典树或单词查找树,此外也称前缀树,因为某节点的后代存在共同的前缀.它的key都为字符串,能做到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是如 ...
- 11-看图理解数据结构与算法系列(B树的删除)
删除操作 删除操作比较复杂,主要是因为删除的项可能在叶子节点上也可能在非叶子节点上,而且删除后可能导致不符合B树的规定,这里暂且称之为导致B树不平衡,于是要进行一些合并.左旋.右旋等操作,使之符合B树 ...
- 10-看图理解数据结构与算法系列(B+树)
B+树 B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点.内部节点和叶子节点.多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引, ...
- 17-看图理解数据结构与算法系列(NoSQL存储-LSM树)
关于LSM树 LSM树,即日志结构合并树(Log-Structured Merge-Tree).其实它并不属于一个具体的数据结构,它更多是一种数据结构的设计思想.大多NoSQL数据库核心思想都是基于L ...
- 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文
<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
随机推荐
- Luogu P2458 [SDOI2006]保安站岗【树形Dp】
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- Ubuntu 18 通过ssh连接远程服务器
ps -e | grep ssh 查看自己的Ubuntu是否开启ssh服务,如果我们要连其他的,那需要有 ssh-client的进程 如果我们的作为主机,那需要有sshd的进程 相应的安装方法: cl ...
- Kafaka入门篇
1.Apache Kafka - 简介 Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点. Kafka适合离线 ...
- C# System.IO 文件流输入输出
一.读写文本文件 可以用fileStream来读写文本文件,但是FileStream是通过字节形式来读写数据的,要把字节数据转换为文本,要自己处理编码转换. 对于文本文件的读写,通常用 StreamR ...
- asp.net core连接sqlserver
开发环境:win7,vs2017,sqlserver2014 vs上建立一个asp.net core web项目和一个.net core的类库项目DBA 简单起见,在DBA项目中就一个类SqlServ ...
- java 字符串截取的几种方式
1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时. String str = " ...
- 443 String Compression 压缩字符串
给定一组字符,使用原地算法将其压缩.压缩后的长度必须始终小于或等于原数组长度.数组的每个元素应该是长度为1 的字符(不是 int 整数类型).在完成原地修改输入数组后,返回数组的新长度.进阶:你能否仅 ...
- tomcat 修改端口
修改tomcat端口号: a) 去tomcat安装目录(或者解压目录)下的“conf”文件夹中找到文件“server.xml”(本例:“D:\Program Files\Apache Software ...
- MVC C# 直接导出txt文件
用asp.net根据数据内容自动生成一个txt文本文件并提供用户下载,此方法文件不保存在服务器上,直接提供给用户下载,到网上搜了一下,都是用的Response.BinaryWrite(),用了几下,发 ...
- SP CAML工具
直接一直使用CAML做一些简单的SP列表查询,突然想对CAML进一步了解,于是找到两个常用工具,做以记录: 1 Caml Query Builder : 用于编写CAML查询,对初学者可以了解查询语句 ...