Java 求集的幂集

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”我已经使用他们给出的逻辑编写了我的程序。现在我

[家庭作业]

我们必须用java或C++找到给定集合的幂集。该集合将以任意大小的数组形式被接受,我需要显示该集合的幂集合的元素。请注意,唯一要使用的概念是数组、循环和函数(递归和迭代)

我需要有人给我指出我可以应用的逻辑的正确方向。 请帮忙

PS:集合a的幂集是集合a的所有子集的集合 例如A={A,b,c} A={{},{A},{b},{c},{A,b},{b,c},{A,c},{A,b,c}的幂集


编辑:

非常感谢“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