algorithm - 具有多个分支的递归函数的时间复杂度

标签 algorithm recursion big-o time-complexity

根据这个post ,我们知道如何确定递归函数的复杂度。

但是,对于下面的代码,

const int N = 100, W = 100000;
int p[N][W + 1];  // the values of element in the array p are 0, 1, 2. 
int output[N];  

void find_path(int n, int w, int k) {
    if (n < 0) {
        for (int i=0; i<k; ++i) cout << output[i];
        return;
    }

    if (p[n][w] == 0) {
        find_path(n-1, w, k);  // the 1st branch
    }
    else if (p[n][w] == 1) {
        output[k] = n;
        find_path(n-1, w-weight[n], k+1); // the 2nd branch
    }
    else if (p[n][w] == 2) {
        output[k] = n;                    // the 3rd branch
        find_path(n-1, w-weight[n], k+1);
        find_path(n-1, w, k);
    }
}

这是我的分析:

T(n) = T(n-1) + a   // the 1st branch
       T(n-1) + b   // the 2nd branch
       2*T(n-1) + c // the 3rd branch

乍一看,第 3 个分支比其他两个分支花费的时间更多,我可以忽略第 1 个和第 2 个分支吗?,所以复杂度可以是 T(n) =2*T(n-1),结果是O(2^n)我说得对吗?

此外,如果在第 2 个分支中还有一个 find_path 调用怎么办

    else if (p[n][w] == 1) {
        output[k] = n;
        find_path(n-1, w-weight[n], k+1); // the 2nd branch
        find_path(n-1, w, k+1);
    }

如何计算这种情况下的时间复杂度?

最佳答案

是的,你应该取它们的最大值(对于最坏的情况),它对应于第三个分支。因此,您可以忽略第一个和第二个分支。然后,重复是T(n)<=2T(n-1)+O(1) ,所以 T(n)=O(2^n) .

出于同样的原因,您可以“免费”将新调用添加到第二个分支。

关于algorithm - 具有多个分支的递归函数的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33490598/

相关文章:

sql - 在数百万行的字符串中搜索任何单词

c - 求一个平面上的 4 个点是否构成一个矩形?

javascript - 循环遍历一个递归数组

c - 该算法(Big-O)的时间复杂度是多少?

javascript - JS : can a hash map be used to keep track while iterating this array?

algorithm - Solr 文档标记

C++填充一维数组表示基于直线段的n维对象

java - 递归与迭代(斐波那契数列)

algorithm - Round Robin (RR) 和 Weighted (WRR) 的 Big-O

algorithm - O(n log n) 算法是否总是优于所有 O(n^2) 算法?