[英]Understanding Big O notation derived from code
我为一些二叉树问题写了一些代码......代码如下:它一直向下留下一个答案是肯定的,而答案是否正确,如果它到达一个,则返回外部节点。
用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 OI时,最好在上面的注释中对代码的步骤进行编号...我从这里开始遵循示例
所以1-9以上应该等同于这样的东西,其中C
是常量而且???
是我的循环(其中N是给定数据结构的输入数)
C + ??? + C + ??? + C + ??? + C + C + C
我的while
循环是我认为C*N
或(O(N))
而不是现在的C*N
)和我的两个if
语句应该是(对于索引的时间复杂度O(1)
...和O(N)
空间复杂性,我现在会坚持时间复杂度)
所以现在我应该(删除C
元素导致它们是常量并且并不重要)
C*N + C + C
表示时间复杂度
和
空间复杂度为C*N + C*N + C*N
我有意思
C*N
或O (N)
用于时间复杂度和空间复杂度
O(3N)
可被视为O(N)
......
所以我的问题是,我是否正确地做了这件事,如果不是我哪里出错了?
谢谢
编辑:
树向左移动提供真实(是)答案或权利给出否。 对于树中的m个内部节点,内部节点编号为0到m-1。 因此,如果在根,内部节点0处给出no,因此向右移动,则此内部节点可能是节点3,因此布尔答案在p [3]而不是p [1],因为p [1]是答案对于节点1,即问题1.道歉是为了混淆
是的,不是。
该算法确实是O(n)
,因为您“触摸”每个元素不会超过常数次。
但是,这不是严格的约束,换句话说 - 它不是Theta(n)
,它是Theta(logN)
。 (请记住,大O只是上限)。
这是因为树是平衡的,并且您的算法基本上是从根到树中的某个叶子的路径。 请注意,一旦你“选择”左/右,你永远不会回去。 所以基本上你只在每个高度“触摸”一个节点一定次数,使你的算法成为O(h)
- 其中h
是树的高度。
由于树是平衡的, h < C * log(n)
,对于某些常数C
- 这使得算法Theta(logN)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.