B树可以采用二叉树的形式吗
Can a B-Tree take on the form of a binary tree
在数据库系统的 CS 考试中,问题是使用 B 树索引在给定系统中查找记录的最大块访问数是多少。 B 树的阶数为 4,最大条目数是当所有内部节点都半满时(因为如果它们少于半满,它们将与邻居合并)。因此,当每个节点都有 2 个子树指针时,树处于最高深度(并且最大访问次数等于树的深度)。但这将有效地赋予树与二叉树相同的结构,因为每个节点只包含一个数据和两个指针。
所以问题是这样的:
有了插入和删除的策略,在物理上是否可以按允许树采用这种形式的顺序插入和删除节点,或者它总是会合并并减少树的深度?
当然可以。
这样的二叉树只靠插入是不可能实现的,但是一旦你在一个4度b-tree中插入了一堆键(数据元素),你就可以从叶子中删除键所以以二叉树形状为目标。
您将为二叉树设定特定的树高度,因此首先进行足够的插入以获得具有该高度的 B-tree。然后消除键以减少非二进制节点的程度,从树的顶层开始,向下工作。
一个例子
假设您要创建这样一棵高度为 3 的树。为此,我们会将值 1 到 13 插入到空树中。这将导致这棵树:
[9]
[3, 6] [12]
[1, 2] [4, 5] [7, 8] [10, 11] [13]
现在为了在我们目前有 [3, 6] 的地方只获得一个密钥,我们需要摆脱它的一个 children。所以让我们删除 7 和 8:
删除8后,标准算法会将值5从[4, 5]“旋转”到它的parent,并将parent键(6)注入child 我们删除了 8:
[9]
[3, 5] [12]
[1, 2] [4] [6] [10, 11] [13]
我们在同一个节点还是有太多的children,所以我们继续删除6。现在有一个叶子的合并,会减少我们最初想减少的节点:
[9]
[3] [12]
[1, 2] [4, 5] [10, 11] [13]
现在所有 non-binary 个节点都在底层。我们现在可以删除键 2、5 和 11 以获得二叉树:
[9]
[3] [12]
[1] [4] [10] [13]
一般
同样的原则也适用于更高的树。只需从 non-binary 的内部节点子树中删除键,直到它们被删除。在某些时候会发生合并,这将降低 non-binary 节点的程度,最终使它们成为二进制。
如果你从上到下这样做,你将一层又一层二进制化,最后底层也是二进制化。
在数据库系统的 CS 考试中,问题是使用 B 树索引在给定系统中查找记录的最大块访问数是多少。 B 树的阶数为 4,最大条目数是当所有内部节点都半满时(因为如果它们少于半满,它们将与邻居合并)。因此,当每个节点都有 2 个子树指针时,树处于最高深度(并且最大访问次数等于树的深度)。但这将有效地赋予树与二叉树相同的结构,因为每个节点只包含一个数据和两个指针。
所以问题是这样的:
有了插入和删除的策略,在物理上是否可以按允许树采用这种形式的顺序插入和删除节点,或者它总是会合并并减少树的深度?
当然可以。
这样的二叉树只靠插入是不可能实现的,但是一旦你在一个4度b-tree中插入了一堆键(数据元素),你就可以从叶子中删除键所以以二叉树形状为目标。
您将为二叉树设定特定的树高度,因此首先进行足够的插入以获得具有该高度的 B-tree。然后消除键以减少非二进制节点的程度,从树的顶层开始,向下工作。
一个例子
假设您要创建这样一棵高度为 3 的树。为此,我们会将值 1 到 13 插入到空树中。这将导致这棵树:
[9]
[3, 6] [12]
[1, 2] [4, 5] [7, 8] [10, 11] [13]
现在为了在我们目前有 [3, 6] 的地方只获得一个密钥,我们需要摆脱它的一个 children。所以让我们删除 7 和 8:
删除8后,标准算法会将值5从[4, 5]“旋转”到它的parent,并将parent键(6)注入child 我们删除了 8:
[9]
[3, 5] [12]
[1, 2] [4] [6] [10, 11] [13]
我们在同一个节点还是有太多的children,所以我们继续删除6。现在有一个叶子的合并,会减少我们最初想减少的节点:
[9]
[3] [12]
[1, 2] [4, 5] [10, 11] [13]
现在所有 non-binary 个节点都在底层。我们现在可以删除键 2、5 和 11 以获得二叉树:
[9]
[3] [12]
[1] [4] [10] [13]
一般
同样的原则也适用于更高的树。只需从 non-binary 的内部节点子树中删除键,直到它们被删除。在某些时候会发生合并,这将降低 non-binary 节点的程度,最终使它们成为二进制。
如果你从上到下这样做,你将一层又一层二进制化,最后底层也是二进制化。