Java 求集的幂集
[家庭作业] 我们必须用java或C++找到给定集合的幂集。该集合将以任意大小的数组形式被接受,我需要显示该集合的幂集合的元素。请注意,唯一要使用的概念是数组、循环和函数(递归和迭代) 我需要有人给我指出我可以应用的逻辑的正确方向。 请帮忙 PS:集合a的幂集是集合a的所有子集的集合 例如A={A,b,c} A={{},{A},{b},{c},{A,b},{b,c},{A,c},{A,b,c}的幂集Java 求集的幂集,java,c++,algorithm,set,Java,C++,Algorithm,Set,[家庭作业] 我们必须用java或C++找到给定集合的幂集。该集合将以任意大小的数组形式被接受,我需要显示该集合的幂集合的元素。请注意,唯一要使用的概念是数组、循环和函数(递归和迭代) 我需要有人给我指出我可以应用的逻辑的正确方向。 请帮忙 PS:集合a的幂集是集合a的所有子集的集合 例如A={A,b,c} A={{},{A},{b},{c},{A,b},{b,c},{A,c},{A,b,c}的幂集 编辑: 非常感谢“wy”和“MrSmith42”我已经使用他们给出的逻辑编写了我的程序。现在我
编辑: 非常感谢“wy”和“MrSmith42”我已经使用他们给出的逻辑编写了我的程序。现在我正在尝试优化它。请注意,我是Java新手,由于它的新颖性,我觉得它有点不舒服 这是我的密码:
import java.util.Scanner;
public class PowerSet {
//Function to increment binary string...
static String incr_bin (String binary){
char bin[] = new char[100];
int size_bin, i;
size_bin = binary.length();
bin = binary.toCharArray();
bin[size_bin-1]++;
for(i=size_bin-1; i>=0; i--){
if (i != 0){
if(bin[i] > '1'){
bin[i]='0';
bin[i-1]++;
}
}
}
if (bin[0]>'1'){
for(i=0;i<size_bin;i++){
bin[i]='0';
}
}
binary = new String (bin);
return binary;
}
public static void main(String[] args) {
//Declarations
Scanner in = new Scanner (System.in);
int a[] = new int [100];
int size_a, i, count=0;
String binary;
//Input
System.out.println("Enter the number of elements in A : ");
size_a = in.nextInt();
char bin[] = new char [size_a];
System.out.println("Enter the elements in A : ");
for(i=0; i<size_a; i++){
a[i] = in.nextInt();
bin[i] = '0';
}
binary = new String(bin);
//Calculating and Setting up subsets
System.out.println("MEMBERS OF POWER SET :");
do{
System.out.print("\n{.");
count = 0;
binary = incr_bin(binary);
bin = binary.toCharArray();
for(i=0; i<size_a; i++){
if (bin[i] == '0') count++;
if (bin[i] == '1') System.out.print(a[i] + " ");
}
System.out.println("}");
}while(count!=size_a);
}
}
import java.util.Scanner;
公共类功率集{
//函数以递增二进制字符串。。。
静态字符串增量(字符串二进制){
char bin[]=新字符[100];
int size_bin,i;
size_bin=binary.length();
bin=binary.toCharArray();
bin[大小_bin-1]++;
对于(i=size\u bin-1;i>=0;i--){
如果(i!=0){
如果(bin[i]>'1'){
bin[i]=“0”;
bin[i-1]++;
}
}
}
如果(bin[0]>'1'){
对于(i=0;i,可以将幂集的每个元素映射到一个二进制数,其位数与幂集的大小相同
e、 g
您可以将幂集的每个元素映射到一个二进制数,其位数与幂集的大小相同
e、 g
在Alogrithm设计手册的“14.5生成子集”中,有三种输出电源组的方法,我已经尝试了所有这些方法,仅使用阵列、环路和功能。但是没有代码。以下是关于它们的简短段落:
1.词典顺序–词典顺序表示排序顺序,是
通常是生成组合对象的最自然的方式
按照字典顺序{1,2,3}的八个子集是{},{1},{1,
2} ,{1,2,3},{1,3},{2},{2,3},和{3}。但令人惊讶的是
很难按字典顺序生成子集。除非
这是一个令人信服的理由,不用麻烦了。
2.格雷码–一个特别有趣和有用的子集序列是最小变更顺序,其中相邻子集的差异为
只插入或删除一个元素。这种顺序称为
格雷码。按格雷码顺序生成子集可以非常快,
因为有一个很好的递归构造。构造一个格雷码
n的− 1元素Gn−1反转>第二份Gn−1并将n添加到
此副本中的每个子集。然后将它们连接在一起以创建Gn。
此外,由于子集之间只有一个元素发生变化,因此
基于格雷码的搜索算法非常有效。
3.二进制计数–子集生成问题的最简单方法是基于观察到任何子集S'由
S的项在S中。我们可以用二进制字符串表示S
在n位中,位i是1iff,S的第i个元素在S'中
定义长度为2n的二进制字符串之间的双射
n、 和n项的2n子集。对于n=3,二进制计数
按以下顺序生成子集:{}、{3}、{2}、{2,3}、{1},
{1,3},{1,2},{1,2,3}。这种二进制表示是
解决所有子集生成问题。在
顺序,只需从0到2n-1进行计数。对于每个整数,
依次屏蔽每个位,并组成一个子集
对应于1位的项。生成下一个或上一个
子集,将整数增加或减少1。取消子集的等级
实际上是掩蔽过程,而排序构造了一个二进制文件
与s中的项对应的1编号,然后将其转换为
将二进制数转换为整数
如果你想要一个简单的,只需二进制计数就足够了,它可以是回溯或特定的。如果你已经这样做了并且想要更多的挑战,你可以编码一个格雷码。你可以在它的wiki页面上学习如何生成格雷码。要输出功率集,“14.5生成子集”中有三种方法,Alogrithm设计手册,我已经用数组、循环和函数尝试了所有这些。但是没有代码。以下是关于它们的简短段落:
1.词典顺序–词典顺序表示排序顺序,是
通常是生成组合对象的最自然的方式
按照字典顺序{1,2,3}的八个子集是{},{1},{1,
2} ,{1,2,3},{1,3},{2},{2,3},和{3}。但令人惊讶的是
很难按字典顺序生成子集。除非
这是一个令人信服的理由,不用麻烦了。
2.格雷码–一个特别有趣和有用的子集序列是最小变更顺序,其中相邻子集的差异为
只插入或删除一个元素。这种顺序称为
格雷码。按格雷码顺序生成子集可以非常快,
因为有一个很好的递归构造。构造一个格雷码
n的− 1元素Gn−1反转>第二份Gn−1并将n添加到
此副本中的每个子集。然后将它们连接在一起以创建Gn。
此外,由于子集之间只有一个元素发生变化,因此
基于格雷码的搜索算法非常有效。
3.二进制计数–子集生成问题的最简单方法是基于观察到任何子集S'由
S的项在S中。我们可以用二进制字符串表示S
在n位中,位i是1iff,S的第i个元素在S'中
定义
A = { a, b, c}
binary number => resulting subset
000 => { } // no 'a', no 'b', no 'c'
001 => { c}
010 => { b }
011 => { b,c}
100 => {a }
101 => {a, c}
110 => {a,b }
111 => {a,b,c}
/**
* Prints all subsets of a list
* @param list
*/
public static void printSubsets(List<Integer> list) {
int max = (int)Math.pow(2, list.size());
for (int i = 0; i < max; i++) {
// Convert int to bitset
BitSet bs = getConvertedBitSet(i, list.size());
// Use bitset to print the subset
printSubset(bs, list);
}
}
/**
* Helper function for {@link org.vikastaneja.companies.Expedia#printSubsets(java.util.List)}<br/>
* This function prints the subsets for the bits that are set in bitset
* @param bs
* @param list
*/
private static void printSubset(BitSet bs, List<Integer> list) {
if (list == null) {
throw new NullPointerException("Set is empty");
}
System.out.print("{ ");
for (int i = 0; i < list.size();i++) {
if (bs.get(i)) {
System.out.print(list.get(i) + " ");
}
}
System.out.print("}");
System.out.println();
}
/**
* Helper function for {@link org.vikastaneja.companies.Expedia#printSubsets(java.util.List)}<br/>
* This function converts an integer to the bitset
* @param value
* @param size
* @return
*/
private static BitSet getConvertedBitSet(int value, int size) {
BitSet bits = new BitSet(size);
bits.set(0, size - 1, false);
int index = 0;
while (value != 0) {
if (value % 2 != 0) {
bits.set(index);
}
++index;
value = value >>> 1;
}
return bits;
}
for i in 0..len(s):
if s[i]:
s[i] = 0
else:
s[i] = 1
break