【发布时间】:2017-02-09 15:55:44
【问题描述】:
我刚刚开始学习算法,
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(RC) 但正确答案是 O(2^(RC)) 我不明白为什么。请解释一下。
【问题讨论】:
-
它是双重递归的。如果将调用映射为图形,则会得到二叉调用树。不过,该算法对我来说没有意义。
-
嗯。不是 O((C+R) 选择 C),因为代码本质上是枚举从 (0,0) 到 (C,R) 的路径。 ?我认为这是 O(2^(RC)) ,但这是一个非常糟糕的上限。例如,当R=C时,(C+R)选择C约为4^R/sqrt(pi*R),比2^(R^2)增长慢很多。
-
也许问题中有一个错字:O(2^(R+C)) 而不是 O(2^(RC))?搜索树的深度最多为 R+C,因此 2^(R+C) 是复杂度的合理第一近似值。当然是 R+C=O(RC),所以这个问题在理论上也是正确的,但没有多大实际意义(至少对我来说)。
-
@Cheersandhth.-Alf 该算法是有意义的——它找到了从 (0,0) 到 (R,C) 的最低成本路径,其中所有步骤都正确或向上。当然,这不是编写代码的最佳方式,但我认为这是开始的“糟糕”算法,将通过动态编程加以改进。
-
哦,
V[0].size()让我失望了。但显然它是一个表示为向量向量的矩阵,而不是一般的锯齿状数组。所以,列和行。嗯。好的。
标签: c++ algorithm time-complexity