查找以下代码的时间复杂度。 给出的答案是O(log(n)* n ^ 1/2),但我没有得到它。 我希望有人解释一下。
i=n;
while(i>0)
{
k=1;
for(j=1;j<=n;j+=k)
k++;
i=i/2;
}
答案 0 :(得分:6)
采用以下代码段:
k=1;
for(j=1;j<=n;j+=k)
k++;
j
在各种迭代中的值为1, 3, 6, 10, 15, 21, 28, ...
。
请注意,这些数字的结尾格式为(m+1)(m+2)/2
,其中m
是经过的迭代次数。如果我们想知道这个循环将运行多少次迭代,我们需要解决(m+1)(m+2)/2 = n
,它有解m = (sqrt(8n + 1) - 3))/2 = O(sqrt(n))
。所以这个循环将运行O(sqrt(n))
次。
外部循环将运行O(log(n))
次(这很容易看到)。总的来说,我们有O(log(n)sqrt(n))
。
编辑:或者比直接解决(m+1)(m+2)/2 = n
更简单,只需注意(m+1)(m+2)/2 = O(m^2)
,因此O(m^2) = n
暗示m = O(sqrt(n))
。
答案 1 :(得分:1)
复杂性将是: (log n + 1)*( - 1 + squareroot(1 + 4n))/ 2 = O(squareroot(n)* log n)
log n位于基数2。
假设n为36。
外部循环将迭代log n + 1次,因为每次36,18,9,4,2,1时该值减半。
内环有j值= 1,3,6,10,15,21,28,36。每个j值都可以计算为AP 1 + 2 + 3 + 4 + 5中的项之和。 ..w = w(w + 1)/ 2。所以w(w + 1)/ 2 = n。求解这个二次方程得到w =( - 1 + sqrt(1 + 4n))/ 2,即内环的迭代次数。 对于n = 36,w = 8。
因此总复杂度为:log n * sqrt(n)。