创建一个幂集:{"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) 遍历set
您的sets
.
3.1) 创建一个新集合,它是set
.
3.2) 将 附加item
到new set
.
3.3) 附加new set
到sets
.
4) 添加item
到您的sets
.
4) 迭代完成。将空集添加到您的resultSets
.
演练:
再来看看sets
每次迭代后的内容:
迭代 1,项目 = “A”:
sets = {{"A"}}
迭代 2,项目 =“B”:
sets = {{"A"}, {"A", "B"}, {"B"}}
迭代 3,项目 =“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], []]