Создайте набор мощности: {"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, элемент = "А":
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], []]
person
Cristian
schedule
23.03.2016