根据这个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)
,我是对的吗?
此外,如果第二个分支中还有一个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);
}
如何在这种情况下计算时间复杂度?
答案 0 :(得分:1)
是的,您应该采取最大值(对于最坏的情况),这对应于第三个分支。因此,您可以忽略第1和第2分支。然后,重复是T(n)<=2T(n-1)+O(1)
,因此T(n)=O(2^n)
。
出于同样的原因,您可以将新呼叫添加到第二个分支&#34;免费&#34;。