JS 实现计算获取某一集合的幂集的函数

所谓幂集(Power Set), 就是原集合中所有的子集(包括全集和空集)构成的集族。

对任何集合A,A的幂集P(A)={x|x⊆A}。

 

  (图1. 幂集产出步骤-出自《计算机科学精粹》)

 

示例代码(可以用Set代替Array):

/**
 * 获取某个集合的幂集
 */
function getPowerSet(set) {
  // 幂集对象,
  // 初始化时,默认有1个空集(空集是任何集合的子集、任何非空集合的真子集)
  let powerSet = [[]];

  for (const el of set) {
    // 复制已有的集合
    const newPowerSet = copy(powerSet);
    // 并将当前元素添加到被复制的各个集合当中
    for (const item of newPowerSet) {
      item.push(el);
    }
    // 更新幂集(原幂集元素+新幂集元素)
    powerSet = [...powerSet, ...newPowerSet];
  }

  return powerSet;
}

/**
 * 复制集合
 */
var copy = function(powerSet) {
  const newPowerSet = [];
  for (const set of powerSet) {
    newPowerSet.push([...set]);
  }

  return newPowerSet;
};

 

测试用例

var set = ['A', 'B', 'C', 'D'];
var output = getPowerSet(set);

console.log(output);
// Output:
// 0: []
// 1: ['A']
// 2: ['B']
// 3: (2)['A', 'B']
// 4: ['C']
// 5: (2)['A', 'C']
// 6: (2)['B', 'C']
// 7: (3)['A', 'B', 'C']
// 8: ['D']
// 9: (2)['A', 'D']
// 10: (2)['B', 'D']
// 11: (3)['A', 'B', 'D']
// 12: (2)['C', 'D']
// 13: (3)['A', 'C', 'D']
// 14: (3)['B', 'C', 'D']
// 15: (4)['A', 'B', 'C', 'D']
// length: 16

 

 

End

posted @ 2022-05-15 22:07  樊顺  阅读(154)  评论(0编辑  收藏  举报