如何判断程序的复杂程度:时间和空间复杂度
1. 时间复杂度:
使用大O表示法来表示程序的时间复杂度
常见的7种时间复杂度(复杂度由低到高排序)
O(1):常数时间复杂度 O(log(n):
对数时间复杂度
O(1):常数复杂度
int n = 1;
System.out.println(n);
O(n): 线性时间复杂度
for (int j = 0; j < n; j++) {
System.out.println(j);
}
O(n^2):平方时间复杂度
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println(i + j);
}
}
O(n^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(i + j);
}
}
}
O(k^n):指数时间复杂度,k表示常数
/**
* 递归求斐波那契数列的第n项;可以通过画运行树的方式获得时间复杂度
*/
int fib(int n) {
if (n < 2) return n;
return fib(n - 1) + fib(n - 2);
}
O(n!):阶乘时间复杂度
算法 | 递回关系式 | 运算时间 |
---|---|---|
二分搜寻算法 | ||
二叉树遍历 | ||
最佳排序矩阵搜索(已排好序的二维矩阵) | ||
合并排序 |
所有排序的最优算法都是O(nlog(n))
如何判断一段代码的空间复杂度
主要通过两部分进行判断:
数组的长度 如果代码中应用了数组,那么数组的长度,基本上就是空间复杂度; e:一维数组的空间复杂度是O(n);二维数组的空间复杂度是O(n^2) 递归的深度 如果代码中有递归,那么递归的深度,就是代码的空间复杂度的最大值
ps:如果代码中既有数组,又有递归,那么两者的最大值就是代码的空间复杂度
leecode有个爬楼梯的复杂度分析情况;可以进行练习
3. 数组和链表的时间复杂度分析
数组
随机增加:O(n) 随机查询:O(1) 随机删除:O(n)
链表
随机增加:O(1)
随机查询:O(n)
随机删除:O(1)