数据结构之 - 时间复杂度/空间复杂度
Posted auge
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之 - 时间复杂度/空间复杂度相关的知识,希望对你有一定的参考价值。
数据结构之 - 时间复杂度/空间复杂度
一)、复杂度:
复杂度:又称渐进复杂度。
分类: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)
以上是关于数据结构之 - 时间复杂度/空间复杂度的主要内容,如果未能解决你的问题,请参考以下文章