以下递归函数的时间复杂度是多少?

时间:2013-10-03 16:16:14

标签: time-complexity

int Do(int n)
{
 if(n<=2)
  return 1;
 else
 return(Do(floor(sqrt(n))+n);
}

我可以将递归关系作为T(square root(n)+n))+1吗? 如果是这样,我该如何继续解决这个问题?

2 个答案:

答案 0 :(得分:1)

在你的问题中,递归不会终止(至少在理论上,这是你可能正在讨论的内容)。原因:n + floor(sqrt(n))大于n

我想你的意思是return Do(floor(sqrt(n))) + n。我继续考虑回答这个问题,但要注意:你必须自己填补一些空白!

我会将关于运行时间的问题分成两部分:

  • 最重要的是:在基本情况下递归多少次?
  • 如何组合所有递归?

递归次数:将n写为2的幂(即n=2^(ld n),其中ld表示基数2的对数)。取n的平方根。 2^(ld n)将指数减半。为了达到基本情况,我们必须将指数减半,直到它小于1。这导致了一个问题:在我们达到ld n之前,我们需要多久将<= 1减半。这个问题的答案大致为ld ld n。也就是说,我们有大致 ld ld n递归,直到基本情况。

现在,我们进行递归并总结:

T(n) = T(2^(ld 2))
     = T(2^((ld 2)/2)) + 1
     = T(2^((ld 2)/4)) + 1 + 1
     = ...
     = T(2^((ld 2)/(2^(ld ld 2)))) + sum(1, i=0...(ld ld 2)-1)
     = 1 + (ld ld 2) - 1

仍需简化总和并调整floor - 部分的详细信息。

答案 1 :(得分:0)

取任意数n和n = 2 ^ k。 n的平方根意味着你指数的一半。因此,只能有O(log k)平方根。

n = 2 ^ k因此k = log n。然后O(log k)变成O(loglogn)......