复杂度的总结概要
最近复习算法,先总结一下最基本的时间复杂度概念和判断方法。
常用七种
不考虑常数系数。
判断: 代码根据n的情况运行的次数
O(1)
var n = 1000;
console.log('输出一次:'+ n )
console.log('输出二次:'+ n )
console.log('输出三次:'+ n )
不关心常数系数,无论输出多少次,复杂度都是O(1)
O(n)
var n = 5;
for (var i = 1; i <= n ; i++){
console.log('第一次循环输出:' + i)
}
随着n的变化执行次数与n成线性关系
另外,两次for循环是并列执行,时间复杂度还是O(n)
O(n^2)
var n = 5;
for (var i = 1; i <= n ; i++){
for (var j = 1; j <= n ; j++){
console.log('第一次循环输出:' + i + '第二次循环输出:' + j )
}
}
二次循环嵌套时间复杂度变为O(n^2)
O(log(n))
var n = 4;
for (var i = 1; i <= n ; i=i*2){
console.log('我的输出:' + i)
}
如果n为4,i 执行2次 ,函数体执行次数为 log2(n),所以其时间复杂度为O(log(n))
O(k^n)
var fib=function(n){
if(n<2){
return n;
}
else{
return fib(n-1)+fib(n-2);
}
}
console.log(fib(5));
递归求斐波那契数列,指数级的时间复杂度;画树求解。
递归函数的时间复杂度计算原理: 主定理;
常见四种算法的时间复杂度:
(有序数组)二分查找:O(log(n))
二叉树遍历: O(n) 每次一分为二,每边以相等的时间复杂度计算, 每个节点只访问一次
有序矩阵)二分查找:O(n)
归并排序(所有排序中最优的时间复杂度):O(nlogn)
降低时间、空间复杂度,节约计算机资源
例:计算: 1+2+3+…+100
方法一:for循环累加 O(n)
var sum = 0;
for (var i = 0; i <= 100 ; i++){
sum += i;
}
方法二: 公式法 求和公式 sum=n(n+1)/2 O(1)
常见面试总结
二叉树遍历- 前序、中序、后序:O(n) n表示二叉树的树的节点总数。遍历二叉树,每个节点都会被访问,且只被访问一次。
图的遍历: O(n) 每个节点访问一次
搜索算法:DFS深度优先、BFS广度优先的时间复杂度: O(n) 只访问一次节点,n为搜索空间节点总数
空间复杂度
1.数组的长度:空间复杂度。 一维数组O(n);二维数组O(n^2)
2.递归的深度
3.两者结合,取最大值