时间、空间复杂度
- 时间维度:是指执行当前算法所消耗的时间。
- 空间维度:是指执行当前算法需要占用多少内存空间。
「时间复杂度」和「空间复杂度」的计算方式
时间复杂度:「大O符号表示法」,即T(n)= O(f(n))。大O符号表示法并不是用来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。
其中f(n)表示每行代码执行次数之和,O表示正比例关系。
常见的时间复杂度量级:
- 常数阶O(1)
- 对数阶O(logN)
- 线性阶O(n)
- 线性对数阶O(nlogN)
- 平方阶O(n2)
- 立方阶O(n3)
- K次方阶O(nk)
- 指数阶O(2n)
从上到下依次的时间复杂度越来越大,执行的效率越来越低。
依次举例说明
- 常数阶O(1)
let i = 0; let j = 0;
上述代码执行的时候,它消耗的时间并不随着某个变量的增长而增长,无论代码有多长,都可以用O(1)来表示它的时间复杂度。
- 线性阶O(n)
for(let i = 0;i < n;i++ ){ console.log(i) }
上述代码执行的时候,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码可以用O(n)来表示它的时间复杂度。
- 对数阶O(logN)
let i = 1 while(i < n){ i *= 2 }
上述代码执行的时候,假设循环x次之后,i大于n,循环退出,也就是说2的x次方等于n,因此这类代码的时间复杂度为O(logN)。
- 线性对数阶O(nlogN)
for(let i = 0;i < j;i++){ let i = 1 while(i < n){ i *= 2 } }
- 平方阶O(n2)
for(let i = 0;i < n;i++){ for(let j = 0;j < n;j++){ console.log(j) } }
for(let i = 0;i < m;i++){ for(let j = 0;j < n;j++){ console.log(j) } }
上述代码的时间复杂度就变成了O(m*n)
空间复杂度:也不是用来计算程序实际占用的空间的。它是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用S(n)来定义。公式:S(n)= O(f(n))
空间复杂度比较常用的有:O(1)、O(n)、O(n²)