时间复杂度
算法中的执行指令大概需要的时间
示例:
指令 2+3n
public static void test1(int n) {
// 汇编指令
// 1
if (n > 10) {
System.out.println("n > 10");
} else if (n > 5) { // 2
System.out.println("n > 5");
} else {
System.out.println("n <= 5");
}
// 1 + n + n + n
//1+3n
for (int i = 0; i < n; i++) {
System.out.println("test");
}
}
1+3n+3n^2
/**
* 1 +2n+n*(1+3n)
* 1+2n+n+3n^2
* 1+3n+3n^2
*/
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println("test");
}
}
log2n
//指令 log2(n)
public static void test5(int n) {
/**
8 4 2 1
传8进来,最终只会执行3次。
log2(8)=3
log2(n)
*/
while ((n = n / 2) > 0) {
System.out.println("test");
}
}
递归
// O(2^n)
//0.5* 2^n^ -1
public static int fib1(int n) {
if (n <= 1) return n;
return fib1(n - 1) + fib1(n - 2);
}
5 15
1 2 4 6 8
20 + 21 + 22 + 23 =15
24-1
2n-1 -1
0.5* 2n -1
空间复杂度
大O表示法
1.忽略常数
2.取高价,忽略低价
指令 | 大O表示法 |
---|---|
2+3n | O (n) |
1+3n+3n^2 | O(n2) |
log2n | O( logn) |
0.5* 2n -1 | O(2n) |
画函数图的好网站
(白天可以访问,晚上大约10点后就不行了)
通过函数图的趋势来区分算法的好坏。
由下图可以看出:
** O( logn) > O (n) > O(n2) > O(2n)**