数据结构之 - 时间复杂度/空间复杂度

数据结构之 - 时间复杂度/空间复杂度

一)、复杂度:

复杂度:又称渐进复杂度

分类: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)

猜你喜欢

转载自www.cnblogs.com/Auge/p/12051200.html