计算函数的复杂性

时间:2015-02-09 15:50:33

标签: recursion big-o time-complexity

我写了一个函数来计算最长增长序列的长度。这里 arr [] 是长度为n的数组。并且 lisarr 的长度为n,用于存储元素i的长度。

我很难计算递归表达式,它是主定理的输入。

int findLIS(int n){
        if(n==0)
            return 1 ;
        int res;
        for(int i=0;i<n;i++){
            res=findLIS(i);
            if(arr[n]>arr[i] && res+1>lisarr[n])
                lisarr[n]=res+1;
        }
        return lisarr[n];
    }

请给出计算递归关系的方法。 应该是吗? T(n)=O(n)+T(1)

1 个答案:

答案 0 :(得分:2)

O(2^n)。让我们计算确切的迭代次数,并用f(n)表示。递归关系为f(n) = 1 + f(n-1) + f(n-2) + .. + f(1) + f(0),其中f(1)=2f(0)=1f(n)=2*f(n-1),最后为f(n)=2^n

通过归纳证明:

基数n = 0 - >只有一次函数的迭代。 我们假设f(n)=2^n。然后,对于输入n+1,我们有f(n+1) = 1 + f(n) + f(n-1) + .. + f(1) + f(0) = 1 + (2^n + 2^(n-1) + .. + 2 + 1) = 1 + (2^(n+1) - 1)=2^(n+1).。开头的第一个来自for循环之外的部分,总和是for循环的结果 - 你总是对i中的{0,1,2,..,n}进行一次递归调用1}}。