总和等于给定数n的最小平方数的时间复杂度

时间:2019-08-22 11:57:04

标签: time-complexity

此代码的确切时间复杂度是多少?

我知道它的指数,但是什么样的指数像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)。

这个答案正确吗?

1 个答案:

答案 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 )。我确信有一些巧妙的方法可以更好地绑定,但是这个函数看起来像是指数函数。