请参阅下面的代码片段:
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)吗?
答案 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++; //