查找未使用的组合

时间:2017-04-14 08:45:39

标签: javascript arrays

找到阵列中不存在的组合的快速方法是什么?

例如,我有点列表:[1, 2, 4, 9]

我有一个连接列表[[1,2], [1,4], [1,9], [2,4], [4,9]]

因此,此列表中缺少的连接是[2,9]。由于存在一个要求:每个整数必须连接到更大的整数

var points = [1, 2, 4, 9];
var connections = [[1,2], [1,4], [1,9], [2,4], [4,9]];

var missing = [];
for(i = 0; i < points.length; i++){
  for(j = i + 1; j < points.length; j++){
    var found = false;
    for(var a = 0; a < connections.length; a++){
        if(connections[a][0] == points[i] && connections[a][1] == points[j]){
        found = true;
        break;
      }
    }
    if(!found) missing.push([points[i], points[j]]);
  }
}

console.log(missing);

上面的代码有效,但for循环的数量让我认为它相当慢。有没有更快的方法来做到这一点?查看jsfiddle

3 个答案:

答案 0 :(得分:2)

通过对数组进行排序,您可以使用2个嵌套进行排序。排序需要O(n log n),循环基本上是O(n ^ 2)。

{{1}}

答案 1 :(得分:1)

您只能迭代外部循环,直到长度为2,并使用哈希表插入connectionsconnections的排序顺序并不重要。

var points = [1, 2, 4, 9],
    connections = [[1, 2], [1, 4], [1, 9], [2, 4], [4, 9]],
    missing = [],
    i, j,
    pair,
    connected = Object.create(null);

connections.forEach(function (a) {
    connected[a.join()] = true;
});

for (i = 0; i < points.length - 1; i++) {
    for (j = i + 1; j < points.length; j++) {
        pair = [points[i], points[j]];
        connected[pair.join()] || missing.push(pair);
    }
}

console.log(missing);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

你可以使用.reduce方法来生成两个元素的所有组合。然后唯一剩下的就是从两个数组中获得差异。

为此,您可以使用接受filter方法的callback方法。

var points = [1, 2, 4, 9];
points=points.sort();
var connections = [[1,2], [1,4], [1,9], [2,4], [4,9]];
var combinations = points.reduce(function(arr,elem,i){
      for(j=i+1;j<points.length;j++)
        arr.push([elem,points[j]]);
      return arr; 
},[]);
var diff=combinations.filter(function(elem,i){
   return connections.find(a=>a[0]==elem[0] && a[1]==elem[1])==undefined;
});
console.log(diff);