美文网首页
时间复杂度 空间复杂度

时间复杂度 空间复杂度

作者: 雪飘千里 | 来源:发表于2019-09-18 18:21 被阅读0次

    概念

    时间复杂度和空间复杂度是用来衡量不同算法之间的优劣
    时间复杂度:计算的不是算法运行的时间,而是算法运行执行语句的次数
    空间复杂度:指一个算法在运行过程中,临时占用存储空间大小的度量,简单的说就是,被创建次数最多的变量,它被创建了多少次,那么这个算法的空间复杂度就是多少

    量级以及计算方法

    常用的时间复杂度量级

    • 常数阶O(1)
      无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1);

      int i = 1;
      int j = 2;
      ++i;
      j++;
      int m = i + j;
      
    • 线性阶O(n)
      for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。

      for(i=1; i<=n; ++i)
      {
         j = i;
         j++;
      }
      
    • 对数阶O(log2n) :常见于算法中先把数据对半分,然后计算,比如二分法查找

    从下面的代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n
    也就是说当循环 log2n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(log2n)

    int i = 1;
    while(i<n)
    {
      i = i * 2;
    }
    
    • 线性对数阶O(nlog2n):常见于算法中先把数据对半分,然后循环计算,比如归并排序
      将时间复杂度为O(log2n)的代码循环N遍的话,那么它的时间复杂度就是 n * O(log2n),也就是了O(nlog2n)。
      for(m=1; m<n; m++)
      {
        i = 1;
        while(i<n)
        {
            i = i * 2;
        }
      }
      
    • 平方阶O(n²):常见于算法中多次循环计算,比如冒泡排序,快速排序(最差情况)
      平方阶O(n²) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了
      for(x=1; i<=n; x++)
      {
       for(i=1; i<=n; i++)
        {
           j = i;
           j++;
        }
      }
      

    上面从上至下依次的时间复杂度越来越大,执行的效率越来越低。

    空间复杂度比较常用的有:

    • O(1):如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)
       int temp=0;
      for(int i=0;i<n;i++){
      temp = i;
      }
      
    • O(n)
      算法循环n次,每次temp都会创建,所以空间复杂度是n
      for(int i=0;i<n;++){
      int temp = i;
      }
      

    以归并排序为例,在合并过程中,每次都要比较交换,要比较n次,每次都创建一个临时变量,所以归并排序的空间复杂度为O(n)

    • O(n²)
      同上,如果是两个for循环,同时每次都创建变量
    • O(log2n)
      同时间复杂度,算法循环log2n次,每次都创建变量
      以快速排序为例,快排最好的情况下只需循环log2n次,每次交换创建一个临时变量,最差情况下要循环n次,所有快速排序的空间复杂度为 O(log2n) ~ O(n)

    相关文章

      网友评论

          本文标题:时间复杂度 空间复杂度

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