确定函数的复杂性(Big O表示法)

时间:2015-11-11 18:08:05

标签: c++ recursion big-o

我在期中遇到了这个问题而且我不确定我的答案,这是O(n ^ 2)我想要答案和解释,谢谢。

int recursiveFun1(int n)
{  for(i=0;i<n;i+=1) 
      do something;                                                                 
    if (n <= 0)
    return 1;
else
    return 1 + recursiveFun1(n-1);}

2 个答案:

答案 0 :(得分:3)

首先,我将您的代码用另一个缩进

int recursiveFun1(int n)
{  
  for(i=0;i<n;i+=1) // this is bounded by O(n)
    do something; // I assume this part is O(1)

  if (n <= 0)
    return 1;
  else
    return 1 + recursiveFun1(n-1);
}

首先要说的是,每次recursiveFun1()被称为O(n)都需要付费for。虽然每次通话时n都会减少,但时间仍受O(n)限制。

第二件事是计算recursiveFun1()被调用的次数。显然(对我来说)它将被称为n + 1次,直到参数n达到零值。

所以时间n + (n-1) + (n - 2) + ... + 1 + 0((n+1)n)/2 O(n^2)

答案 1 :(得分:2)

SELECT tmp.type, tmp.token ...表示此递归函数对输入Field的执行时间。然后,如果R(n)大于0,则执行以下操作:

  • nn - 假设“某事”具有不断的运行时间,则会消耗n时间
  • 各种检查和簿记工作 - 恒定时间do something
  • 计算输入c1*n - 一次。运行时间为c2(根据定义)

所以

n-1

此等式有一个解决方案,即R(n-1)。你可以通过归纳证明它,或者只是通过猜测R(n) = c1*n + c2 + R(n-1) 形式的解决方案来证明它。

注意:我认为“做某事”有持续的运行时间。这看似合理。但是,如果它不是真的(例如它包含一个递归调用),那么你的复杂性会更大 - 可能会更大,这取决于“某事”的作用。