找到循环的复杂性

时间:2015-06-16 16:19:10

标签: big-o time-complexity

以下代码部分的时间复杂度T(n)是多少?为简单起见,您可以假设n是2的幂,即n = 2 ^ k。对于某些正整数k。

for(i=1;;I<=n;i++)
  for(j=n/2;j<n;j++)
      print x;

选择正确答案:

  1. T(N)= N + 1
  2. T(N)= N ^ 2 + 2n个
  3. T(N)= N
  4. T(N)= N ^ 3
  5. T(n)= n(n / 2 +1)

1 个答案:

答案 0 :(得分:1)

所以让我们写一些迭代:

i           j
1           0       to n-1
2           1       to n-1
3           1       to n-1
4           2       to n-1
5           2       to n-1
.
.
.
n-2         (n-2)/2 to n-1  
n-1         (n-2)/2 to n-1  
n           n/2     to n-1

现在让我们记住1stnth并计算从end - start + 1i = 2的范围总和(i = n-1)。

S = (n-1 - 1 + 1) + (n-1 - 1 + 1) + (n-1 - 2 + 1) + (n-1 - 2 + 1) + ...  + (n-1 - (n-2)/2 + 1) + (n-1 - (n-2)/2 + 1)

...

S = (n - 1) + (n - 1) + (n - 2) + (n - 2) + ...  + (n - (n-2)/2) + (n - (n-2)/2)

...

S = 2*(n - 1) + 2*(n - 2) + ... + 2*(n - (n - 2)/2)

...

S = 2*((n - 1) + (n - 2) + ... + (n - (n - 2)/2))

...

S = 2*(n*(n-2)/2 - (1 + 2 + 3 + ... + (n - 2)/2 ))

...

最后是算术级数,由公式计算:

N*(A1 + A2)/2

其中:

N = (n - 2)/2,      A1 = 1,      A2 = (n - 2)/2 

所以我们最终得到:

1 + 2 + 3 + ... + (n - 2)/2 =  n*(n - 2)/8

...

S = n^2 - 2*n - 2*(n*(n - 2)/8)

...

S = n^2 - 2*n - n*(n - 2)/4

现在让我们添加我们记住的2个值:

S = n + n/2 + n^2 - 2*n - n*(n - 2)/4

...

S = (4*n + 2*n + 4*n^2 - 8*n)/4 - n*(n - 2)/4

...

S = (4*n + 2*n + 4*n^2 - 8*n - n^2 + 2*n)/4

...

S = (3/4)*n^2

我没有得到上述任何一项。我已经检查并重新检查但找不到错误。