理解从代码派生的Big O表示法

时间:2013-08-27 06:51:07

标签: java algorithm big-o

我为一些二叉树问题写了一些代码......代码如下:它一直向下走树,答案是肯定的,右边是答案否,如果到达一个外部节点则返回外部节点。

用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*NC*N

O (N),可以视为O(3N) ...

所以我的问题是,我是否正确地完成了这项工作,如果不是我哪里出错了?

谢谢

编辑:

树向左移动提供了一个真实的(是)答案或权利给出了否。对于树中的m个内部节点,内部节点编号为0到m-1。因此,如果在根,内部节点0处给出no,因此向右移动,则此内部节点可能是节点3,因此布尔答案在p [3]而不是p [1],因为p [1]是答案节点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)