时间和空间复杂度

3 阅读2分钟

时间复杂度

时间复杂度描述了一个算法运行时间相对于输入数据规模的增长速度

常见的时间复杂度等级

  • O(1):常数时间复杂度,表示算法的执行时间与输入数据规模无关。
  • O(log n):对数时间复杂度,表示算法的执行时间与输入数据规模的对数成正比。
  • O(n):线性时间复杂度,表示算法的执行时间与输入数据规模成正比。
  • O(n log n):线性对数时间复杂度,表示算法的执行时间与输入数据规模的对数成正比。
  • O(n^2):平方时间复杂度,表示算法的执行时间与输入数据规模的平方成正比。
  • O(2^n):指数时间复杂度,表示算法的执行时间呈指数增长。
  • O(n!):阶乘时间复杂度,表示算法的执行时间与输入数据规模的阶乘成正比。

O(n)举例来说

function findMax(arr) { 
  let max = arr[0]; 
  for (let i = 1; i < arr.length; i++) { 
    if (arr[i] > max) {
      max = arr[i]; 
    } 
  } 
  return max;
}

这个例子中max需要遍历一遍数组,才能找到最大值,所以时间复杂度和输入的数组长度成正比,也就是O(n)

空间复杂度

空间复杂度描述了一个算法所需的内存空间相对于输入数据规模的增长速度。

常见的空间复杂度等级

  • O(1):常数空间复杂度,表示算法所需的额外空间与输入数据规模无关。
  • O(n):线性空间复杂度,表示算法所需的额外空间与输入数据规模成正比。
O(1)举例
function sumArray(arr) { 
  let sum = 0; 
  for (let i = 0; i < arr.length; i++) {
    sum += arr[i];
  }
  return sum; 
}

代码中需要使用的 额外空间 只有一个变量sum来存储数组的相加之和,和数组的长度没有关系,所以空间复杂度为O(1)

O(n)举例
function sumArray(arr) { 
  let sum = []; 
  for (let i = 0; i < arr.length; i++) {
    sum = sum.push(arr[i]);
  }
  return sum; 
}

代码中的sum是一个新的数组,且其是由arr.push()形成的,其需要的 额外空间 是和数组arr的长度成正比的,所以其空间复杂度为O(n)