标签:数据 定时 max 关系 决定 循环 实例 return 常见
复杂度:又称渐进复杂度。
分类:1).时间复杂度。
? 2).空间复杂度。
时间复杂度:T(n) = O(f(n)), 表示代码的执行时间和代码的执行次数成正比关系。
T(n): 代码的执行时间。
f(n): 代码的执行次数。
n: 数据规模。
O: 代码的执行时间和数据规模增长的变化趋势。
1)、只关注循环次数最多的一短代码
T(n) = O(n)
int cal(int n) {
int sum = 0;
int i = 1;
for (; i <= n; ++i) {
sum = sum + i;
}
return sum;
}
2)、加法法则,T(n) = O(max(f(n), g(n)))
? 场景:多个循环: T(n) = O(mac(f(n) + g(n^2))) = O(n^2)
int cal(int n) {
int sum_1 = 0;
int p = 1;
for (; p < 100; ++p) {
sum_1 = sum_1 + p;
}
int sum_2 = 0;
int q = 1;
for (; q < n; ++q) {
sum_2 = sum_2 + q;
}
int sum_3 = 0;
int i = 1;
int j = 1;
for (; i <= n; ++i) {
j = 1;
for (; j <= n; ++j) {
sum_3 = sum_3 + i * j;
}
}
return sum_1 + sum_2 + sum_3;
}
3)、乘法法则,O(f(n)) * O(g(n)) = O(f(n) * g(n))
场景:嵌套循环: T(n) = O(f(n) * g(n))
T(n) = O(f(n) * g(n^2)) = O(f(n * n^2)) = O(f(n^3))
int cal(int n) {
int ret = 0;
int i = 1;
for (; i < n; ++i) {
ret = ret + f(i);
}
}
int f(int n) {
int sum = 0;
int i = 1;
for (; i < n; ++i) {
sum = sum + i;
}
return sum;
}
O(1)< O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)
O(1):
只要算法中不存在循环,递归,即使有成千上万行代码,时间复杂度也是O(1).
O(logn): 等比数列。
2^0 2^1 2^3 ..... 2^x = n, x = logn
O(nlogn):
循环中嵌套着logn的循环
O(m+m) = O(f(m)) + O(g(n))
O(mn) = O(f(m)) O(g(n))
经常遇到的时间复杂度一般为O(n) 和 O(n^2)
标签:数据 定时 max 关系 决定 循环 实例 return 常见
原文地址:https://www.cnblogs.com/Auge/p/12051200.html