# 算法

# 时间复杂度

量级

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

越下面,执行的效率越低。

常数节:时间复杂度只有 O(1)

var a = 0;

var b = 0;

a++;

// or 此处的时间复杂度也是 O(n) 常数阶

function total() {
  let sum = 0;
  for (let i = 0; i < 100; i++) {
    sum++;
  }
}

// O(n2)

function total() {
  let sum = 0;
  for (let i = 0; i < 100; i++) {
    for (let j = 0; j < 100; j++) {
      sum++;
    }
  }
}

// 特殊的比较 O(m+n),无法比较n 、m 大小

function total3(n, m) {
  let sum = 0;
  for (let i = 0; i < n; i++) {
    sum += i;
  }
  let sum2 = 0;
  for (let j = 0; j < m; i++) {
    sum2 += i;
  }
  return sum + sum2;
}

// 特殊的比较 O(n*m)
function total4(n, m) {
  let sumN = 0;
  let sumM = 0;
  for (let i = 0; i < n; i++) {
    sumN += i;
    for (let j = 0; j < m; j++) {
      sumM += j;
    }
  }
  return sumN * sumM;
}

线性阶 O(n):

对数阶 O(logN):

function total() {
  let sum = 0;
  let i = 1;
  while (i <= n) {
    sum += 1;
    i = i * 2;
  }
}

function total2() {
  let sum = 0;
  for (let i = 0; i < n; i = i * 2) {
    sum += 1;
  }
}

2x=n => x=log2n,这两者的时间复杂度为 O(log2n)

# 空间复杂度

空间复杂度:表示算法的存储空间和数据规模之间的关系

// 根据时间复杂度推算,忽略常数量级,每次数组都申请一个空间存储量,此时的空间复杂度为 O(n)
function initArray(n) {
  const arr = [];
  for (let i = 0; i < n; i++) {
    arr[i];
  }
}

0(1) 空间复杂度O(n) 空间复杂度

function total(n) {
  let sum = 0;
  for (let i = 0; i <= n; i++) {
    sum += i;
  }
  return sum;
}

total(10); //45

时间复杂度:O(n),但是,显然这里的时间复杂度是高了。

// 通过调整算法后,时间复杂度仅为 0(1)
function total(n) {
  const sum = (n * (n + 1)) / 2;
  return n;
}

显然可以比较 O(n) > O(1),这是算法的魅力,提高效率。 O(n2) 空间复杂度