我刚开始学习算法,
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))我无法理解为什么。请解释一下。
答案 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)。