optimization - 动态规划记忆的时间复杂度
问题描述
在寻找第 n 个斐波那契数的动态编程/记忆解决方案中,我无法理解为什么使用递归的自上而下的方法也是 O(n)。
我理解为什么迭代自下而上的解决方案是 O(n),因为由于下面显示的 for 循环,我可以清楚地看到这一点。
public static int fib(int n){
if(n<3)return 1;
int memo[] = new int[n+1];
memo[1]=1;memo[2]=1;
for (int i = 3; i <=n ; i++) {
memo[i]=memo[i-1]+memo[i-2];
}
return memo[n];
}
但是,当涉及到自上而下的方法时:
public static int fib(int n,int memo[]) {
if (memo[n] != 0) return memo[n];
if (n < 3) return 1;
memo[n - 1] = fib(n - 1, memo);
memo[n - 2] = fib(n - 2, memo);
return memo[n - 1] + memo[n - 2];
}
我很难理解为什么这也是 O(n),我读过这是因为有 n 个状态/子问题并且每个状态都需要 O(1),但我真的不明白为什么这是有道理的。
我也尝试阅读这个类似问题的答案,但我也不明白答案。
解决方案
推荐阅读
- php - 发送邮件提示错误:535 Authentication Failed
- python - flask + marshmallow 架构抱怨“必填字段缺少数据”
- python - FailedPreconditionError Tensorflow 训练
- c# - WPF DataGrid 行的颜色多绑定(也)拥有 IsSelected 属性?
- reactjs - 如何在 Link 和 Route 组件中同时传递 props?
- html - 有人知道为什么 font-weight: bold; 不能在移动设备上工作?
- javascript - 来自另一个模块的 Jest 模拟函数:结果值未定义
- html - 使 objectheader 具有粘性并使页面的其余部分可滚动
- java - Android OpenCV 相机示例只是显示黑屏
- javascript - Chrome 在 html 文档中找不到 Javascript 函数