生成完全包含原始集中元素的子集的所有组合

问题描述 投票:0回答:1

基于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个子集。 ...

javascript combinations permutation powerset
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.