时间复杂度的数学证明方法相对比较复杂,通常在工程实际中,会分析就好。
算法学习:反复模仿,不懂先放过,之后回头看,把经典算法牢记于心
Big O notation
注意: 只看最高复杂度的运算
常数时间复杂度
int n = 100;
System.out.println(“your input is:” + n);
对数时间复杂度
for(int i = 1; i < n; i = i * 2){
System.out.println(“your input is:” + i);
}
线性时间复杂度
for(int i = 0; i < n; i++){
System.out.println(“print:” + i);
}
平方, 2层循环嵌套
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
System.out.println(“print:” + i + "," + j);
}
}
立方, 3层循环嵌套
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < n; k++){
System.out.println(“print:” + i + "," + "j" + "," + k);
}
}
}
指数级时间复杂度,递归
int fib(int n){
if(n < 2) return n;
return fib(n - 1) + fib(n- 2);
}
递归如何分析时间复杂度?
答: 推荐画出 递归树
阶乘
常数系数可以忽略,在分析时不用考虑,只要说以上术语即可。
主定理 Master Throrem
上述第四种是 归并排序,所有排序算法,最优的办法是
思考题,计算时间复杂度
二叉树的遍历 -前序、中序、后序 ?
图的遍历?
搜索算法,DFS、BFS?
二分法?
面试编程四件套:
- 与面试官 反复沟通,搞清题目意思
- 想 所有可能的解决办法,并比较这些算法的时间和空间复杂度
- 找出 最优方案,优先选取 时间复杂度最优 的方法,时间复杂度也优的更好
- 开始写代码,测试程序
空间复杂度
- 数组的长度,就看数组开的长度
- 递归的深度,递归的最大深度,看一个例子: LeetCode官方题解-爬楼梯
Reference:
如何理解算法时间复杂度的表示法,例如 O(n²)、O(n)、O(1)、O(nlogn) 等?