##数据结构与算法 01-复杂度分析
大O表示法
1.一般用大O表示法来描述复杂度,它表示的是数据规模n对应的复杂度
- 忽略常数、系数、低阶
- 999 ----> O(1)
- 666n + 1999 —> O(n)
- 99n^2 + 21n + 888 —>O(n^2)
- 88n^3 + 77n^2 + 66n + 55 --> O(n^3)
1.1 对test1算法复杂度进行分析
public static void test1(int n) {
if (n > 10) {
System.out.println("n > 10");
} else if (n > 5) {
System.out.println("n > 5");
} else {
System.out.println("else");
}
//被执行1次
//int i = 0; 被执行1次
//i < 4; 被执行4次
// i++ 被执行4次
//System.out.println("test"); 被执行次数为4
for (int i = 0; i < 4; i++) {
System.out.println("test");
}
//总共被执行 1 + 1 + 4 + 4 + 4 == 14次
//所以该方法的复杂度为O(1)
}
1.2 对test2算法复杂度进行分析
public static void test2(int n) {
//int i = 0; 被执行次数为1
//i < n; 被执行次数为n
//i++ 被执行次数为n
//System.out.println("test2"); 被执行次数为n
for (int i = 0; i < n; i++) {
System.out.println("test2");
}
//总共被执行次数为 1 + n + n + n == 1 + 3n
//所以该方法的复杂度为O(n)
}
1.3 对test3算法复杂度进行分析
public static void test3(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println("test3");
}
}
//int i = 0; 被执行次数为1
//i < n; 被执行次数为 n
// i++ 被执行次数为n
//for (int j = 0; j < n; j++) {
// System.out.println("test3");
//} 被执行次数为n
//int j = 0; 被执行次数为1
//j < n; 被执行次数为n
//j++ 被执行次数为n
//System.out.println("test3"); 被执行次数为n
//则第一层嵌套内:总共被执行次数为
// n * (1 + n + n + n)
//那么总共被执行次数为
//1 + n +n + n*(3n + 1)
//即: 3n^2 + 3n + 1
//那么复杂度为 O(n^2)
}
1.4 对test4算法复杂度进行分析
public static void test4(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < 15; j++) {
System.out.println("test5");
}
}
//总共被执行次数
//1 + n + n + n*(1 + 15 + 15 + 15)
//1 + 48*n
//复杂度为O(n)
}
1.5 对test5算法复杂度进行分析
public static void test5(int n) {
// 被执行次数
// 当n = 8 2^3 = 8 执行3次
// 当n = 16 2^4 = 16 执行4次
// 所以执行 log2(n) 次
// 因为在数学中 log2(n) = log2(N) * logN(n)
// 所以 所有执行logN(n) 次的 复杂度 为 O(logn)
while ((n = n / 2) > 0) {
System.out.println("test5" + n);
}
}
1.6 对test6算法复杂度进行分析
public static void test6(int n) {
// 通过test5() 同理可得
// 复杂度为O(logn)
while ((n = n / 5) > 0) {
System.out.println("test6");
}
}
1.7 对test7算法复杂度进行分析
public static void test7(int n) {
// 被执行次数: 1 + n
// i += i ==》 i = i * 2 即 i = i / 2 执行次数为 log2(n)
// 内层被执行次数 也是log2(n)
//内部被执行 1 + 3n 次
//总共被执行次数 1 + n + log2(n) + log2(n) * (1 + 3n)
//即等于 1 + n + 2log2(n) + 3nlog2(n)
// 1 + n + (3n+2)log2(n)
//所以复杂度为O(nlogn)
for (int i = 0; i < n; i += i) {
for (int j = 0; j < n; j++) {
System.out.println("test7");
}
}
}