时间复杂度 & 空间复杂度

时间、空间复杂度

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

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

时间复杂度:「大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²)

 

posted @ 2020-06-08 22:17  671_MrSix  阅读(257)  评论(0编辑  收藏  举报