将排序数组转换为2-4 B树的复杂性

时间:2011-07-06 14:58:38

标签: data-structures b-tree

将大小为n的排序数组转换为合法的2-4 B树是什么意思?

如果数组没有排序,它会是什么。

我认为第一个答案应该是O(logn)(我们必须做的事情要多次分裂),第二个答案应该是O(nlogn + logn)= O(nlogn),因为排序

谢谢。

3 个答案:

答案 0 :(得分:4)

您绝对可以在O(n)时间内将已排序的数组转换为2-4树。有关详细信息,请参阅Ralf Hinze的Constructing Red-Black Trees。他的算法用红黑树写成,但红黑树基本上与2-4棵树相同(黑色节点有两个黑孩子是2节点,黑节点有一个红孩子是3节点,一个有两个红孩子的黑色节点是一个4节点。)

而且,是的,如果数组未排序,你将会遇到O(n log n)时间(除非你知道一些关于数据的特殊内容,它可以让你比O更好地排序(n log n)时间)。

答案 1 :(得分:1)

好吧,如果你对n项目做了些什么,那么你似乎需要花费至少O(n)时间来做事。

我想到的第一件事就是旋转所有n项并将每个项插入树中。由于插入时间为O(log n),那是O(n * log n)时间......但它完全忽略了您的n项目是否已排序。

如果您的n项已排序,您可以在O(n)时间内构建二叉搜索树。我打赌类似的东西可以用于2-4 B树。

答案 2 :(得分:0)

将有序列表转换为任何类型的树的技巧如下:

  1. 给定多个元素N,编写一个函数(即shape(N)),它能够确定每个子树中应该有多少元素(例如,对于AVL树,{{1}当一个元素进入节点时。)

  2. 编写一个(递归)函数,该函数从列表的开头获取N个元素,并返回包含这些元素的子树和指向包含其余元素的子列表的指针。