JS经典斐波那契挑战两种解法的运行速度差异疑问
问题解答
1 JavaScript数组length属性的读取规则
JavaScript中数组的length是引擎自动维护的预存属性,不需要遍历整个数组统计元素数量,读取操作的时间复杂度为O(1)。
所有数组元素增删操作(如push、pop、splice等)执行时,JS引擎会自动同步更新length的存储值,直接读取时拿到的就是已经计算完成的结果,没有额外计算开销。
2 解法A与解法B的性能对比
两种解法的时间复杂度均为O(n),实际运行速度差异极小,常规场景下完全无法感知:
- 你担心的解法B中
fibArr.push(fibArr[fibArr.length - 1] + fibArr[fibArr.length - 2])这行代码没有额外性能损耗,length读取的效率和解法A中直接用索引fiboArray[i-1]读取的效率基本一致。 - 解法B开头多了3次边界判断,当输入n≤2时会直接返回结果,反而比解法A少执行循环,速度更快。
- 当输入n远大于2时,解法A因为不需要在循环内读取
length属性(虽然开销极低),也没有前置的分支判断开销,运行速度会有极微小的优势,但这个差异在绝大多数使用场景下都可以忽略。
解法A代码
function fib(n) { const fiboArray = [0,1] for(let i=2; i <= n; i++) { fiboArray.push(fiboArray[i-2] + fiboArray[i-1]) } return fiboArray[n] } console.log(fib(5))
解法B代码
function fib(n) { const fibArr = [0, 1, 1] if(n == 0) { return 0 } if(n == 1 || n == 2) { return 1 } if (n > 2) { for (let i = 3; i <= n; i++) { fibArr.push(fibArr[fibArr.length - 1] + fibArr[fibArr.length - 2]) } } return fibArr[fibArr.length - 1] } console.log(fib(9))
内容的提问来源于stack exchange,提问作者claudiopb
相关产品推荐
相关产品推荐

