下面的递归代码片段的时间和空间复杂性是什么?

时间:2018-05-28 11:49:51

标签: algorithm performance memory-management time-complexity asymptotic-complexity

下面是一个递归函数来计算二项式Cofecient'C'的值,即组合!我希望用N和K来理解这段代码的时间和空间复杂度(假设我们正在计算NCK)。

public class ValueOfBinomialCofecientC {

static int globalhitsToThisMethod = 0;

    public static void main(String[] args) {
        // Calculate nCk. 
        int n = 61, k = 55;
        long beginTime = System.nanoTime();
        int ans = calculateCombinationVal(n, k);
        long endTime = System.nanoTime() - beginTime;

        System.out.println("Hits Made are : " +globalhitsToThisMethod + " -- Result Is : " + ans + " ANd Time taken is:" + (endTime-beginTime));
    }

    private static int calculateCombinationVal(int n, int k) {
        globalhitsToThisMethod++;
        if(k == 0 || k == n){
            return 1;
        } else if(k == 1){
            return n;
        } else {
            int res = calculateCombinationVal(n-1, k-1) + calculateCombinationVal(n-1, k);
            return res;
        }
    }

}

1 个答案:

答案 0 :(得分:0)

非常有趣的是,运行时是nCk。递归地表示为:

f(n,k) = f(n-1,k-1) + f(n-1,k)

使用组合公式nCk = n!/(k! * (n-k)!)表示每一项。如果我尝试写下每一个步骤,这将使答案肿,但是一旦您将表达式代入,就将整个方程式乘以(n-k)! * k!/(n-1)!。一切都应该取消,以给您n = k + n - k

可能有更通用的方法来求解多变量递归方程,但是如果您写出直到n=5k=5的前几个值,这种方法就非常明显。