在一个论坛中,我被告知数组已经是一个平衡的B树。它是如何获得的?也许是因为在B树中添加元素具有固定的复杂性?
答案 0 :(得分:4)
我认为纯粹从数据结构的角度来看,排序数组a
可以被认为是只有一个节点的B树。即,订单大于length
的{{1}}的B树。在这种情况下,您的根节点将是数组a
,并且由于树中只有一个节点,因此该根节点将是叶节点(这意味着它保存数据而不仅仅是键)。
这样的B树将是平衡的,因为在深度为零的情况下只有一个节点,这满足了在平衡B树中所有叶节点必须处于相同深度的要求。
这将适用于订单的定义,其中订单 m 的B树是B树,其中每个节点最多具有 m 子节点。这意味着节点最多可以包含 m -1个键(或叶子节点的元素)。
答案 1 :(得分:1)
我不知道B树,但众所周知,有序数组具有嵌入其中的平衡二进制搜索树的结构。它在Knuth等等。
考虑数组的一部分,其范围为low
到high
(high
像往常一样指向一端。树的根位于(low + high) / 2
(让我们称之为索引mid
)。左子树从low
延伸到mid
。右子树从mid + 1
延伸到high
。零长度范围对应于叶子。
你可以很容易地看到它必须是一个搜索树:mid的左边的元素是<=
根元素,因为数组是排序的,根据定义,这些正是左子树中的元素。它在右边的工作方式相同。
您还可以看到此隐式树必须平衡,因为左右子树的长度平均相同。
答案 2 :(得分:0)
我之前在PHP中测试了这个问题。我将18000个日志记录插入到临时表中并进行查询,然后将这些日志记录添加到数组中(它是关联的)并再次进行相同的查询。前者花费0.006秒,而后者平均花费0.51秒。所以我认为关联数组至少在PHP中并不是b-treed。