时间复杂度
通过读程序可以分析出来,一般时间复杂度分为七类。
o(1)
常数复杂度
o(2)
、o(3)
、o(4)
、o(5)
…,只要是常数式的复杂度,统称为o(1)
,不管是多少次。
int n=1000;
System.out.println("n="+n);
System.out.println("还是n="+n);
System.out.println("依然是n="+n);
不管n
是多少,这段程序只执行一次,所以时间复杂度是o(1)
。
o(lg(n))
对数复杂度
for(int i=1;i<n;i=i*2){
System.out.println(i);
}
o(n)
线性复杂度
for(int i=1;i<=n;i++){
System.out.println(i);
}
随着n
的变化,程序总是要执行n
次,这种时间复杂度就是o(n)
o(n^2)
平方
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
System.out.println(i+j);
}
}
随着n
的变化,程序总是要执行n^2
次,这种时间复杂度就是o(n^3)
o(n^3)
立方
同上依次类推。
o(k^n)
指数级复杂度
计算斐波拉契数列,通过递归计算是非常慢的,指数级,时间复杂度是 o(2^n)
。
int fib(int n){
if(n<2) return n;
return fib(n-1) + fib(n-2);
}
如果代码改成如下的样子,时间复杂度度就是o(3^n)
。
int fib(int n){
if(n<3) return n;
return fib(n-1) + fib(n-2) + if(n-3);
}
o(n!)
阶乘
待补充
常见算法的时间复杂度
- 二叉树、图的遍历和搜索算法(包括广度优先和深度优先) 时间复杂度都是
o(n)
,这里的n
指的是搜索空间里的节点总数,一个原则就是每个节点只访问一次且仅访问一次 - 二分查找法,时间复杂度是
o(lg(n))
空间复杂度
数组
如果是一维数组,那么空间复杂度就是o(n)
。
如果是二维数组,那么空间复杂度就是o(n^2)
递归
如果有递归的话,那么递归的最大深度就是空间复杂度的最大值。
如果有递归,又有数组,那么空间复杂度就是两者中的最大值。