创建一个幂集:{"A", "B", "C"}。
伪代码:
val set = {"A", "B", "C"}
val sets = {}
for item in set:
for set in sets:
sets.add(set + item)
sets.add({item})
sets.add({})
算法说明:
1) 将sets 初始化为一个空集:{}。
2) 遍历{"A", "B", "C"}中的每一项
3) 遍历sets 中的每个set。
3.1) 创建一个新集合,它是set 的副本。
3.2) 将item 附加到new set。
3.3) 将new set 附加到sets。
4) 将item 添加到您的sets。
4) 迭代完成。将空集添加到您的 resultSets。
演练:
我们看一下每次迭代后sets的内容:
迭代 1,item = "A":
sets = {{"A"}}
迭代 2,item = "B":
sets = {{"A"}, {"A", "B"}, {"B"}}
迭代 3,item = "C":
sets = {{"A"}, {"A", "B"}, {"B"}, {"A", "C"}, {"A", "B", "C"}, {"B", "C"}, {"C"}}
迭代完成,添加空集:
sets = {{"A"}, {"A", "B"}, {"B"}, {"A", "C"}, {"A", "B", "C"}, {"B", "C"}, {"C"}, {}}
集合的大小是 2^|set| = 2^3 = 8 这是正确的。
Java 中的示例实现:
public static <T> List<List<T>> powerSet(List<T> input) {
List<List<T>> sets = new ArrayList<>();
for (T element : input) {
for (ListIterator<List<T>> setsIterator = sets.listIterator(); setsIterator.hasNext(); ) {
List<T> newSet = new ArrayList<>(setsIterator.next());
newSet.add(element);
setsIterator.add(newSet);
}
sets.add(new ArrayList<>(Arrays.asList(element)));
}
sets.add(new ArrayList<>());
return sets;
}
输入:[A, B, C]
输出:[[A], [A, C], [A, B], [A, B, C], [B], [B, C], [C], []]