01-复杂度(complexity)
什么是算法?
算法是用于解决特定问题的一系列的执行步骤。
如何判断一个算法的好坏?
正确性、可读性、健壮性(对不合理输入的反应能力和处理能力)
时间复杂度(time complexity):估算程序指令的执行次数(执行时间)
空间复杂度(space complexity):估算所需占用的存储空间
大 O 表示法(Big O)
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
O(1)
public void o1(int n) {
// 时间复杂度
// 执行次数 = 1 + 6 + 6 + 6 = 1 + 18 = 19
// 大 O 表示法:O(1)
for (int i = 0; i < 6; i++) {
System.out.println("i = " + i);
}
// 空间复杂度:O(1)
}
O(logn)
public void log2n(int n) {
// 8 = 2^3 3 = log2(8)
// 16 = 2^4 4 = log2(16)
// 执行次数 = log2(n)
// 大 O 表示法:O(logn)
while ((n = n / 2) > 0) {
System.out.println("n = " + n);
}
}
O(n)
public void n(int n) {
// 执行次数 = 1 + n + n + n = 1 + 3n = 3n + 1
// 大 O 表示法:O(n)
for (int i = 0; i < n; i++) {
System.out.println("i = " + i);
}
// 空间复杂度:O(1)
}
O(n + k)
多个数据规模的情况
// O(n + k)
public void nk(int n, int k) {
for (int i = 0; i < n; i++) {
System.out.println("i = " + i);
}
for (int i = 0; i < k; i++) {
System.out.println("i = " + i);
}
}
O(nlogn)
public void nlog2n(int n) {
// 外层 for 循环执行次数 = 1 + 2log2(n) + log2(n) * (内层 for 循环执行次数)
// = 1 + 2log2(n) + log2(n) * (3n + 1) = 3nlog2(n) + 3log2(n) + 1
// 大 O 表示法:O(nlogn)
// i += i 等价于 i = i + i 等价于 i = i * 2
for (int i = 1; i < n; i += i) {
// 内层 for 循环执行次数 = 1 + n + n + n = 3n + 1
for (int j = 0; j < n; j++) {
System.out.println("j = " + j);
}
}
// 空间复杂度:O(1)
}
O(n^2)
public void n2(int n) {
// 外层 for 循环执行次数 = 1 + n + n + n * (内层 for 循环的执行次数)
// = 1 + 2n + n * (3n + 1) = 3n^2 + 3n + 1
// 大 O 表示法:O(n^2)
for (int i = 0; i < n; i++) {
// 内层 for 循环执行次数 = 1 + n + n + n = 3n + 1
for (int j = 0; j < n; j++) {
System.out.println("j = " + j);
}
}
// 空间复杂度:O(1)
}
数据规模较小时
.
数据规模较大时
.