在JavaScript中可以实现数组减法的最快数量级是多少?

时间:2012-03-15 04:47:15

标签: javascript arrays performance algorithm

我想要一个带有两个数组的函数,减去它,并返回数组1中不在数组2中的所有元素。

这可以在js中实现的最快速度是多少?是o(n)?

3 个答案:

答案 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
    })
}