繁体   English   中英

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

[英]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时,最好在上面的注释中对代码的步骤进行编号...我从这里开始遵循示例

大O,你如何计算/近似它?

所以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*NO (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM