确定代码段的时间复杂度

时间:2017-09-07 20:53:57

标签: c++ algorithm time-complexity notation

以下每个代码段的时间复杂度是多少?

1. int i, j, y=0, s=0;
for ( j = 1; j <= n; j ++) 
{
  y=y+j;
}
for ( i = 1; i <= y; i ++) 
{
  s++;
}

我的答案是O(2n)因为它遍历每个循环n次并且有两个循环

2. function (n) {
  while (n > 1) {
  n = n/3 ;
}

我对这个问题的答案是n ^(1/3),因为n每次都变成它的三分之一

3. function (n) {
int i, j, k ;
for ( i = n/2; i <= n; i ++ ) {   //n/2?
  for ( j = 1; j <= n; j = 2*j ) {  //logn
    for ( k = 1; k <= n; k = 2*k ) {  //logn
      cout << ”COSC 2437.201, 301” << endl;
    }
  }
}
}  

我说这个问题的答案是O(log2 * log2n * n / 2),但我对第一个for循环感到很困惑。循环只需要迭代n次的一半,所以n / 2是否正确?感谢大家的帮助。

1 个答案:

答案 0 :(得分:2)

问题1

第一个循环是O(n),因为它运行n次。 然而,第二个循环执行y次,而不是n - 因此总运行时间不是&#34; 2n&#34;

在第一个循环结束时,y的值为:

enter image description here

因此,第二个循环占主导地位,因为它是O(n^2),因此也是整体复杂性。

问题3

这个答案是正确的(但同样,在O符号中删除2的因子)。

但是,你必须小心天真地将环的复杂性相乘,因为内环的边界可能取决于外环的自发值。

问题2

这是不是 O(n^(1/3))!你的推理是不正确的。

如果仔细观察这个循环,它实际上类似于问题3中内循环的 reverse

  • 在第3季度,k的值从1开始,每次乘以2,直到达到n
  • 在Q2中,n的值每次除以3,直到达到1。

因此他们都采取O(log n)步骤。

(作为旁注,O(n^(1/3))循环看起来像这样:)

for (int i = 1; i*i*i <= n; i++)
   /* ... */