漫画:什么是B-树?

什么是B-树(balance tree)









————————————





















————————————































二叉查找树的结构:




第1次磁盘IO:




第2次磁盘IO:




第3次磁盘IO:




第4次磁盘IO:












下面来具体介绍一下B-树(Balance Tree),一个m阶的B树具有如下几个特征:


1.根结点至少有两个子女。


2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m


3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m


4.所有的叶子结点都位于同一层。


5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

















第1次磁盘IO:





在内存中定位(和9比较):





第2次磁盘IO:





在内存中定位(和2,6比较):





第3次磁盘IO:





在内存中定位(和3,5比较):















自顶向下查找4的节点位置,发现4应当插入到节点元素3,5之间。




节点3,5已经是两元素节点,无法再增加。父亲节点 2, 6 也是两元素节点,也无法再增加。根节点9是单元素节点,可以升级为两元素节点。于是拆分节点3,5与节点2,6,让根节点9升级为两元素节点4,9。节点6独立为根节点的第二个孩子。










自顶向下查找元素11的节点位置。




删除11后,节点12只有一个孩子,不符合B树规范。因此找出12,13,15三个节点的中位数13,取代节点12,而节点12自身下移成为第一个孩子。(这个过程称为左旋















—————END—————




参考链接:https://my.oschina.net/u/4543837/blog/4601314

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在给出的代码中,以正号(+)表示新增定义,以负号(-)表示修改删除的定义。每个定义后面数字表示相对于某个基地址的移量。偏移量为负数表示在地址之前的位置,为零或正表示在基地址之后的位置。 下是每个定义的说明: - `-0000000000004 r:.word 2 dup(?)`: 定义一个名为 `r`数组,数组元素的大小为 `word`(即2字节),并且有2个元素。 - `-0000000000000012 var_0:.long ?`: 定义了一个名为 `var_0` 的变量,大小为 `long`(即4字节)。 - `-0000000000000010 var_2:.long ?`: 定义了一个名为 `var_2` 的变量,大小为 `long`。 - `-000000000000000E .word ? ; undefined`: 定义了一个未命名的 `word` 类型的变量。 - `-000000000000000D var_5:.word ?`: 定义了一个名为 `var_5` 的变量,大小为 `word`。 - `-000000000000000C var_6:.word ?`: 定义了一个名为 `var_6` 的变量,大小为 `word`。 - `-000000000000000B var_7:.word ?`: 定义了一个名为 `var_7` 的变量,大小为 `word`。 - `-000000000000000A var_8:.word ?`: 定义了一个名为 `var_8` 的变量,大小为 `word`。 - `-0000000000000009 var_9:.word ?`: 定义了一个名为 `var_9` 的变量,大小为 `word`。 - `-0000000000000008 var_A:.word ?`: 定义了一个名为 `var_A` 的变量,大小为 `word`。 - `-0000000000000007 var_B:.word ?`: 定义了一个名为 `var_B` 的变量,大小为 `word`。 - `-0000000000000006 var_C:.word ?`: 定义了一个名为 `var_C` 的变量,大小为 `word`。 - `-0000000000000005 var_D:.word ?`: 定义了一个名为 `var_D` 的变量,大小为 `word`。 - `-0000000000000004 var_E:.word ?`: 定义了一个名为 `var_E` 的变量,大小为 `word`。 - `-0000000000000003 var_F:.word ?`: 定义了一个名为 `var_F` 的变量,大小为 `word`。 - `-0000000000000002 var_10:.word ?`: 定义了一个名为 `var_10` 的变量,大小为 `word`。 - `-0000000000000001 var_11:.word ?`: 定义了一个名为 `var_11` 的变量,大小为 `word`。 - `+0000000000000000 var_12:.long ?`: 修改了之前的定义,将 `var_12` 的大小改为 `long`。 - `+0000000000000002跟-000000000000000E r:.word 2 dup(?)`: 修改了之前的定义,将 `r` 的元素大小改为 `word`。 - `-000000000000000C s:.word 4 dup(?)`: 修改了之前的定义,将 `s` 的元素大小改为 `word`。 - `-0000000000000008 .word ? ; undefined`: 定义了一个未命名的 `word` 类型的变量。 - `-0000000000000007 var_1:.word ?`: 定义了一个名为 `var_1` 的变量,大小为 `word`。 - `-0000000000000006 var_2:.word ?`: 定义了一个名为 `var_2` 的变量,大小为 `word`。 - `-0000000000000005 var_3:.word ?`: 定义了一个名为 `var_3` 的变量,大小为 `word`。 - `-0000000000000004 var_4:.word ?`: 定义了一个名为 `var_4` 的变量,大小为 `word`。 - `-0000000000000003 var_5:.word ?`: 定义了一个名为 `var_5` 的变量,大小为 `word`。 - `-0000000000000002 var_6:.long ?`: 定义了一个名为 `var_6` 的变量,大小为 `long`。 - `+0000000000000000 var_8:.long ?`: 修改了之前的定义,将 `var_8` 的大小改为 `long`。 - `+0000000000000002 var_A:.long ?`: 修改了之前的定义,将 `var_A` 的大小改为 `long`。 - `+0000000000000004 var_C:.long ?`: 修改了之前的定义,将 `var_C` 的大小改为 `long`。 - `+0000000000000006的差别`: 这部分没有给出具体的定义,无法提供详细说明。 根据上述说明,你可以看到在修改或删除定义时,变量的类型和大小可能发生了变化。此外,还需要注意变量在内存中的布局和相对于基地址的偏移量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

゛Smlie。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值