javascript - 这个斐波那契实现的时间复杂度是多少?
问题描述
只是想知道是否有人可以解释这段代码背后的时间复杂度。谢谢!
function fib(N) {
var arr = [0, 1, 1];
for (i = 3; i <= N; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[N];
}
解决方案
我们可以将代码拆分成几个部分,逐个分析。
var arr = [0, 1, 1];
这部分有O(1)
,因为它甚至不依赖于 a N
。
for (i = 3; i <= N; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
数组中的数字越多,从中获取两个元素所需的时间就越多,但是差异如此之小,以至于我们可以近似地将执行时间arr[i] = arr[i - 1] + arr[i - 2];
视为常数。所以我们必须执行这段代码的次数是N
. 这部分的时间复杂度是如此O(n)
。
return arr[N];
arr[3]
再次执行or之间的差异arr[10000000]
可以忽略不计,因此每次的时间复杂度都是相同的O(1)
。
这段代码的整体时间复杂度是部分复杂度中最大的部分,所以它是O(n)
.
推荐阅读
- robotframework - Robot Framework:为某个库设置日志记录级别
- python-3.x - 使用循环和函数创建多个数据框
- laravel - 从控制器到文件的 Laravel 路径
- javascript - jspdf中的要点
- svg - 为什么这个 svg 不填满屏幕?
- swift - 从结果成功值回退到错误的 Swift 表达式
- java - java.lang.IllegalStateException:缺少“-javaagent”JVM 参数。确保使用附加到 JVM 的 Quasar java 代理运行测试
- c - 使用命令行参数时出现分段错误错误,C 程序
- mono - 如何获取服务器端事件 Flux 中的记录总数
- delphi - 如何防止 Chromium 写入控制台?