此问题之前已被问过几次,但我仍然无法找到这个问题的答案,因为它比其他问题中提供的简单示例更复杂。
我正试图找到一个重要的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;
}
}
答案 0 :(得分:3)
每次调用该函数时,它都会递归s+1
次调用自身,其大小范围n/s
(n
是元素的数量)。
这为您提供了复杂功能:
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)