Big-O表示递归函数

时间:2014-06-19 06:05:19

标签: algorithm recursion big-o

此问题之前已被问过几次,但我仍然无法找到这个问题的答案,因为它比其他问题中提供的简单示例更复杂。

我正试图找到一个重要的O符号:

float foo(int start, int end, int s)
{
  if (start == end) {
    return start*start;
  } else {
    int iSegment = (end - start + 1) / s;
    int iCurrResult = 0;
    for (int i=0; i<=s; i++)
      iCurrResult += foo (start + i*iSegment, start + (i+1) * iSegment - 1, s);
    return iCurrResult*iCurrResult;
  }
}

1 个答案:

答案 0 :(得分:3)

每次调用该函数时,它都会递归s+1次调用自身,其大小范围n/sn是元素的数量)。

这为您提供了复杂功能:

T(n)=(s + 1)T(n / s)+ 1

根据Wolphram Alpha,此功能位于O((s+1)^(logn/logs)) = O((s+1)^log(n-s))

注意,这是Omega(n),因为n=s^log_s(n)=s^log(n)/log(s),很容易看到此函数严格(渐近)大于s^(logn/logs)