Javascript 将数组(元素组合)划分为自定义分区的所有方法

Javascript 将数组(元素组合)划分为自定义分区的所有方法,javascript,algorithm,grouping,combinations,combinatorics,Javascript,Algorithm,Grouping,Combinations,Combinatorics,我想将n个元素的数组划分为给定大小的子数组,其中包含所有可能的元素组合 例如: 数组:{1,2,3,4}-可以是n个元素,1l=>temp.slice(i,i+=l))(0)) :温度; } 函数阶乘(num){ var结果=1; while(num){ 结果*=num; num--; } 返回结果; } 变量i,l, 数组=['1','2','3','4'], 子集=[2,2], pre=document.getElementById('out'); 对于(i=0,l=阶乘(array.len

我想将n个元素的数组划分为给定大小的子数组,其中包含所有可能的元素组合

例如:

数组:
{1,2,3,4}
-可以是n个元素,1 给定的大小模式(例如,可能不同):
[2-子阵列,2-元素]

预期结果:

{1,2},{3,4}
{1,3},{2,4}
{1,4},{2,3}

{2,1},{3,4}
{1,3},{4,2}
{3,2},{1,4}

等等。。如您所见,子阵列中元素的顺序或子阵列集合中的子阵列顺序并不重要。它必须是输入阵列子阵列的最小集合数

我必须给出下面的解,但它也包括置换。我需要对其进行优化,以避免产生任何排列。JavaScript不是必需的,任何语言都可以。提前感谢您的帮助。
函数getN(n,数组,子集){
变量f,
l=数组长度,
指数=[],
临时雇员
array=array.slice();
而(l--){
f=阶乘(l);
指数推动(数学楼层(n/f));
n%=f;
}
temp=index.map(i=>array.splice(i,1)[0]);
返回子集
?子集映射((i=>l=>temp.slice(i,i+=l))(0))
:温度;
}
函数阶乘(num){
var结果=1;
while(num){
结果*=num;
num--;
}
返回结果;
}
变量i,l,
数组=['1','2','3','4'],
子集=[2,2],
pre=document.getElementById('out');
对于(i=0,l=阶乘(array.length);i

这里有一个递归公式,它将枚举实际元素的组合。在列表中,
[2,2]
,每个
2
都被视为不同的元素。我们可以输入像
[1,2,3,4,5,6]
这样的任意模式,并将其分为所有模式组合
[[x],[x,x],[x,x]

功能f(ns、SUB){
如果(ns.length!=subs.reduce((a,b)=>a+b))
抛出新错误(“子集基数不匹配”);
函数g(i,_subs){
如果(i==ns.长度)
返回[_subs];
设res=[];
常量基数=新集合();
函数h(j){
让temp=_subs.map(x=>x.slice());
温度[j]。推力(ns[i]);
res=res.concat(g(i+1,温度));
}
对于(设j=0;j_subs.push([]);
返回g(0,_subs);
}
log('\n[0,1,2,3],[2,2]:');
设str='';
对于(设i/f([0,1,2,3],[2,2]))
str+='\n'+JSON.stringify(i);
console.log(str);
log('\n[0,1,2,3],[1,3]:');
str='';
对于(设i/f([0,1,2,3],[1,3]))
str+='\n'+JSON.stringify(i);
console.log(str);
日志('\n[0,1,2,3,4,5,6,7,8,9],[1,2,3,4]:');
str='';
对于(设i/f([0,1,2,3,4,5,6,7,8,9],[1,2,3,4]))
str+='\n'+JSON.stringify(i);

console.log(str);
我想您需要数组的组合

Array.prototype.combines=函数(n){
返回这个.reduce((p,c,i,a)=>p.concat(n>1?a.slice(i+1).组合(n-1).映射(e=>[].concat(e,c))
:[[c]],[]);
};
var结果=[1,2,3,4]。组合(2);
log(JSON.stringify(result));
结果=[1,2,3,4,5,6]。组合(3);

console.log(JSON.stringify(result));
解决方案是从结果数组中删除置换。是的,我知道,但我正在寻找快速优化的解决方案,而不是生成置换。约束是什么?Pham Trung,你所说的约束是什么意思?不,它不是重复的。这与问题相反。我需要去除置换,而不是生成它们。与我的答案不同,这是不允许像[1,2,3,4,5,6]这样的任意模式与模式[[x]、[x,x]、[x,x,x]]组合。仔细想想,我不确定这是否真的回答了这个问题。很好的解决方案,我认为这是一个具有挑战性的实现,很高兴看到您很好地把它放好:)。