如何找到n个数组的交点

时间:2014-01-16 15:15:08

标签: coffeescript

我有n个数组或可变长度

arr1 = [1,2,3]
arr2 = [1,3,5,8]
....

如何计算这n个数组的交集?

3 个答案:

答案 0 :(得分:2)

考虑查看underscore.js库。它提供了function以满足您的需求和一系列其他有用的功能。

docs中的示例:

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]

可以找到简单的普通JS实现here。 CoffeeScript中的相同想法:

intersect_all = (lists) ->
  if lists.length is 0
    return []
  else return lists[0]  if lists.length is 1
  partialInt = lists[0]
  i = 1

  while i < lists.length
    partialInt = intersection(partialInt, lists[i])
    i++
  partialInt

答案 1 :(得分:1)

最有效的方法是使用hashsets:

function hashset (elements) {
  var i, set = {};
  if (!Array.isArray(elements)) return elements;
  for (i = 0; i < elements.length; i++) {
    set[elements[i]] = true;
  }
  return set;
};

function intersect (a, b) {
  var k
    , s1 = hashset(a)
    , s2 = hashset(b)
    , s3 = {}
  for (k in s1) {
    if (s2[k]) s3[k] = true;
  }
  return s3;
};

Object.keys(intersect(arr1,arr2));
// ["1", "3"]

您会看到CoffeeScript source of this code, benchmarks for it以及其他一些信息in this question

如果您要交叉大型数组,那么我强烈建议您使用这种方法。

答案 2 :(得分:0)

要么使用_.intersectionstudy the source of that implementation之类的内容,请根据需要重写。