0

我有一个程序,它涉及以下函数,用于计算给定数组的所有可能组合:

function combinations(arr, k) {
var i,
subI,
sub,
combinationsArray = [],
next;
for (i = 0; i < arr.length; i++) {
    if (k === 1) {
        combinationsArray.push([arr[i]]);
    } else {
        sub = combinations(arr.slice(i + 1, arr.length), k - 1);
        for (subI = 0; subI < sub.length; subI++) {
            next = sub[subI];
            next.unshift(arr[i]);
            combinationsArray.push(next);
        }
    }
}
return combinationsArray;
};

例如:

 combinations([1,2,3],2);

返回:

[[1,2],[1,3],[2,3]]

我在我的程序中经常使用它,特别是带有 12 个对象的数组参数,以从该数组返回两个对象的所有可能组合。有 66 种可能的组合。在我的程序中,我需要经常检查此函数返回的数组的对象元素的属性值,对它们进行比较,对它们运行条件等。但是当我调用使用这样的组合函数的函数时,浏览器会崩溃( firefox 返回消息:“此页面上的脚本可能正忙,或者可能已停止响应。您可以立即停止脚本,在调试器中打开脚本,或者让脚本继续。”)它始终是上面的组合函数被调用,它崩溃了。

我发现了这个:http ://www.nczonline.net/blog/2009/01/13/speed-up-your-javascript-part-1/ 这是提高调用代码效率的好方法重复函数(例如在组合函数中)。

如何有效地将组合功能与 ncsonline 的方法集成以阻止浏览器崩溃?

4

2 回答 2

2

这是使用web workers的一个很好的选择,它在一个单独的线程上运行你的代码。

这样,您就不会通过密集计算锁定 UI 线程(这就是您现在看到的)。

于 2012-06-14T17:10:01.640 回答
0

为什么要构建数组?您可以遍历所有组合并在循环内完成工作吗?这应该会大大加快您的逻辑并让您适应浏览器强加的限制。

于 2012-06-14T17:37:16.050 回答