时间复杂度
T(n) = O(f(n))
它表示随问题规模n的增大,算法的时间增长率和f(n)的增长率相同,称为算法的时间渐进复杂度。其中f(n)是问题规模n的某个函数。
一般来说,随着n的增长,T(n)增长最慢的算法为最优算法
要在 hash 表中找到一个元素是 O(1)
要在无序数组中找到一个元素是 O(n)
访问数组的第 n 个元素是 O(1)
访问链表的第 n 个元素是 O(n)
把输入规模看成x轴,所花时间/空间看成y轴。
O(n) 就是 y = x, y随x的增长而线性增长。一条斜线
O(1) 就是 y = 1,不管x如何变,y不变。一条与x平行的线
1. 常数阶 O(1) 平行于x轴的线
var a = 1; //执行一次
var b = 1; //执行一次
var c = a + b; //执行一次
2. 线性阶 O(n) 一条斜线
3. 对数阶 O(logn) 一渐近线
var count = 1;
while(count < n){
count = count * 2;
}
表示count乘以一次2就距离n更近一些,那么乘以多少次2才能大于n退出循环就是2^x = n推出x = log2n
4. 平方阶 O(n^2)
一条U形的抛物线,随着问题规模n的增大,执行效率也会极大的下降
如下,对于外层循环来说执行了n次,为O(n),内层循环又执行了n次,共执行了n*n次,所以为n^2,即O(n^2)
var i, j;
for (i = 0; i < n; i++) {
for(j = 0; j < n; j++){
/* 时间复杂度为O(1)的内容 */
}
}
若将外循环的n改为m那么它的复杂度为O(m * n)
var i, j;
for (i = 0; i < m; i++) {
for(j = 0; j < n; j++){
/* 时间复杂度为O(1)的内容 */
}
}
常见时间复杂度
时间复杂度的效率
空间复杂度
S(n)=O(f(n))
我们在判断闰年的时候可以通过各种算法来计算某一年是否是闰年,当然也可以事先算好某个范围内的闰年储存到数据库中,当我们判断在进行判断的时候只需到数据库中去查找一下这个数值是否存在即可完成判断。这就是传说中的以空间换时间。