Как сгенерировать набор мощности заданного набора?
Я учусь на собеседование, и я наткнулся на этот вопрос онлайн в разделе "Математика".
Сгенерировать набор мощности заданного набора:
int A[] = {1,2,3,4,5};
int N = 5;
int Total = 1 << N;
for ( int i = 0; i < Total; i++ ) {
for ( int j = 0; j < N; j++) {
if ( (i >> j) & 1 )
cout << A[j];
}
cout <<endl;
}
Пожалуйста, я не хочу явного ответа. Я просто хочу уточнения и подсказки о том, как подойти к этой проблеме.
Я проверил алгоритм установки мощности на google, и я до сих пор не понимаю, как решить эту проблему.
Кроме того, кто-то может повторить то, что задает вопрос.
Спасибо.
Ответы
Ответ 1
Power set of a set A is the set of all of the subsets of A.
Не самое дружественное определение в мире, но пример поможет:
Например. для {1, 2}
подмножества: {}, {1}, {2}, {1, 2}
Таким образом, набор мощности {{}, {1}, {2}, {1, 2}}
Чтобы сгенерировать набор мощности, обратите внимание на то, как вы создаете подмножество: вы переходите к каждому элементу один за другим, а затем сохраняете его или игнорируете. Пусть это решение указывается бит (1/0).
Таким образом, чтобы сгенерировать {1}
, вы выберете 1
и опустите 2
(10).
Аналогичным образом вы можете написать бит-вектор для всех подмножеств:
- {} → 00
{1} → 10
{2} → 01
{1,2} → 11
Повторить: Подмножество, если оно сформировано путем включения некоторых или всех элементов исходного набора. Таким образом, чтобы создать подмножество, вы переходите к каждому элементу, а затем решаете, сохранять его или отбрасывать. Это означает, что для каждого элемента у вас есть 2 решения. Таким образом, для набора вы можете получить 2^N
различных решений, соответствующих 2^N
различным подмножествам.
Посмотри, можешь ли ты оттуда отсюда.
Ответ 2
Набор мощности - это всего лишь набор всех подмножеств для данного набора. Он включает все подмножества (с пустым множеством). Хорошо известно, что в этом наборе есть 2 N элементов, где N
- количество элементов в исходном множестве.
Для создания питания можно использовать следующую вещь:
- Создайте цикл, который выполняет итерацию всех целых чисел от 0 до 2 N -1
- Перейдите к двоичному представлению для каждого целого числа
- Каждое двоичное представление представляет собой набор из
N
бит (для меньших чисел, добавлять начальные нули). Каждый бит соответствует, если определенный член набора включен в текущее подмножество.
Пример: 3 числа: a
, b
, c
number binary subset
0 000 {}
1 001 {c}
2 010 {b}
3 011 {b,c}
4 100 {a}
5 101 {a,c}
6 110 {a,b}
7 111 {a,b,c}
Ответ 3
Создайте блок питания: {"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, 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], []]
Ответ 4
Ну, вам нужно сгенерировать все подмножества. Для набора размеров n существует 2 n подмножеств.
Один из способов - перебрать числа от 0 до 2 n - 1 и преобразовать их в список двоичных цифр, где 0
означает исключение этого элемента, а 1
означает его включение.
Другой способ - рекурсия, разделить и победить.
Ответ 5
Создание всей комбинации набора (путем включения или отсутствия элемента). объясните на примере: 3 элемента в наборе (или списке). Возможным подмножеством будет:
000
100
010
001
110
101
011
111
Результат равен 2 ^ (количество элементов в множестве).
Таким образом, мы можем сгенерировать все комбинации из N элементов (с помощью python) следующим образом:
def powerSet(items):
N = len(items)
for i in range(2**N):
comb=[]
for j in range(N):
if (i >> j) % 2 == 1:
comb.append(items[j])
yield comb
for x in powerSet([1,2,3]):
print (x)
Ответ 6
Пример кода Java:
void printPowerSetHelper(String s, String r) {
if (s.length() > 0) {
printPowerSetHelper(s.substring(1), r + s.charAt(0));
printPowerSetHelper(s.substring(1), r);
}
if (r.length() > 0) System.out.println(r);
}
void printPowerSet(String s) {
printPowerSetHelper(s,"");
}