【问题标题】:Checking for matching values in two arrays using for loop, is it faster to iterate through the smaller loop?使用 for 循环检查两个数组中的匹配值,迭代较小的循环是否更快?
【发布时间】:2017-10-04 19:47:21
【问题描述】:

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

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

例如:

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 循环中迭代的较短数组

例如:

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)
    }

我的问题是,这是否真的提高了性能,或者没有区别,或者损害了性能(通过添加更多的变量定义、计算等)?

【问题讨论】:

  • 加快此过程的一种方法是将其中一个数组制作成关联数组或集合,因为它们使用称为哈希映射的东西。然后遍历另一个以检查是否加入。

标签: javascript arrays performance for-loop


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      这应该比执行双 for 循环更快,因为这就是 include 正在做的事情。

      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(':'));

      【讨论】:

        猜你喜欢
        • 2012-03-27
        • 2015-11-13
        • 1970-01-01
        • 2015-06-11
        • 1970-01-01
        • 1970-01-01
        • 2016-05-08
        • 2020-07-22
        • 1970-01-01
        相关资源
        最近更新 更多