最近看到一篇文章为JavaScript 数据结构与算法之美 - 时间和空间复杂度,链接如下: github.com/biaochenxuy…
文章中讲到for循环的复杂作者有个疑问
case 1:
function bFun(n) {
for(let i = 0; i < n; i++) { // 需要执行 (n + 1) 次
console.log("Hello, World!"); // 需要执行 n 次
}
return 0; // 需要执行 1 次
}
那么这个方法需要执行 ( n + 1 + n + 1 ) = 2n +2 次运算。
case 2:
function cal(n) {
let sum = 0; // 1 次
let i = 1; // 1 次
let j = 1; // 1 次
for (; i <= n; ++i) { // n 次
j = 1; // n 次
for (; j <= n; ++j) { // n * n ,也即是 n平方次
sum = sum + i * j; // n * n ,也即是 n平方次
}
}
}
注意,这里是二层 for 循环,所以第二层执行的是 n * n = n2 次,而且这里的循环是 ++i,和例子 2 的是 i++,是不同的,是先加与后加的区别。
那么这个方法需要执行 ( n2 + n2 + n + n + 1 + 1 +1 ) = 2n2 +2n + 3
作者的疑问是:case1的for循环和case2的循环,循环体执行的次数都是相同的,为什么i++的for循环比++i的for循环多执行一次;
解答:原因是i++时候后默认定义一个中间变量tmp = i + 1;用来暂时存储i的值,而++i不需要