使用多个嵌套循环查找Big-O?

时间:2009-04-20 04:53:33

标签: loops nested big-o

int num = n/4;
for (int i = 1; i <= num; i++) {
    for (int j = 1; j <= n; j++) {
        for (int k = 1; k <= n; k++) {
            int count = 1;
        }
    }
}

根据我读过的书,这段代码应该是O((n ^ 3)/ 4)。但显然不是。找到嵌套循环的Big-O你应该乘以界限吗?所以这个应该是num * n * n或n / 4 * n * n。

4 个答案:

答案 0 :(得分:15)

O((n^3)/4)在大O符号方面毫无意义,因为它意味着将复杂性作为参数的比例来衡量。除以4没有效果,因为它改变了比率的值而不是其性质。

所有这些都是等价的:

O(n^3)
O(n^3/4)
O(n^3*1e6)

其他字词仅在包含n字词时才有意义,例如:

O(n^3 / log(n))
O(n^3 * 10^n)

正如安东尼·卡纳戈(Anthony Kanago)正确地指出的那样,它的惯例是:

  • 仅保留总和增长率最高的字词:O(n^2+n) = O(n^2)
  • 摆脱产品的常量:O(n^2/4) = O(n^2)

顺便说一句,在所有情况下,我并不总是同意第一条规则。这对于确定函数的最大增长率是一个很好的规则,但对于像算法比较(a)这样的事情,你可以智能地对输入参数设置限制,类似于O(n^4+n^3+n^2+n)明显比仅仅O(n^4)更糟糕。

在这种情况下,应包括依赖于输入参数的任何术语。事实上,即使是不变的术语也可能在那里有用。例如O(n+1e100)O(n^2)进行比较 - 后者将在很长一段时间内超越前者,直到n变得足够大以对常量词产生影响。


(a)当然,有人会说它不应该以这种方式使用,但实用主义经常克服现实世界中的教条主义: - )

答案 1 :(得分:1)

http://en.wikipedia.org/wiki/Big_O_notation可以看出,像1/4这样的常量不起决定Big-O表示法的作用。唯一有趣的事实是它是n ^ 3,因此是O(N ^ 3)。

答案 2 :(得分:0)

正式地,时间复杂度可以推导如下:

enter image description here

答案 3 :(得分:-1)

技术性小。 Big O表示法旨在根据输入的“大小”来描述复杂性,而不是数值。如果您的输入是数字,则输入的大小是您的数字的位数。唉,你的算法是O(2 ^ N ^ 3),N是数字。

More on this topic