时间复杂度判断
对于两层for循环判断 时间复杂度为 O(n)
public static void test01(int n){
//1 + 2n + n*(1 + 45)
//式中 2n 表示的第一个for中 i < n 及 i++部分.
//对于n*(1+45),前面的n表示第一个for循环中的整体代码,(1 + 45)表示第二个循环体
//1 + 2n + 46n
//48n + 1
for(int i = 0; i < n; i++){
for(int j = 0;j < 15; j++){
System.out.println("test");
}
}
}
log2 (n) 案例
public static void test02(int n){
//8 = 2^3,即求出2的指数
// 若n = 16 ,即 4 = log2(16) , 即执行4次
//4
//2
//1
//0
while((n = n / 2) > 0){
System.out.println("test");
}
}
log5(n)案例
// 执行次数 = log5(n)
public static void test02(int n){
while((n = n / 5) > 0){
System.out.println("test");
}
}
对于for循环中,第三个参数为 i += i 的情况
public static voi、d test07(int n){
//时间总复杂度为:1 + 2*log2(n) + log2(n) * (1 + 3n)
// n = 1 * 2 * 2 * 2.....
//即 外层时间复杂度 log2(n)
for(int i = 1; i < n;i += i){ //等价于 i = i + i 或 i = i * 2
// 1 + 3n 里面的执行次数
for(int j = 0; j < n; j++){
System.out.println("test")
}
}
}
大O表示法 (Big O)
- 一般用大 O 表示法来描述复杂度,它表示的数据规模n 对应的复杂度
- 忽略常数,系数,低阶
- 9 >> O(1)
- 2n + 3 >> O(n)
- n 2 n^2 n2 + 2n + 6 >>O( n 2 n^2 n2)
- 对数阶一般省略底数
l o g 2 log_2 log2n = l o g 2 log_2 log2 9 * l o g 9 log_9 log9 n
所以 l o g 2 log_2 log2n, l o g 9 log_9 log9 n统称为 l o g n logn logn
常见的时间复杂度
- 关系
O(1) < O(logn) < O(n) < O(nlogn) < O( n 2 n^2 n2) < O( n 3 n^3 n3) < O( 2 n 2^n 2n) < O(n!) < O( n n n^n nn) - 关系图
空间复杂度
public static void test(int n){
//这里的空间复杂度只与 n 有关,即第四行代码
int a = 10;
int b = 20;
int c = a + b;
int[] array = new int[n];
for(int i = 0; i < array.length; i++){
System.out.println(array[i] + c);
}
}
比较 斐波那契数列 两种方法的时间复杂度
//时间复杂度为:O(2^n),可以通过下图分析可知
public static int fib1(int n){
if ( n <= 1) return n;
return fib1(n - 1) + fib1(n - 2);
}
//时间复杂度为:O(n)
private static int fib2(int n) {
if ( n <= 1) return n;
int first = 0;
int second = 1;
int sum = 0;
for (int i = 0; i < n - 1; i++) {
sum = first + second;
first = second;
second = sum;
}
return sum;
}