此代码的确切时间复杂度是多少?
我知道它的指数,但是什么样的指数像2 ^ n,sqrt(n)^ sqrt(n)等。
如果附上证明,那就太好了。
https://www.geeksforgeeks.org/minimum-number-of-squares-whose-sum-equals-to-given-number-n/
class squares {
// Returns count of minimum squares that sum to n
static int getMinSquares(int n)
{
// base cases
if (n <= 3)
return n;
// getMinSquares rest of the table using recursive
// formula
int res = n; // Maximum squares required is
// n (1*1 + 1*1 + ..)
// Go through all smaller numbers
// to recursively find minimum
for (int x = 1; x <= n; x++) {
int temp = x * x;
if (temp > n)
break;
else
res = Math.min(res, 1 + getMinSquares(n - temp));
}
return res;
}
public static void main(String args[])
{
System.out.println(getMinSquares(6));
}
}
在我看来,由于每个for循环都为sqrt(n)次数调用相同的递归,并且每个调用都是(n-x * x))〜n ...
所以应该是n ^ sqrt(n)。
这个答案正确吗?
答案 0 :(得分:0)
该函数的递归关系为
T(n) = sum from i=1 to i=sqrt(n) of T(n - i*i)
以
为界T(n) = sqrt(n) * T(n-1)
,因为上述总和中的每个术语最多为T(n-1)
,其中有sqrt(n)
个。 T(n) = sqrt(n) * T(n-1)
是O( sqrt(n)^n )
。我确信有一些巧妙的方法可以更好地绑定,但是这个函数看起来像是指数函数。