我想要一个带有两个数组的函数,减去它,并返回数组1中不在数组2中的所有元素。
这可以在js中实现的最快速度是多少?是o(n)?
答案 0 :(得分:1)
另一种选择,更快的O(n)时间,但是双内存(仍然是线性的),是创建自己的hashmap实现。
创建哈希函数。循环遍历一个数组并散列所有元素。将(hash,object)对存储在另一个数组中,称之为hash数组。现在循环遍历数组2,并散列每个元素。让哈希值成为哈希数组中的位置,这样就可以看出是否有冲突。如果你有碰撞检查哈希数组中的对象是否与当前数组中的对象相同(你正在循环)。
答案 1 :(得分:1)
这是一个哈希表实现(使用javascript对象作为哈希),与使用indexOf()
的强力查找相比,使用更大阵列的速度快100倍(在Chrome中)。
function subtract3(one, two) {
var hash = {}, result = [], i, len;
// fill hash with members of second array for easy lookup
for (i = 0, len = two.length; i < len; i++) {
hash[two[i]] = true;
}
// cycle through first array and find ones that are not in two
for (i = 0, len = one.length; i < len; i++) {
if (!(one[i] in hash)) {
result.push(one[i]);
}
}
return(result);
}
这是一个jsperf测试,将此选项与其他几个选项进行比较:http://jsperf.com/array-subtraction
答案 2 :(得分:0)
除非你想将数组限制为可以序列化为字符串的对象,否则你不能为O(n)一般地解决这个问题
function substract(one, two) {
var result = []
for (var i = 0, len = one.length; i < len; i++) {
var value = one[i]
if (two.indexOf(value) === -1) {
result.push(value)
}
}
return result
}
或者如果你想使用数组迭代器
function substract(one, two) {
return one.filter(function (value) {
return two.indexOf(value) === -1
})
}