美文网首页
第一时间复杂度和空间复杂度初探

第一时间复杂度和空间复杂度初探

作者: songjk | 来源:发表于2019-08-23 18:03 被阅读0次

时间复杂度

1.概念

时间复杂度表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。

2.表示方法

T(n) = O(f(n))

n表示输入数据的规模大小,T(n)表示代码执行的时间,f(n)表示代码执行总次数的总和,O()表示T(n)与f(n)成正比。

3.时间复杂度分析

 int cal(int n) {
     int sum = 0;
     int i = 1;
     for (; i <= n; ++i) {
       sum = sum + i;
     }
     return sum;
 }

假设每一行普通的代码执行时间为time, 以上代码第二行和第三行执行时间分别为time1和time1,第三行和第五行的执行时间为timen和timen,所以执行总时间为(2+2n)*time,当n的值无限大的时候公式中低阶、常量和系数都可以忽略掉,所以上面代码的时间复杂度就可以表示为T(n) = O(n).

 int cal(int n) {
     int sum = 0;
     int i = 1;
     for (; i <= n; ++i) {
       sum = sum + i;
     }
     return sum;
 }

更具我们之前推导的方法,可以计算出执行总时间为(2n^2+2n+3)*time,所以时间复杂度就表示为:T(n) = O(n^2)

int cal(int m, int n) {
    int sum_1 = 0;
    int i = 1;
    for (; i < m; ++i) {
      sum_1 = sum_1 + i;
    }

    int sum_2 = 0;
    int j = 1;
    for (; j < n; ++j) {
      sum_2 = sum_2 + j;
    }

    return sum_1 + sum_2;
}

同分析得到以上代码的时间复杂度为O(m+n)。

4.常见时间复杂度

常量阶O(1),线性阶O(n),对数阶O(logn),线性对数阶O(nlogn),指数阶O(2^n),阶乘阶O(n!),平方阶O(n^2),k次方阶O(n^k)
可以分为:多项式量级和非多项式量级,其中非多项式量级只有指数阶O(2^n)和阶乘阶O(n!)

对数阶举例:

 i=1;
   while (i <= n)  {
     i = i * 2;
   }

可以看出i的变化是一个等比数列,假设循环执行了x次,那么i=2^x=n,求解得到x=logn,所以时间复杂度表示为O({log_2{n}})

 i=1;
 while (i <= n)  {
   i = i * 3;
 }

类似的我们求出时间复杂度为 O({log_3{n}}),但是{log_3{n}} 就等于 {log_3{2}} * {log_2{n}},去掉常量系数{log_3{2}},实际上也就表示为{log_2{n}},所以对数阶统一表示为 O(logn)

空间复杂度

1.概念

空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。

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 的 int 类型数组,其它所占空间都为常量,所以整段代码的空间复杂度就是 O(n)。
我们常见的空间复杂度就是 O(1)、O(n)、O(n2 ),O(logn)、O(nlogn) 这样的对数阶复杂度平时都用用不到。

相关文章

网友评论

      本文标题:第一时间复杂度和空间复杂度初探

      本文链接:https://www.haomeiwen.com/subject/zritectx.html