所谓幂集(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