算法的时间与空间复杂度理解说明

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法的时间与空间复杂度理解说明相关的知识,希望对你有一定的参考价值。

算法的时间与空间复杂度理解说明

文章目录

时间复杂度

时间复杂度用于表示算法的执行时间。

举例:计算 ∑ n = 1 N i 3 \\displaystyle \\sum_n=1^N i^3 n=1Ni3的方法

public static int sum(int N)
    int partialSum;
    // step 1
    partialSum=0;
    // step 2
    for(int i=0;i<=N;i++)
        // step 3
        partialSum += i*i*i;
    
    // step 4
    return partialSum;

  1. 统计步骤的占用时间单元

    声明变量的步骤不计时间,step 1和step 4各占一个时间单元,step 3每执行一次占四个时间单元(两次乘法,一次加法,一次赋值),这样执行N次供占用4N个时间单元。step 2会进行i的初始化(一个时间单元),i<=N的判断(N+1个时间单元),以及i的自增(N个时间单元),这样就是2N+2个时间单元。整个流程一共会占用6N+4个时间单元,这不是一个确切的值,表达是的大小取决于N的大小。

  2. 简化算法的占用时间单元

    通过统计算法中的占用时间单元,会得到类似的表达式 6 n + 4 、 6 n 2 + 4 n + 5 6n+4 、 6n^2+4n+5 6n+46n2+4n+5

    简化过程:

    • 当n无限大的时候,+5这样的值,已经对表达式的结果影响不大了,可以可以简化为 6 n 2 + 4 n 6n^2+4n 6n2+4n
    • 当n无限大的时候, 6 n 2 6n^2 6n2的值要远大于 4 n 4n 4n 的值,可以简化为 6 n 2 6n^2 6n2
    • 当n无限大的时候, n 2 n^2 n2的值已经超级大了,这时候乘以6的影响已经不大了,可以简化为 n 2 n^2 n2

    简化表达式的过程可以总结为:

    • 去掉表达式中所有的加法常数项;
    • 只保留表达式中变量指数最大的项;
    • 去掉常数系数。
  3. O记法表示时间复杂度

    用 n 作为表达式中的变量,并采用O记法表示算法的执行时间。

    格式:O(简化后的占用时间单元表达式)

    6 n + 4 、 6 n 2 + 4 n + 5 6n+4 、 6n^2+4n+5 6n+46n2+4n+5可以使用 O ( n ) 、 O ( n 2 ) O(n)、O(n^2) O(n)O(n2)表示。如果表达式中没有变量n, 那使用 O ( 1 ) O(1) O(1)表示。

    常用的几种时间复杂度以及它们之间的大小关系:
    O ( 1 ) < O ( log ⁡ n ) < O ( n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) O(1)< O(\\log n) < O(n) < O(n^2) < O(n^3) < O(2^n) O(1)<O(logn)<O(n)<O(n2)<O(n3)<O(2n)

  4. 一般法则

    • 法则1、for循环

      一次for循环的执行时间至多是for循环内语句的执行时间 * 迭代次数

    • 法则2、嵌套for循环

      从里向外分析这些循环。

      在一组嵌套循环语句内的一条语句的执行语句总的运行时间是这条语句的执行时间 * 该组所有的for的大小的乘积

      // step1
      for(int i=0;i<n;i++)
          // step2
          for(int j=0;j<n;j++)
              // step3
              k++;
          
      
      

      推演过程

      step 1占用2*n+2个事件单元,step 2占用2*n+2个事件单元,step 3每次占用1个事件单元共占用 ( 2 n + 2 ) ∗ ( 2 n + 2 ) ∗ 1 (2n+2)*(2n+2)*1 (2n+2)(2n+2)1,简化为 4 n 2 + 8 n + 4 4n^2+8n+4 4n2+8n+4,即 O ( n 2 ) O(n^2) O(n2)

    • 法则3、顺序语句

      将各个语句的运行时间求和,即其中的最大值就是这部分的时间复杂度

      for(int i=0;i<n;i++)
          t1[i]=0;
      
      
      for(int i=0;i<n;i++)
          for(int j=0;j<n;j++)
             t1[i]+=t2[j]+i+j;
          
      
      

      第一个for循环的运行时间复杂度为 O ( n ) O(n) O(n),第二个嵌套for循环的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。即整个时间复杂度为: O ( n 2 ) O(n^2) O(n2)

    • 法则4、if/else语句

      if(conditin)
          s1
      else
          s2
      
      

      一个if/else语句的运行时间不会超过Condition+s1+s2的时间。这样的评估时间复杂度是过大的,但是绝不会过小。

空间复杂度

空间复杂度衡量的是算法执行过程占用的内存空间的大小。

int[] t=new int[n];
for(int i=0;i<n;i++)
    t[i]=0;
  

数组t占n个存储单元,随n的变化而变化。

空间复杂度也采用O记法表示。算法空间复杂度的估算方法是:

  • 如果算法中额外申请的内存空间表达式中没有变量n(是一个固定值),那么该算法的空间复杂度用 O ( 1 ) O(1) O(1) 表示;

  • 如果随着输入值 n 的增大,算法申请的存储空间成线性增长,则程序的空间复杂度用 O ( n ) O(n) O(n)表示;

  • 如果随着输入值 n 的增大,程序申请的存储空间成 n 2 n^2 n2关系增长,则程序的空间复杂度用 O ( n 2 ) O(n^2) O(n2)表示;

  • 如果随着输入值 n 的增大,程序申请的存储空间成 n 3 n^3 n3关系增长,则程序的空间复杂度用 O ( n 3 ) O(n^3) O(n3)表示;

  • ……

以上是关于算法的时间与空间复杂度理解说明的主要内容,如果未能解决你的问题,请参考以下文章

时间复杂度的理解

算法基础知识

递归树

算法的时间与空间复杂度理解说明

算法01

人工智能中的局部搜索算法