如何确定此代码的时间复杂度?

时间:2017-02-09 15:55:45

标签: c++ algorithm time-complexity

我刚开始学习算法,

int findMinPath(vector<vector<int> > &V, int r, int c){
    int R = V.size();
    int C = V[0].size();
    if (r >= R || c >= C) return 100000000; // Infinity
    if (r == R - 1 && c == C - 1) return 0;
    return V[r][c] + min(findMinPath(V, r + 1, c), findMinPath(V, r, c + 1));
}

我认为答案应该是O(R C),但正确的答案是O(2 ^(R C))我无法理解为什么。请解释一下。

2 个答案:

答案 0 :(得分:3)

最糟糕的情况是,findMinPath在此行中调用自己两次

return V[r][c] + min(findMinPath(V, r + 1, c), findMinPath(V, r, c + 1));

因此,最坏的情况是,每次调用都会涉及两次进一步的调用,直到递归结束。因此,两个权力。

答案 1 :(得分:2)

当你有多个递归调用时,一个很好的近似值就是“树”高度增加的分支(调用)数。

在您的情况下,您有两个分支:

findMinPath(V, r+1, c) 
findMinPath(V, r, c+1)

所以我们从2的基础开始。

然后“树”的高度(或深度)取决于向量中有多少元素;在你的情况下,你有R元素,但每个元素都有C元素。所以我们的力量就是RC。

因此,在最坏的情况下,您的运行时将近似为O(2 ^ RC)。