当前位置: 首页 > 知识库问答 >
问题:

在任意个数组之间查找公共项的最有效方法

狄新立
2023-03-14
var obj = {
  a: [ 15, 23, 36, 49, 104, 211 ],
  b: [ 9, 12, 23 ],
  c: [ 11, 17, 18, 23, 38 ],
  d: [ 13, 21, 23, 27, 40, 85]
};

我的解决方案是找到最短的数组,并遍历其中的每个项,检查其他数组的索引。

var shortest = {};
var keys = [];
for ( var key in obj ) {

  if ( obj.hasOwnProperty( key ) && Array.isArray( obj[ key ] ) ) {
    keys.push( key );

    if ( !shortest.hasOwnProperty( 'length' ) || obj[ key ].length < shortest.length ) {
      shortest.name = key;
      shortest.length = obj[ key ].length;
    }
  }
}



var res = obj[ shortest.name ].filter(function ( v ) {

  for ( var i = 0; i < keys.length; i++ ) {

    if ( obj[ keys[ i ] ].indexOf( v ) === -1 ) {
      return false;
    }

    return true;
  }
};

然而,这似乎效率极低,我正在尝试确定是否有更好的方法,最好不用多次循环

共有1个答案

皇甫飞光
2023-03-14

我认为不可能在小于O(N)的情况下做到这一点,其中N是所有数组中的项数。您当前的解决方案效率较低,因为indexof对于每个数组都是O(N),您可以为最短数组中的每个项运行所有的索引。

我认为基于映射的选项应该是O(N):

var counts = {};
var keys = Object.keys(obj);
var arr, el;
for (var k = 0; k < keys.length; k++) {
    arr = obj[keys[k]];
    for (var i = 0; i < arr.length; i++) {
        el = arr[i];
        if (counts[el] === undefined) {
            // new value, start counting
            counts[el] = 1;
        } else {
            // increment count for this value
            counts[el]++;
            // if we have as many values as keys, we're done
            if (counts[el] === keys.length) {
                return el;
            }
        }
    }
}

这里有一些警告:

这假定每个数组的数组值都是唯一的。

假设交集中只有一个元素。

https://jsfidle.net/xzfa75og/

 类似资料:
  • 我找不到任何关于数学交换和堆栈溢出的问题来回答这个特定问题。这是我发现的最相似的问题,但这个问题构造得太差,答案完全不充分。 我尝试过在谷歌上寻找无济于事。我确实发现了这一点,但这个公式似乎效率低下,因此不够。例如,如果我们取数字21... 现在想象一下找到远大于21的数字的共同因素,例如2,252和4,082...上述方法没有任何效率。 我想做的是找出最有效的方法来找到任何两个数字的所有公因数。

  • 问题内容: 在Java中,从两个字符串数组返回公共元素的最有效方法是什么?我可以用一对for循环来做到这一点,但这似乎并不是很有效。根据对类似SO问题的评论,我能想到的最好的方法是转换为a ,然后应用:) 问题答案: 编辑: 这是单线的: 该IMPL(类AbstractCollection中)遍历,以及用途的说法。将参数转换为a 将导致快速查找,因此a中的循环将尽快执行。 另外,名称暗示它是一个常

  • 问题内容: 我有多个带有字符串值的数组,我想比较它们,只保留 所有 它们之间相同的匹配结果。 给出以下示例代码: 我想产生以下数组,其中包含来自所有给定数组的匹配项: 我知道我可以将所有数组组合在一起,但这只是给我一个包含所有内容以及重复项的数组。是否可以轻松完成此操作而无需诸如underscore.js之类的库的开销? 编辑 我想我应该提到的是,可能存在未知数量的数组,我只是以3为例。 问题答案

  • 我有多个带有字符串值的数组,我想对它们进行比较,并且只保留它们之间相同的匹配结果。 给定此示例代码: 我想生成以下数组,它包含所有给定数组的匹配项: 编辑我想我应该提到可能有未知数量的数组,我只是使用3作为一个例子。

  • 在中,您可以包含一个方法,该方法在或之前调用,那么在Spring中有没有实现相同的方法? 或者更准确地说,在控制器中的每个方法中,我需要确保存在一个实体(在本例中,是一个产品),然后重定向否则,就像这样,那么在Spring中该如何实现呢?注意,我还需要每个方法中可用的产品。