以下代码的复杂性是什么?

时间:2013-11-12 05:45:58

标签: c performance algorithm time-complexity

查找以下代码的时间复杂度。 给出的答案是O(log(n)* n ^ 1/2),但我没有得到它。 我希望有人解释一下。

i=n;
while(i>0)
{
  k=1;
  for(j=1;j<=n;j+=k)
    k++;
  i=i/2;
}

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)。