【发布时间】:2015-08-11 20:36:09
【问题描述】:
注意:这是Cracking the Coding Interview 5th Edition中的问题4.3
问题:给定一个排序(升序)数组,编写一个算法来创建一个高度最小的二叉搜索树
这是我的算法,用Java编写来解决这个问题
public static IntTreeNode createBST(int[] array) {
return createBST(array, 0, array.length-1);
}
private static IntTreeNode createBST(int[] array, int left, int right) {
if(right >= left) {
int middle = array[(left + right)/2;
IntTreeNode root = new IntTreeNode(middle);
root.left = createBST(array, left, middle - 1);
root.right = createBST(array, middle + 1, right);
return root;
} else {
return null;
}
}
我根据作者的代码检查了这段代码,它几乎是相同的。
但是我很难分析这个算法的时间复杂度。
我知道这不会在 O( logn) 喜欢Binary Search,因为您在每个递归级别上所做的工作量不同。 E.G在第一级,1个工作单元,2级-2个工作单元,3级-4个工作单元,一直到log2(n)级-n个工作单元。
因此,基于此,此算法所采取的步骤数将受此数学表达式的限制
看了Infinite geometric series之后,我评价为
或 2n 将在 O(n)
你们是否同意我在这里的工作以及这个算法会在 O(n) 中运行,或者我错过了什么或者它实际上在 O(nlogn) 中运行还是其他一些函数类?
【问题讨论】:
-
是的,它是 O(n)。如果我更清楚地知道什么是复杂性的良好证明,我会给出答案。
-
@Beta 没有证据你怎么能说出来?
-
我看到算法调用自身两次,每次在 n/2 个元素上,额外的工作量为 O(1),并且删除了一个元素。我不认为这是一个严格的证明(如“让
f(n)和g(n)成为这样的函数......”),但足以让我在脑海中看到它,就像一根绳子一样分成几块,没有重叠。 -
@Beta 为了确定,这里的空间复杂度会是 O(log n),因为最深递归调用的高度是 log n?
-
我理解的“空间复杂度”这个词是指存储空间而不是堆栈深度。调用堆栈的最大深度是 log(n),但空间复杂度是 O(n),因为这是结果树的大小(以及 O(log(n)) 开销 adds至此,它不会相乘)。
标签: algorithm big-o time-complexity complexity-theory asymptotic-complexity