cs61b数据结构与算法笔记 B树

B树简介


在B树(B-树/BTree)BTree中,我们永远都不添加叶子节点。在插入时,我们直接把新节点添加到当前的叶子节点,这样高度永远不会增加。

然而,这样操作最后的结果是我们得到一个超极长的链表。因此改进如下:

对单个节点中的元素数设置限制。假设 4。

B树的插入

插入操作:如果我们需要在节点已经有 4 个元素的情况下向节点添加新元素,我们会将节点分成两半,向上凸起中间如果是偶数就中间偏左的节点作为父节点。中间元素左边的元素成为新的左子树,右边元素为新的右子树。

如上图,现在14,15,16,17被分成三个节点,仍旧能形成一个左小右大的子树,因此满足二叉搜索的条件,可以继续遍历。

这些树被称为B树或2-3-4/2-3树。2-3-4 和 2-3 是指每个节点可以具有的子节点数。因此,2-3-4 树可以有 2、3 或 4 个子树,(两个子树--节点有一个数值;三个子树--节点有两个数值;四个子树--节点有三个数值),而 2-3 棵树可以有 2 或 3 个子树,即每个节点可以有1或2个数值。这意味着 2-3-4 棵树在有 3 个节点并且需要再添加一个节点时会拆分节点。2-3 棵树在有 2 个节点后拆分,还需要添加一个节点。

将节点添加到 2-3-4 树的过程是:

  1. 我们仍然总是插入到叶节点中。所以拿你想要插入的节点从根节点开始向下遍历树,如果该节点大于遍历到的节点的前x个数,但小于后y-x个数,则接着遍历它的第x个子树。
  2. 将节点添加到叶节点后,如果新节点有 4 个节点(即大于三个节点的限制),则弹出中间偏左节点并放入原先的父节点中,并相应地重新排列新形成的子树中的子节点。
  3. 如果2. 导致父节点有 4 个节点,则再次弹出父节点的左中间节点,根据规则2(如果父节点仍有父节点)重新排列子节点,如果父节点没有父节点,则弹出的中间结点作为新的根节点。
  4. 重复此过程,直到父节点不超过容纳限制(<= 3个)或您到达根节点。

B树的删除

    在完成下面的步骤之前,你必须知道关于m度B树的这些事实。(m可理解为子级数)

  1. 一个节点最多可以有m个子节点。
  2. 一个节点最多可以包含m-1个键。
  3. 一个节点至少应有 ⌈m/2⌉ 个子节点。
  4. 节点(根节点除外)至少应包含⌈m/2⌉-1个键。

首先要查找数值x所在的节点。

一、如果x所在的节点不是叶节点:用某个叶节点的值代替该节点中的x。如果x是z中的第i个数值,就可以用第i个子树Ai中的最小数值或者第i-1个子树中的最大数值来替换x。

二、如果x所在的节点是叶子结点,分几种情况:

http://t.csdnimg.cn/sgLSo

1. 全图只有一个节点。这时直接删就行,删没了就释放空间。

要删除的节点位于叶子节点中:

2. 删除以后,该叶节点至少还有\left \lceil m/2 \right \rceil-1(m为单节点最大容纳量),即不会违反节点应持有的最小健数的属性。则直接删除。

如图,删除后并不违反规则,可以直接删除。

3.  删除键违反了节点应持有的最小键数的属性。在这种情况下,我们按照从左到右的顺序从紧邻的兄弟节点借用一个键。
    首先,去拜访他的左侧兄弟节点。如果左侧同级节点的键数超过最小值,则从该节点借用键。
    否则,尝试从紧邻的右侧同级节点借用。
在下面的树中,删除31会导致上述情况。让我们从左侧同级节点借用一个键。

如图:

    如果两个直接同级节点的键数都已达到最小值,则将该节点与左侧同级节点或右侧同级节点合并,这个合并是通过父节点完成的。

如图:

三、如果要删除的键位于内部节点中:

  1. 如果该键的靠左子节点的键数超过最小值,则删除的内部节点将替换为中序前置节点。
    在这里插入图片描述
  2. 如果右子节点的键数超过最小值,则删除的内部节点将替换为中序后置节点。
  3. 如果任一子级的键数均是最小的,则合并左子树和右子树。
    在这里插入图片描述

 合并后,如果父节点的键数小于最小值,则查找同级,如第一种情况所示。

四、  

在这种情况下,树的高度会缩小。如果目标键位于内部节点中,并且删除该键会导致节点中的键数量减少(即,少于所需的最小值),则查找中序前置和中序后置。如果两个子项都包含最少数量的键,则不能进行借用。这导致了第二种情况(3),即合并孩子。
    再说一遍,找兄弟同级借键。但是,如果同级也只有最少数量的键,则将节点与同级以及父级合并。把孩子们按顺序排列好。

BTree不变量有哪些

  1. 所有叶子与根的距离必须相同。
  2. 一个有k个数值的非叶节点必须正好有k+1个子节点。

这两个不变量保证B树总是“矮胖”的。

BTree运行时间

在 B 树中进行搜索的最坏运行情况是,每个节点都有最大数量的元素,而我们必须一直遍历到底部。我们用L来表示每个节点内的元素个数。由于BTree不变量的限制,最大高度为logN,这意味着我们在最坏情况内需要遍历logN个节点,且在每个节点内我们要遍历L个元素。总计要进行LlogN次操作。然而我们知道L是一个常量,所以我们的总运行时间为O(log N)。

总结

BST的树高度:最佳情况Θ(log N), 最坏情况Θ(N)。

BTree是在二项搜索树BST基础上的一种改版,避免了最坏情况Θ(N)。

  • 节点可能包含1到L个元素。
  • 其中包含的功能几乎与普通 BST 完全相同。
  • add 的工作原理是向现有的叶节点添加项目。如果节点太满,它们就会分裂。
  • BTree产生的树的平衡性非常好。操作的时间复杂度为O(log N)。
  • B 树更为复杂,但能有效处理任何插入顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值