找到阵列中不存在的组合的快速方法是什么?
例如,我有点列表:[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
答案 0 :(得分:2)
通过对数组进行排序,您可以使用2个嵌套进行排序。排序需要O(n log n),循环基本上是O(n ^ 2)。
{{1}}
答案 1 :(得分:1)
您只能迭代外部循环,直到长度为2,并使用哈希表插入connections
。 connections
的排序顺序并不重要。
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);