以下代码部分的时间复杂度T(n)是多少?为简单起见,您可以假设n是2的幂,即n = 2 ^ k。对于某些正整数k。
for(i=1;;I<=n;i++)
for(j=n/2;j<n;j++)
print x;
选择正确答案:
答案 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
现在让我们记住1st
和nth
并计算从end - start + 1
到i = 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
我没有得到上述任何一项。我已经检查并重新检查但找不到错误。