zoukankan      html  css  js  c++  java
  • 时间复杂度 & 空间复杂度

    时间、空间复杂度

    • 时间维度:是指执行当前算法所消耗的时间。
    • 空间维度:是指执行当前算法需要占用多少内存空间。

    「时间复杂度」和「空间复杂度」的计算方式

    时间复杂度:「大O符号表示法」,即T(n)= O(f(n))。大O符号表示法并不是用来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。

    其中f(n)表示每行代码执行次数之和,O表示正比例关系。

    常见的时间复杂度量级:

    • 常数阶O(1)
    • 对数阶O(logN)
    • 线性阶O(n)
    • 线性对数阶O(nlogN)
    • 平方阶O(n2)
    • 立方阶O(n3)
    • K次方阶O(nk)
    • 指数阶O(2n)

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

    依次举例说明

    • 常数阶O(1)
    let i = 0;
    let j = 0;
    

    上述代码执行的时候,它消耗的时间并不随着某个变量的增长而增长,无论代码有多长,都可以用O(1)来表示它的时间复杂度。

    • 线性阶O(n)
    for(let i = 0;i < n;i++ ){
       console.log(i) 
    }

    上述代码执行的时候,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码可以用O(n)来表示它的时间复杂度。

    • 对数阶O(logN)
    let i = 1
    while(i < n){
      i *= 2  
    }
    

    上述代码执行的时候,假设循环x次之后,i大于n,循环退出,也就是说2的x次方等于n,因此这类代码的时间复杂度为O(logN)。

    • 线性对数阶O(nlogN)
    for(let i = 0;i < j;i++){
      let   i = 1
      while(i < n){
        i *= 2        
      }    
    }
    • 平方阶O(n2)
    for(let i = 0;i < n;i++){
       for(let j = 0;j < n;j++){
          console.log(j)
        }
    }
    

      

    for(let i = 0;i < m;i++){
       for(let j = 0;j < n;j++){
          console.log(j)
        }
    }
    

    上述代码的时间复杂度就变成了O(m*n)

    空间复杂度:也不是用来计算程序实际占用的空间的。它是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用S(n)来定义。公式:S(n)= O(f(n))

    空间复杂度比较常用的有:O(1)、O(n)、O(n²)

  • 相关阅读:
    Java泛型 PECS(Producer Extends, Consumer Super)
    JDK(七)JDK1.8源码分析【集合】TreeMap
    JDK(六)JDK1.8源码分析【集合】LinkedHashMap
    JDK(五)JDK1.8源码分析【集合】HashMap
    JDK(四)JDK1.8源码分析【排序】DualPivotQuicksort
    JDK(三)JDK1.8源码分析【排序】mergeSort
    JDK(二)JDK1.8源码分析【排序】timsort
    第24天多线程技术
    第23天功能流、图形化界面、多线程
    第二十二天 字符流、缓冲区、转换流
  • 原文地址:https://www.cnblogs.com/zhenjianyu/p/13068556.html
Copyright © 2011-2022 走看看