美文网首页
时间复杂度和空间复杂度的计算方法

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

作者: 走在冷风中吧 | 来源:发表于2019-12-15 10:45 被阅读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

    相关文章

      网友评论

          本文标题:时间复杂度和空间复杂度的计算方法

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