在Javascript中查找两个数组的交集
这是一个亚马逊采访的问题,我有一个问题,我的答案是在Javascript中查找两个数组的交集,javascript,algorithm,optimization,data-structures,Javascript,Algorithm,Optimization,Data Structures,这是一个亚马逊采访的问题,我有一个问题,我的答案是 function intersection ( A , B ) { var C = []; for ( var a in A ) if ( B.indexOf(a) != -1 ) C.push(a); return C; } 他问复杂性的顺序是什么,我说,我准确地引用 O(m*n),其中m=A.长度,n=B.长度 他说有更好的方法,我就像WTF一样???????他说用A和B作为对象,我就像 “但你说这些是数组,这是
function intersection ( A , B )
{
var C = [];
for ( var a in A ) if ( B.indexOf(a) != -1 ) C.push(a);
return C;
}
他问复杂性的顺序是什么,我说,我准确地引用
O(m*n),其中m=A.长度,n=B.长度
他说有更好的方法,我就像WTF一样???????他说用A
和B
作为对象,我就像
“但你说这些是数组,这是你的问题!!!!”
有人能帮我吗?如果您知道数组值是字符串或数字,您可以创建一个对象,该对象的值为属性名和每个属性的真实值。然后可以在通过第二个数组的过程中使用简单的对象查找 比如:
function intersection ( A , B )
{
var m = A.reduce(function(m, v) { m[v] = 1; return m; }, {});
return B.filter(function(v) { return m[v]; });
}
编辑-要从结果中删除重复项,可以使用另一个.reduce()
过程:
function intersection ( A , B )
{
var m = A.reduce(function(m, v) { m[v] = 1; return m; }, {});
return B.reduce(function(rv, v) {
if (!rv.m[v]) {
rv.m[v] = 1;
rv.l.push(v);
}
return rv;
}, {m:{}, l:[]}).l;
}
我不知道“作为对象使用”有什么帮助,但是如果你在开始之前从
B
中创建一个查找表(字典),那么你可以在O(n)中完成。如果你在另一个JavaScript访谈中,不要使用来。。。在
中循环遍历数组。顺便说一句,这个问题有很多问题,例如:@JonTrauntvein不,它将是O(n+m),这实际上只是O(n)。如果A和B
是数组,这不会做它假装的事情。在for(var a In a){…}
中,变量a
将保存索引。如果值是对象,但引用相等是正确的,则可以使用Set()@Touffy yes很好,事实上,无论如何都可以使用Set。我还没有完全适应ES2015:)请注意,在实践中,如果A.length或B.length很小,那么使用数组查找实际上可能会获得更好的性能:(from)@nrabinowitz是的,现代浏览器以某种方式执行.indexOf()
的速度非常快。或者它们的对象键查找开销比预期的要大。