一、空间复杂度
通过读程序的方式来判断
1.1 常见的8种时间复杂度
- O(1):常数复杂度
- O(logn):对数复杂度
- O(n):线性时间复杂度
- O (nlogn):线性对数阶
- O(n^2):平方
- O(n^3):立方
- O(2^n):指数
- O(n!):阶乘
1.2 常见时间复杂度分析
O(logn)
for (int i = 1; i < n; i = i*2) {
System.out.println(i);
}
O(n!)
int fib(int n) {
if (n < 2) return n;
return fib(n-1) + fib(n-2);
}
1.3 时间复杂度曲线
- 养成习惯,写完之后分析这段程序的时间复杂度和空间复杂度
- 用最简洁的时间、空间复杂度来实现
1.4 举例
计算:1+2+3+...+n
方法一:从1到n和循环累加
y = 0;
for i = 1 to n:
y+=i
方法二:求和公式sum = n(n+1)/2
y = n * (n+1)/2
不同程序方法,结果一样,复杂度很不一样。面对一个问题的时候,1确认无误,2想所有可能解决办法,3比较方法的空间、时间复杂度,并找出最优的,4实现
1.5 更复杂的情况:递归
关心执行了多少次,把递归执行顺序画出树形结果,称之为递归树或状态树
f(n) = f(n-1) + f(n-2)
1.6 主定理,计算递归函数的时间复杂度
- 二分查找,在有序的数列中找到目标数,每次都一分为二,只查一边
- 二叉树遍历,每次一分为二,每一边是相等的时间复杂度这么下去,每个节点访问且仅访问一次
- 排好序的二维矩阵中进行二分查找,
- 归并排序,nlog(n)
1.7 思考题
- 二叉树遍历 - 前序、中序、后序:时间复杂度是多少
- 图上的遍历:时间复杂度是多少
- 搜索算法:DFS、BFS时间复杂度是多少
- 二分查找:时间复杂度是多少
O(n)、O(n)、O(n)、O(logn)
二、空间复杂度
2.1 两条原则
- 数组长度
- 递归的深度(特殊说明)