时间复杂度和空间复杂度的计算方法

2019-12-15  本文已影响0人  走在冷风中吧

1. 时间复杂度:

概念: 可以通俗的理解为一段代码被重复执行的次数, 其中可以忽略单行代码的执行, 将重点放在会重复执行的循环代码上.
专业一点说就是算法的执行时间和数据规模之间的增长关系.

对于时间或者空间复杂度都是在数据量较大的情况下, 会出现明显的性能差别, 在平时开发中应该多思考性能优化问题.

时间复杂度为 O(n)
 int cal(int n) {
   int sum = 0;
   int i = 1;
   for (; i <= n; ++i) {
     sum = sum + i;
   }
   return sum;
 }

解析: 方法中的第2 ,3行代码都是只执行一次, for循环中的代码需要执行 n 次, 当 n 足够大时可以忽略剩余单行代码的常量数值, 所以这里的时间复杂度为 O(n)

时间复杂度为 O(n²)
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;
 }

解析: call方法的循环中循环n 次调用了 f 方法, f 方法中循环 n 次, 所以当前算法的时间复杂度为O(n²)

时间复杂度为O(logn), O(nlogn)
 i=1;
 while (i <= n)  {
   i = i * 2;
 }

解析 : 这段代码的最终执行结果为: 2的 x 次方 <= n , 这段代码循环执行的次数为 x, 数学公式上 2的 x 次方=n => log以 2 为底 n 的对数, 数学公式上, 不管是以几为底的对数, 都可以将底提出, 所以将所有对数级的时间复杂度统一记为 O(logn),

对于O(nlogn), 将上面循环再嵌入到一个for 循环中, 时间复杂度就是O(nlogn), 归并排序、快速排序的时间复杂度都是 O(nlogn)。

2. 空间复杂度

概念: 空间复杂度就是数据的存储空间和数据规模之间的增长关系.

void print(int n) {
  int i = 0;
  int[] a = new int[n];
  for (i; i <n; ++i) {
    a[i] = i * i;
  }

  for (i = n-1; i >= 0; --i) {
    print out a[i]
  }
}

解析: 方法的第二行, 开辟一个长度为 n 的数组, 整个方法而言, 当前的最大空间占用就在这行代码, 所以当前方法的空间复杂度为 O(n)
常见的空间复杂度为 O(1), O(n), O(n²)..

image.png
上一篇下一篇

猜你喜欢

热点阅读