📜  数据结构-B Tree

📅  最后修改于: 2020-10-15 01:04:14             🧑  作者: Mango

B树

B树是一种专门的m-way树,可以广泛用于磁盘访问。顺序为m的B树最多可以包含m-1个键和m个子级。使用B树的主要原因之一是它能够通过将树的高度保持相对较小来在单个节点中存储大量键并存储较大的键值。

顺序为m的AB树包含M方式树的所有属性。此外,它包含以下属性。

  • B树中的每个节点最多包含m个子节点。
  • B树中除根节点和叶节点以外的每个节点至少包含m / 2个子节点。
  • 根节点必须至少有2个节点。
  • 所有叶节点必须处于同一级别。

不必所有节点都包含相同数量的子节点,但每个节点必须具有m / 2个节点。

下图显示了4阶AB树。

在B树上执行某些操作时,B树的任何属性都可能违反,例如节点可以具有的最小子级数。为了维护B树的属性,树可能会分裂或合并。

运作方式

搜索:

B树中的搜索与二叉树中的搜索相似。例如,如果我们在以下B树中搜索项目49。该过程将如下所示:

  • 将项目49与根节点78进行比较。由于49 <78,因此移至其左子树。
  • 从40 <49 <56开始,遍历40的右子树。
  • 49> 45,向右移动。比较49。
  • 找到匹配项,返回。

在B树中搜索取决于树的高度。搜索算法需要O(log n)时间来搜索B树中的任何元素。

插入

插入在叶节点级别完成。为了将一个项目插入B树,需要遵循以下算法。

  • 遍历B树以找到可以在其上插入节点的适当叶节点。
  • 如果叶节点包含少于m-1个键,则以升序插入元素。
  • 否则,如果叶子节点包含m-1个键,则请执行以下步骤。
    • 按元素的升序插入新元素。
    • 将节点拆分为中间的两个节点。
    • 将中值元素推到其父节点。
    • 如果父节点也包含m-1个键,请按照相同的步骤将其拆分。

例:

将节点8插入下图所示的5阶B树中。

8将插入到5的右侧,因此插入8。

现在,该节点包含5个键,这些键大于(5 -1 = 4)键。因此,将节点与中值(即8)分开,并将其向上推至其父节点,如下所示。

删除中

删除也在叶节点上执行。要删除的节点可以是叶节点或内部节点。为了从B树删除节点,需要遵循以下算法。

  • 找到叶节点。
  • 如果叶节点中有m / 2个以上的密钥,则从该节点中删除所需的密钥。
  • 如果叶节点不包含m / 2个键,则通过从8个或左侧同级中获取元素来完成键。
    • 如果左侧同级元素包含m / 2个以上的元素,则将其最大元素推至其父元素,然后将中间元素向下移至删除键的节点。
    • 如果右同级元素包含m / 2个以上的元素,则将其最小元素向上推至父元素,然后将中间元素向下移至删除键的节点。
  • 如果两个兄弟节点均不包含m / 2个以上的元素,则通过连接两个叶节点和父节点的中间元素来创建新的叶节点。
  • 如果父节点少于m / 2个节点,则也对父节点应用上述过程。

如果要删除的节点是内部节点,则用其顺序的后继节点或前继节点替换该节点。由于后继者或前任者将始终在叶节点上,因此该过程与从叶节点中删除该节点的过程类似。

例子1

从下图所示的5阶B树中删除节点53。

53位于元素49的右子元素中。将其删除。

现在,57是节点中剩余的唯一元素,必须存在于5阶B树中的元素的最小数量为2。它小于该元素,即它的左右子树中的元素因此,还不足以将其与父级(即49)的左侧同级和中间元素合并。

最终的B树如下所示。

B树的应用

B树用于索引数据并提供对磁盘上存储的实际数据的快速访问,因为对存储在磁盘上的大型数据库中存储的值的访问非常耗时。

在最坏的情况下,搜索包含n个键值的未索引和未排序的数据库需要O(n)运行时间。但是,如果我们使用B树索引此数据库,则在最坏的情况下将在O(log n)时间内对其进行搜索。