J'étudie pour une entrevue et je suis tombé sur cette question en ligne dans la catégorie "Math".
Générer un ensemble de puissance d'un ensemble donné:
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;
}
S'il vous plaît, je ne veux pas de réponse explicite. Je veux juste des éclaircissements et des conseils sur la façon d'aborder ce problème.
J'ai vérifié l'algorithme de réglage de l'alimentation sur google et je ne comprends toujours pas comment résoudre ce problème.
Aussi, quelqu'un pourrait-il répéter ce que la question demande.
Je vous remercie.
Power set of a set A is the set of all of the subsets of A.
Ce n'est pas la définition la plus conviviale au monde, mais un exemple aidera:
Par exemple. pour {1, 2}
, les sous-ensembles sont les suivants: {}, {1}, {2}, {1, 2}
Ainsi, le jeu de puissance est {{}, {1}, {2}, {1, 2}}
Laissez cette décision être indiquée par un peu (1/0).
Ainsi, pour générer {1}
, vous allez choisir 1
et abandonner 2
(10).
Sur des lignes similaires, vous pouvez écrire un vecteur de bits pour tous les sous-ensembles:
Pour réitérer: Un sous-ensemble s'il est formé en incluant tout ou partie des éléments de l'ensemble d'origine. Ainsi, pour créer un sous-ensemble, accédez à chaque élément, puis décidez de le conserver ou de le supprimer. Cela signifie que pour chaque élément, vous avez 2 décisions. Ainsi, pour un ensemble, vous pouvez vous retrouver avec 2^N
décisions différentes, correspondant à 2^N
sous-ensembles différents.
Voyez si vous pouvez aller le chercher d'ici.
L'ensemble de puissance est juste l'ensemble de tous les sous-ensembles pour l'ensemble donné. Il comprend tous les sous-ensembles (avec ensemble vide). Il est bien connu qu'il y a 2N éléments de cet ensemble, où N
est le nombre d'éléments de l'ensemble d'origine.
Pour construire un ensemble de puissance, on peut utiliser ce qui suit:
N
bits (pour les nombres plus petits, ajoutez des zéros non significatifs). Chaque bit correspond, si le membre de certains ensembles est inclus dans le sous-ensemble actuel.Exemple, 3 nombres: 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}
Créez un ensemble de puissance de:
{"A", "B", "C"}
.
Pseudo-code:
val set = {"A", "B", "C"}
val sets = {}
for item in set:
for set in sets:
sets.add(set + item)
sets.add({item})
sets.add({})
Explication de l'algorithme:
1) Initialisez sets
dans un ensemble vide: {}
.
2) Itérer sur chaque élément dans {"A", "B", "C"}
3) Parcourez chaque set
de votre sets
.
3.1) Créez un nouvel ensemble qui est une copie de set
.
3.2) Ajoutez la item
au new set
.
3.3) Ajoutez le new set
à sets
.
4) Ajoutez la item
à votre sets
.
4) L'itération est terminée. Ajoutez le jeu vide à votre resultSets
.
Procédure pas à pas:
Regardons le contenu de sets
après chaque itération:
Itération 1, item = "A":
sets = {{"A"}}
Itération 2, item = "B":
sets = {{"A"}, {"A", "B"}, {"B"}}
Itération 3, item = "C":
sets = {{"A"}, {"A", "B"}, {"B"}, {"A", "C"}, {"A", "B", "C"}, {"B", "C"}, {"C"}}
Itération terminée, ajouter un ensemble vide:
sets = {{"A"}, {"A", "B"}, {"B"}, {"A", "C"}, {"A", "B", "C"}, {"B", "C"}, {"C"}, {}}
La taille des ensembles est de 2 ^ | set | = 2 ^ 3 = 8 ce qui est correct.
Exemple d'implémentation en 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;
}
Entrée: [A, B, C]
Sortie: [[A], [A, C], [A, B], [A, B, C], [B], [B, C], [C], []]
Eh bien, vous devez générer tous les sous-ensembles. Pour un ensemble de taille n, il y a 2n sous-ensembles.
Une solution serait de parcourir les nombres de 0 à 2n - 1 Et convertissez-les chacun en une liste de chiffres binaires, où 0
signifie exclure Cet élément et 1
signifie l'inclure.
Une autre façon serait avec récursion, diviser et conquérir.
Générer toutes les combinaisons d'un ensemble (en incluant ou non un article). expliquer par l'exemple: 3 éléments dans un ensemble (ou une liste). Le sous-ensemble possible sera:
000
100
010
001
110
101
011
111
Le résultat est 2 ^ (nombre d'éléments dans l'ensemble).
En tant que tel, nous pouvons générer toutes les combinaisons de N éléments (avec python) comme suit:
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)
Vous obtenez quelque chose comme ça en mettant en œuvre la réponse la mieux notée.
def printPowerSet(set,set_size):
# set_size of power set of a set
# with set_size n is (2**n -1)
pow_set_size = (int) (math.pow(2, set_size));
counter = 0;
j = 0;
# Run from counter 000..0 to 111..1
for counter in range(0, pow_set_size):
for j in range(0, set_size):
# Check if jth bit in the
# counter is set If set then
# pront jth element from set
if((counter & (1 << j)) > 0):
print(set[j], end = "");
print("");