基于1, 2, 3
的幂集,我得到8个子集:[]
,[1]
,[2]
,[2,1]
,[3]
,[3,1]
,[3,2]
,[3,2,1]
。然后,我想生成这个新集合的子集,该子集恰好具有原始集合的1个。
我的幂集的幂集中的子集数量为256,但是只有8个,每个只包含1个“ 1”,“ 2”和“ 3”,分别是:]]
[ [ [1,2,3] ], [ [2,3],[1] ], [ [2],[1,3] ], [ [3],[1,2] ], [ [3],[2],[1] ], [ [],[2],[1,3] ], [ [],[3],[1,2] ], [ [],[3],[2],[1] ] ]
是否有一种方法可以得到最终集合而又不生成具有256个子集的第二幂集?我正在寻找一种可以扩展到第一个3个元素集可以包含10个以上元素的方法,因此计算第二个幂集效率不高。请注意,我实际上并不需要有空数组的情况。我的理想答案将仅包括前5个元素。我可能专注于电源装置,将自己推向错误的兔子洞。它为n = 7解决了我的问题,但没有扩展到n = 14。
这是我目前拥有的功能,但是当数组中有5个项目时,它就会失效。我可能会完全从错误的方向来解决这个问题。
function getPowerset(arr) {
return (function ps(list) {
if (list.length === 0) {
return [
[]
];
}
const head = list.pop();
const tail = ps(list);
return [...tail, ...tail.map((e) => [head, ...e])];
})([...arr]).filter(x => x.length);
}
function getCombinationsOfSet(arr) {
const subsets = getPowerset(arr);
const subsetsOfSubsets = getPowerset(subsets);
return subsetsOfSubsets.filter((subset) => {
const flattened = subset.flat();
if (flattened.length !== arr.length) {
return false;
}
let tempArr = [...arr];
for (let part of flattened) {
const index = tempArr.indexOf(part);
if (index === -1) {
return false;
}
tempArr.splice(index, 1);
}
return true;
})
}
console.time('time-taken');
console.log(getCombinationsOfSet([1, 2, 3]));
console.timeEnd('time-taken');
给出1、2、3的幂集,我得到8个子集:[],[1],[2],[2,1],[3],[3,1],[3,2],[ 3,2,1]。然后,我想生成这个新集合的子集,该子集恰好具有原始集合的1个子集。 ...