什么';在JavaScript中有一个好的数学集实现吗?

什么';在JavaScript中有一个好的数学集实现吗?,javascript,math,set,intersection,Javascript,Math,Set,Intersection,JavaScript的好数学集实现在哪里?它应该包括交集、并集、补集和笛卡尔积的高效实现 不,这不是家庭作业。我有一个yubikey,它是一个USB键盘,可以从16个键码中选择一个序列来输入128位一次性密码(otp)。为了使其更有用,软件应该根据生成的字符检测键盘布局,并将这些字符映射回“us”布局中的字符,以便与现有后端兼容 因此,我有93个不同的16个字符序列,代表了yubikey在430个键盘布局中可以键入的所有内容。(许多布局与此目的相同。)特定otp的可能映射是包含otp中每个字符的

JavaScript的好数学集实现在哪里?它应该包括交集、并集、补集和笛卡尔积的高效实现

不,这不是家庭作业。我有一个yubikey,它是一个USB键盘,可以从16个键码中选择一个序列来输入128位一次性密码(otp)。为了使其更有用,软件应该根据生成的字符检测键盘布局,并将这些字符映射回“us”布局中的字符,以便与现有后端兼容

因此,我有93个不同的16个字符序列,代表了yubikey在430个键盘布局中可以键入的所有内容。(许多布局与此目的相同。)特定otp的可能映射是包含otp中每个字符的每个16字符序列

为了有效地找到这一点,我使用反向索引将每个可能的字符映射到使用该字符的键盘布局列表。答案是otp中每个唯一字符的反向索引的每个条目的交点。这几乎总是以恰好1个元素结束

使用
Set()
的良好实现编写此跨浏览器会更容易


到目前为止,代码位于

是一个很好的库,用于在Javascript中进行向量和矩阵运算。这是我现在能想到的唯一一个数学库。

在引发这个问题的程序中,集合是一个数组,相交是

s = [1,2,3];
q = [3,4,5];
sq = s.filter(function(x) {
    return q.indexOf(x) >= 0;
});

当然,它在ie中不起作用。

我不知道任何现有的实现,但是如果您的集合元素是字符串(或具有唯一的字符串表示),那么您可以非常轻松地使用JavaScript对象。元素是对象属性,值可以是任何东西

// Make a set from an array of elements
function makeSet(items) {
    var set = {};
    for (var i = 0; i < items.length; i++) {
        set[items[i]] = true;
    }
    return set;
}

function copyInto(s, copy) {
    for (var item in s) {
        if (s[item] === true) {
            copy[item] = true;
        }
    }
}

function union(s1, s2) {
    var u = {};
    copyInto(s1, u);
    copyInto(s2, u);
    return u;
}

function intersection(s1, s2) {
    var i = {};
    for (var item in s1) {
        if (s1[item] === true && s2[item] === true) {
            i[item] = true;
        }
    }
    return i;
}

function difference(s1, s2) {
    var diff = {};
    copyInto(s1, diff);
    for (var item in s2) {
        if (s2[item] === true) {
            delete diff[item];
        }
    }
    return diff;
}

// etc.
//从元素数组中创建一个集合
函数生成集(项){
变量集={};
对于(变量i=0;i

您也可以在set
或set.hasOwnProperty(item)中使用
item,而不是
set[item]==true
,但是通过显式检查
true
,您会自动忽略可能附加到对象的任何函数(如果有人修改了object.prototype,或者它不是普通对象).

我个人喜欢jPaq()中的操作方式。以下是我成功测试的三个示例:

alert([1,2,3,4,5].subtract([2,3,5]));  // evaluates to [1,4]
alert([1,2,5].union([1,3,4,5]));  // evaluates to [1,2,5,3,4]
alert([1,2,3,5].intersect([0,1,2,4,6]));  // evaluates to [1,2]
jPaq的优点在于,您可以。jPaq使您不必下载任何不需要的额外内容。

通过使用或另一个实现Array.prototype.reduce和Array.prototype.forEach函数的JavaScript库,您可以创建一个接受两个或多个数组的笛卡尔积函数。下面是计算两个或多个数组笛卡尔乘积的函数的代码:

function cartesianProductOf() {
  return Array.prototype.reduce.call(arguments, function(a, b) {
    var ret = [];
    a.forEach(function(a) {
      b.forEach(function(b) {
        ret.push(a.concat([b]));
      });
    });
    return ret;
  }, [[]]);
}
由于这是在一个库中,我愿意接受有关函数命名的建议,以便将其添加到库中。顺便说一下,为了不抄袭,我确实想到了使用reduce from。

使用的reduce方法

函数cartesianProductOf(){
返回u0.reduce(参数、函数(mtrx、VAL){
返回u.reduce(val,函数(数组,val){
返回数组.concat(
_.map(mtrx,函数(行){返回行.concat(val);})
);
}, []);
}, [[]]);
}

我做了一个JavaScript,主要关注高效的
差异
交叉
联合
操作。有空。福克斯和新业务非常受欢迎!:-)

没有。我正在实现一个反向索引,需要一个好的集合求交方法,我发现的所有方法都很糟糕。此外,值得注意的是,jPaq对于数组也有一个uniquify函数。要将其与设置函数一起下载,您可以转到此处:。
。hasOwnProperty
set[item]===true
否更安全?有人不能添加一个值为true的原型吗
Object.prototype.x=true
@Mark,yes
hasOwnProperty
对于这种情况更安全,尽管这取决于您希望它的行为方式。在某些情况下,您可能希望原型中的属性显示在集合中。在实现中是否需要对集合进行排序?看起来您在实现中使用了某种二进制搜索,但是如果元素不按顺序排列,这不会发生故障吗?您是对的,道格!我的实现在很大程度上依赖于已排序的集合。这是使用二进制搜索和使我的求交算法工作所必需的。但是没有排序算法,而是插入元素,以确保其余元素正常工作。