数组已经是一个平衡的B树,这是真的吗?

时间:2013-12-19 07:53:16

标签: arrays algorithm data-structures tree b-tree

在一个论坛中,我被告知数组已经是一个平衡的B树。它是如何获得的?也许是因为在B树中添加元素具有固定的复杂性?

3 个答案:

答案 0 :(得分:4)

我认为纯粹从数据结构的角度来看,排序数组a可以被认为是只有一个节点的B树。即,订单大于length的{​​{1}}的B树。在这种情况下,您的根节点将是数组a,并且由于树中只有一个节点,因此该根节点将是叶节点(这意味着它保存数据而不仅仅是键)。

这样的B树将是平衡的,因为在深度为零的情况下只有一个节点,这满足了在平衡B树中所有叶节点必须处于相同深度的要求。

这将适用于订单的定义,其中订单 m 的B树是B树,其中每个节点最多具有 m 子节点。这意味着节点最多可以包含 m -1个键(或叶子节点的元素)。

答案 1 :(得分:1)

我不知道B树,但众所周知,有序数组具有嵌入其中的平衡二进制搜索树的结构。它在Knuth等等。

考虑数组的一部分,其范围为lowhighhigh像往常一样指向一端。树的根位于(low + high) / 2(让我们称之为索引mid)。左子树从low延伸到mid。右子树从mid + 1延伸到high。零长度范围对应于叶子。

你可以很容易地看到它必须是一个搜索树:mid的左边的元素是<=根元素,因为数组是排序的,根据定义,这些正是左子树中的元素。它在右边的工作方式相同。

您还可以看到此隐式树必须平衡,因为左右子树的长度平均相同。

答案 2 :(得分:0)

我之前在PHP中测试了这个问题。我将18000个日志记录插入到临时表中并进行查询,然后将这些日志记录添加到数组中(它是关联的)并再次进行相同的查询。前者花费0.006秒,而后者平均花费0.51秒。所以我认为关联数组至少在PHP中并不是b-treed。