使用for循环检查两个数组中的匹配值,迭代较小的循环会更快吗?

时间:2017-10-04 19:47:22

标签: javascript arrays performance for-loop

我正在创建一个函数,它将接受两个参数,即每个数组,并在两个数组之间返回一个单独的匹配值数组。
我制作了两个版本的函数,

  1. 默认迭代for中的第一个参数 循环,并使用.includes()
  2. 检查第二个参数的匹配值

    例如:

    var matches = [];
    for (let i = 0, len = array1.length; i < len; i++) {
        var a = array1[i];
        if (array2.includes(a)) {
            matches.push(a)
        }
    
    1. 测量并比较两个数组的长度,并选择 要在for循环
    2. 中迭代的较短数组

      例如:

      if (array1.length <= array2.length) {
          var itArr = array1;
          var checkArr = array2 }
      else { var itArr = array2
             var checkArr = array1 };
      var matches = [];
      for (let i = 0, len = itArr.length; i < len; i++) {
          var a = itArr[i];
          if (checkArr.includes(a)) {
              matches.push(a)
          }
      

      我的问题是这是否实际上改善了性能,或者没有差别,或者损害了性能(通过添加更多变量定义,计算等)?

3 个答案:

答案 0 :(得分:1)

它不会产生显着差异,因为最坏情况的复杂性将是 O(n * m),其中n和m是数组的长度。

你可以对2个数组进行排序,并使用2个指针找到交集,在这种情况下,时间复杂度为 O(nlogn + mlogm + n + m),取决于使用的排序算法

答案 1 :(得分:0)

我想我会选择第一种方法,因为.includes函数将尝试迭代数组并在找到元素时返回true,所以如果元素位于数组的末尾,它会完全迭代它。因此,你选择小一个的尝试不应该产生太大的不同。

答案 2 :(得分:0)

以下是使用Set查看一个数组是否包含另一个数组的值的示例。

如果你不是ES6,(为什么不呢?),你可以使用一个简单的对象文字。

这应该比做一个双循环更快,因为那是包括将要做的事情。

function makeRandom(count, max) {
  return Array.from(new Array(count),
    (a,ix) => Math.round(Math.random() * max));
}

function union(a,b) {
  var aSet = new Set(a), oSet = new Set();
  b.forEach((v) => { if(aSet.has(v)) oSet.add(v) });
  return Array.from(oSet);
}


const
  random1 = makeRandom(5, 10),
  random2 = makeRandom(5, 10);
  
const
  unionArray = union(random1, random2);
  
console.log(random1.join(':'));
console.log(random2.join(':'));
console.log(unionArray.join(':'));