将大小为n的排序数组转换为合法的2-4 B树是什么意思?
如果数组没有排序,它会是什么。
我认为第一个答案应该是O(logn)
(我们必须做的事情要多次分裂),第二个答案应该是O(nlogn + logn)= O(nlogn),因为排序
谢谢。
答案 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)
将有序列表转换为任何类型的树的技巧如下:
给定多个元素N,编写一个函数(即shape(N)
),它能够确定每个子树中应该有多少元素(例如,对于AVL树,{{1}当一个元素进入节点时。)
编写一个(递归)函数,该函数从列表的开头获取N个元素,并返回包含这些元素的子树和指向包含其余元素的子列表的指针。