浅谈for循环里的i++和++i的时间复杂度

620 阅读1分钟

最近看到一篇文章为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不需要