无法找到Big-Oh值

时间:2018-01-19 01:12:49

标签: big-o

请参阅下面的代码片段:

sum = 0; 
for( i = 0; i < n; i++ ) 
    for( j = 0; j < i * i; j++ ) 
        for( k = 0; k < j; k++ ) 
            sum++;

如果要在Big-Oh表示法中分析此片段的运行时间,那么最合适的值是什么?它会是O(N ^ 4)吗?

3 个答案:

答案 0 :(得分:0)

我必须说O(n^5)。我可能错了。 n是我假设的这个问题中数组的长度。如果您替换它,i将在i < n时停止,j < n*n将在k时停止k < n * n。由于这些是嵌套for-loops,因此运行时间为O(n^5)

答案 1 :(得分:0)

我认为这是O(n ^ 5)

我们知道

1 + 2 + 3 + ... + n = n(n + 1)/ 2 = O(n ^ 2)

1 ^ 2 + 2 ^ 2 + ... + n ^ 2 = n(n + 1)(2n + 1)/ 6 = O(n ^ 3)

我认为类似的陈述适用于更大权力的总和。

让我们考虑这两行

for( j = 0; j < i * i; j++ ) 
        for( k = 0; k < j; k++ )

这个循环的固定i的时间复杂度是 1 + 2 + ... +(i-1)^ 2 =(i-1)^ 2(1 +(i-1)^ 2)/ 2 = O(i ^ 4)

但是在我们的代码中,我从0变为n-1,所以我们喜欢添加第四个权力,正如我之前所说的那样

1 ^ k + 2 ^ k + ... + n ^ k = O(n ^(k + 1))

这就是时间复杂度为O(n ^ 5)

的原因

答案 2 :(得分:0)

鉴于此代码,请分别考虑每个循环。

sum = 0;
for( i = 0; i < n; i++ )         //L1
    for( j = 0; j < i * i; j++ ) //L2
        for( k = 0; k < j; k++ ) //L3
            sum++;               //

单独考虑最外层环路(L1)。显然这个循环是O(n)。

for( i = 0; i < n; i++ )         //L1
    L2(i);

考虑下一个循环(L2)。这个更难,但循环是O(n ^ 2) 请参阅此SO答案,了解循环为O(n ^ 2)的原因:Big O, how do you calculate/approximate it?

    for( j = 0; j < i * i; j++ ) //L2
        L3(j);

考虑下一个循环(L3)。既然你知道L2循环是O(N ^ 2),这个循环是什么? (让读者完成他们的作业)。

        for( k = 0; k < j; k++ ) //L3
            sum++;               //