<分区>
输入:
[ [a1,b1,c1], [a2,b2,c2,d,2], [a3,b3], ...]
输出:
[ [a1,a2,a3], [a1,a2,b3], [a1,b2,a3], [a1,b2,b3], [a1,c2,a3], [a1,c2,b3], ... ]
所以我需要所有可能集合的组合(顺序无关紧要)。每个输出集 nth
成员都是 nth
输入集的成员。我需要高效的算法,最好是在 javascript 中。
编辑
好吧,我正在努力解决这个问题。
var input = [ [a,b,c], [a1,b1,c1], [a2,b2] ];
var combinationsNum = _.reduce(input,function(num,set){ return num*set.length; }, 1);
var output = new Array(combinationsNum);
for(var i = 0; i < output.length; ++i) output[i] = [];
for(var s = 0; s < input.length; ++s) {
var set = input[s];
for(var m = 0; m < set.length; ++m) {
var memeber = set[m];
// now I need to calculate to which output arrays I have to push this member
}
}
// result should be
// a a1 a2
// a b1 b2
// a c1 a2
// a a1 b2
// a b1 a2
// a c1 b2
// b a1 a2
// b b1 b2
// b c1 a2
// b a1 b2
// b b1 a2
// b c1 b2
// c a1 a2
// c b1 b2
// c c1 a2
// c a1 b2
// c b1 a2
// c c1 b2
正如您在每个 set
上看到的那样,我必须以一定的间隔和时间将其每个成员推送到每个输出数组...我在计算时遇到问题...
我在这个重复问题中找到的最快方法是:
function(arg) {
var r = [], max = arg.length-1;
function helper(arr, i) {
for (var j=0, l=arg[i].length; j<l; j++) {
var a = arr.slice(0); // clone arr
a.push(arg[i][j])
if (i==max) {
r.push(a);
} else
helper(a, i+1);
}
}
helper([], 0);
return r;
};