算法的衡量
算法是指可以用来操作数据、解决呈现问题的一组方法,能够对一定规范的输入,在有限的时间内得到所要求的输出结果。不同的算法可能用于不同的时间、空间或效率来完成同样的任务。所以,一个算法的优劣可以从空间和时间两个维度去衡量
算法复杂度
一、时间复杂度
显然,把一个程序运行一遍得出的时间来衡量算法的时间复杂度是不合理的。这种方式会受到很多其他因素的影响,如机器运行的性能高低,测试使用的数据规模大小都是影响因素。所以我们的时间复杂度选择用:大O计数法
for(var i=o;i<n;i++){ //1时间颗粒
i+=1; //由于循环n次 所以计n时间颗粒
i+=j; //n时间颗粒
}
每运行一行代码,我们可以算作1颗粒的时间。上述的代码所消耗的时间是:(1+2n)。即T(n)=O(1+2n)。由于这个算法是随n的增大而增大,常数1和倍数2的意义也不大。我们可以简化为:T(n) = O(n)。
类似于其他的计算方式:
//第一组
const a = 1 //记作O(1)
//第二组
let i = 1;const n = 6;while (i < n) { i = i * 2;}
/*
假设i运行x次后就大于2,此时循环退出x=logN。所以我们计做T(n) = O(logN)。
*/
//第三组
for m in range(n):
i = 1
while i < n:
i = i * 2 //上述的for循环为O(n),上述while循环为O(logN)。故记作T(n) = O(nlogN)
常见的时间复杂度量级有:
- 常数阶O(1)
- 对数阶O(logN)
- 线性阶O(n)
- 线性对数阶O(nlogN)
- 平方阶O(n²)
- 立方阶O(n³)
- K次方阶O(n^k)
- 指数阶(2^n)
二、空间复杂度
同时间复杂度,空间复杂度是对一个算法在运行过程中临时暂用存储空间大小的一个度量,同样反应的内存中量的多少,一个变量或常量可以记作为一个空间大小
i = 1
j = 2
i += 1
j += 1
m = i + j
如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,即可表示为O(1)