zoukankan      html  css  js  c++  java
  • [数据结构与算法]03 计算时间和空间复杂度

    学习数据结构与算法的时候,避不开的一个知识点就是:时间复杂度和空间复杂度分析.

    为什么需要复杂度分析?
    一段代码我写好了,直接上手跑一遍,不就知道算法执行的时间和占用的内存大小了,为什么还要做分析呢?而且直接跑一遍得到的数据,准确的不能再准确了.
    因为直接跑一遍得到算法执行的时间和占用的内存大小,有一定的局限性.
    第一,同样一段代码,把它拿到 90 年代的笔记本上面执行,和拿到现在的笔记本上面执行,得到的时间是不一样的,所以直接拿来运行的代码,它的准确度真的够准确嘛?
    第二,如果数据量不够多,直接运行程序得到的结果可能有失其准确性.比如,对于小规模的数据排序,插入排序可能会比快速排序更快.
    对于计算时间和空间复杂度,一般是采用大 O 表示法来表示.

    时间复杂度计算:
    什么是时间复杂度呢?是指执行当前算法所消耗的时间.
    常见的几种时间复杂度:O(1),O(log2nlog_2 n),O(n),O(n2n^2),O(2n2^n),O(n!)
    先来看一段简单的代码:

    int n=1000;
    System.out.println("Hi, your input is:"+n);
    System.out.println("Hey, your code is:"+n);
    System.out.println("Hello, your verification code is:"+n);
    

    先别往下看,你觉得这段代码的时间复杂度是多少?
    是 O(1) 对吧?因为这段代码都是常量级的执行时间,所以对于时间复杂度来说,它的复杂度为 O(1).
    请注意: O(1) 并不是指执行了一行代码,上面的程序执行了 3 行代码,它的时间复杂度也是 O(1).只要代码的执行时间不随 n 的增大而增长,那时间复杂度就都记为 O(1).一般情况下,只要程序中不存在循环语句,递归语句,就算是有上万行的代码,时间复杂度也是 O(1).
    来看另外一段代码:

    for(int i=1;i<=n;i++){
      System.out.println("Hello, your verification code is:"+i);
    }
    

    你觉得这段代码的时间复杂度是多少?
    先来分析一下,这段代码执行了 n 次, 所以它的时间复杂度为 O(n).
    如果是这样呢:

    for(int i=1;i<=n;i++){
      for(int j=1;j<=i;j++){
        System.out.println("Hello, your verification code is:"+i+"and"+j);
      }
    }
    

    这段代码的时间复杂度是多少呢?
    首先它有两个 for 循环,每个循环都会走 n 遍,所以这段代码的时间复杂度为 O(n2n^2) .

    如果将以上代码合并在一起,它们的复杂度是多少?是 O(1) + O(n) + O(n2n^2) 嘛?
    不,只是 O(n2n^2) .因为当 n 足够大时, O(1) 和 O(n) 对于程序的影响几乎都可以忽略不计,此时我们只需要关注最大量级即可.

    接下来说说,空间复杂度计算:
    什么是空间复杂度呢?是指执行当前算法需要占用的内存空间大小.也就是看使用了几个辅助变量.
    照样上几段代码来看看.

    void fun(int n){
      int var = 3;
      ...
    }
    

    对于这段代码来说,它的空间复杂度是多少?
    应该比较容易看出来,只使用了一个辅助变量,所以它的空间复杂度为 O(1).

    void fun(int n){
      int[] array = new int[n];
      ...
    }
    

    这段代码,申请了一个大小为 n 的数组,所以它是申请了 n 个辅助变量,所以它的空间复杂度为 O(n).这段代码是申请了一维的,如果是这样呢:

    void fun(int n){
      int[][] matrix = new int[n][n];
      ...
    }
    

    你一定猜到了,它的空间复杂度是 O(n2n^2)

    关于时间和空间复杂度的计算,大概就是这样了
    感谢您的阅读哇~

  • 相关阅读:
    Laravel笔记
    Mysql函数大全
    nginx中文文档
    解析富文本框
    VSCode的C++环境配置,多cpp在同一文件夹(json方式)
    UltraISO光盘刻录
    plog日志库(c++)
    .NET Core安装
    Halcon深度学习——奇异值检测
    C++命名规范
  • 原文地址:https://www.cnblogs.com/zll-0405/p/12534106.html
Copyright © 2011-2022 走看看