这个循环是O(nlog(n))吗?

时间:2018-02-09 21:04:37

标签: algorithm big-o

我有一个嵌套的for循环,我试图分析效率。循环看起来像这样:

int n = 1000;
for (int i = 0; i < n; i++) {
    for (int j = 0; j < i; j++) {
        System.out.print("*");
    }
}

我不相信这个算法是O(n ^ 2),因为内部循环不运行n次,它只运行i次。但是,肯定不是O(n)。所以我假设它必须在两个效率之间,这给出了O(nlog(n))。这是准确的还是它真的是一个O(n ^ 2)算法,我误解了内循环对效率的影响?

3 个答案:

答案 0 :(得分:4)

您的算法将运行triangular number次:

  

n *(n + 1)/ 2

在上述情况下,n = 999因为第一个j循环没有运行:

  

(999 * 1000)/ 2 = 499500

低于n**2,但仍为O(n**2),因为n * (n + 1) / 2n**2 / 2 + n / 2。当n较大时,与n / 2相比,您可以忽略n**2 / 2,也可以忽略常量1 / 2因素。

答案 1 :(得分:2)

我有点怀疑,但试着这样想:i在最坏的情况下会有什么价值?答案是n-1,对吗?因此,通过考虑最坏的情况来评估复杂性,结果是O(n^2)n * (n-1) ~ n^2

答案 2 :(得分:0)

迭代次数为sum from i=0 to n-1 (sum from j=0 to i-1 (1))。内部总和显然等于isum from i=0 to n-1 (i) = n * (n-1) / 2 = O(n^2)众所周知。