本帖最后由 Ray_Adon 于 2010-09-17 10:43:02 编辑

解决方案 »

  1.   

    你可以这样
    先循环一次
    var daA = {}
    for ( var i = 0, aLength = a.length; i < aLength; i++ ) {
    daA[a[i]] = true
    }for ( var i = 0, aLength = b.length; i < aLength; i++ ) {
        if ( daA[b[i]] == true ) {
            //a中存在当前循环到的b的号码
            //删除a号码
            b.splice((aLength--, i--), 1)
        }}
      

  2.   

    才10-20w个,用map的话一瞬间就搞定啦。
      

  3.   

    不知道这10-20W的数字有没有范围,假如说数的范围如果是0---9999,那么就搞个一维数组b[1000],先把B中的数读进来,比如说B中的数是1,2,3,4,5,6,6,7,8,那么就b[0]=0,b[1]=1....b[6]=2,b[7]=1,b[8]=1,然后再把A中的数读进来,比方说是1,1,2,2,4,5,6,8,每读进A中的一个数,就找到数组b相应的那个下标,然后将那个值减1,比如读进来的是1,那么就用b[1]=b[1]-1,依次类推,最后把数组b中,值大于0的那个数组下标读出来,得到的就是B中除去A与B的交集所剩下的值。
      

  4.   

    取多列交集function testcase(amount){
        var rst = [];
        while (amount--) rst[rst.length] = Math.round(Math.random() * 100000);
        return rst;
    }
    alert((function(list){
        var start = (new Date).getTime(); // for test
        var lenArgs = arguments.length,
        map = {}, rst = [],
        len, item, key;
        
        if (1 < lenArgs) {
        
            while (lenArgs) {
                list = arguments[--lenArgs], len = list.length;
                while (len) item = list[--len], map[item] = (map[item] || 0) + 1;
            }
            
            for (key in map) 1 === map[key] && (rst[rst.length] = key);
        }
        alert((new Date).getTime() - start + 'ms'); // for test
        return rst;
    })(testcase(200000), testcase(200000)).length);