写好原生JS(三)

121 阅读1分钟

怎样写出高效率的JS

假设:要在一个数字数组中找出每两个数和为10的元素生成新的数组
例如:[1,2,3,4,5,6,7,8,9] => [[1,9], [2,8]...]

版本1

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, -1, 10, 11, 0]
function findSumIsTen(arr) {
    let temp = []
    for(let i = 0; i < arr.length; i++) {
      for(let j = i + 1; j < arr.length; j++) {
        if(arr[i] + arr[j] === 10){
          temp.push([arr[i], arr[j]])
        }
      }
    }
    return temp
}
console.log(findSumIsTen())

这个版本利用了两层循环,思路简单,容易实现,但是效率不高,时间复杂度达到了

O(n^2)

数据量大的情况下当然就不适合

版本2

我们知道对于一个有序的序列,操作起来更加高效,因此我们可以先对数组进行排序,排序算法当然要选好,那样的时间复杂度可以降到对数级

let arr = [11, 2, 5, 0, 9, 8, -10, 1, 6, 5, 7, 4, 3]

function map(arr) {
  let temp = []
  arr.sort((a, b) => a - b)
  for(let i = 0, j = arr.length - 1; j > i;) {
    let sum = arr[i] + arr[j]
    if(sum > 10) {
      j--
    } else if(sum < 10) {
      i++
    } else {
      temp.push([arr[i], arr[j]])
      i++
      j--
    }
  }
  return temp
}

console.log(map(arr))

版本三的时间复杂度直接降到了O(n)大大提高了执行效率