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

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

时间复杂度

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

举例:计算 ∑ 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)表示;

  • ……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值