我为一些二叉树问题写了一些代码......代码如下:它一直向下走树,答案是肯定的,右边是答案否,如果到达一个外部节点则返回外部节点。
用java编写,
public static int price(BinaryTree<Integer> t, boolean[] p) {
Position<Integer> root = t.root(); //1
while (t.isInternal(root)) { //2
int element = root.element(); // 3
if (!p[element]) { //4
root = t.getRight(root);//5
}
if (p[element]) { //6
root = t.getLeft(root); //7
}
}
int price = root.element(); //8
return price; //9
}
在计算Big O时,我认为最好在上面的评论中对代码的步骤进行编号...我从这里按照示例
Big O, how do you calculate/approximate it?
所以上面的1-9应该等同于这样,其中C
是常量而???
是我的循环(其中N是给定数据结构的输入数)
C + ??? + C + ??? + C + ??? + C + C + C
我的while
循环我认为C*N
或(O(N))
而不是C*N
,而我的两个if
语句应该是(对于时间复杂度{ {1}}用于索引...和O(1)
的空间复杂度,我现在会坚持时间复杂度)
所以现在我应该(删除O(N)
元素因为它们是常量而且并不重要)
C
和
C*N + C + C
了解空间复杂性
意思是我
时间复杂度和空间复杂度 C*N + C*N + C*N
或C*N
O (N)
,可以视为O(3N)
...
所以我的问题是,我是否正确地完成了这项工作,如果不是我哪里出错了?
谢谢
编辑:
树向左移动提供了一个真实的(是)答案或权利给出了否。对于树中的m个内部节点,内部节点编号为0到m-1。因此,如果在根,内部节点0处给出no,因此向右移动,则此内部节点可能是节点3,因此布尔答案在p [3]而不是p [1],因为p [1]是答案节点1,即问题1.混淆道歉
答案 0 :(得分:3)
是和否。
算法确实是O(n)
,因为你&#34;触摸&#34;每个元素不超过固定次数。
但是,这不是一个严格的界限,换句话说 - 它不是Theta(n)
,而是Theta(logN)
。 (请记住,大O只是一个上限。)
这是因为树是平衡的,并且您的算法基本上是从根到树中的某个叶子的路径。请注意,一旦你选择&#34;左/右,你永远不会回去。所以基本上你是&#34;触摸&#34;每个高度中的一个节点只有一定的次数,使你的算法成为O(h)
- 其中h
是树的高度。
由于树是平衡的,h < C * log(n)
,对于某个常量C
- 这使得算法Theta(logN)