Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取列表的get Powerset的最佳方法(递归)_Java_Combinations_Set_Powerset - Fatal编程技术网

Java 获取列表的get Powerset的最佳方法(递归)

Java 获取列表的get Powerset的最佳方法(递归),java,combinations,set,powerset,Java,Combinations,Set,Powerset,为了获得列表的幂集,我实现了以下功能: public static ArrayList<ArrayList<Integer>> getAllSubsets(ArrayList<Integer> set, int index, ArrayList<Integer> subset){ ArrayList<ArrayList<Integer>> subsets = new ArrayList<ArrayList<

为了获得列表的幂集,我实现了以下功能:

public static ArrayList<ArrayList<Integer>> getAllSubsets(ArrayList<Integer> set, int index, ArrayList<Integer> subset){
    ArrayList<ArrayList<Integer>> subsets = new ArrayList<ArrayList<Integer>>();

    if(index == set.size()){
        subsets.add(new ArrayList<Integer>(subset));
        return subsets;
    }

    subsets.addAll(getAllSubsets(set, index + 1, subset));
    subset.add(set.get(index));
    subsets.addAll(getAllSubsets(set, index + 1, subset));
    subset.remove(subset.size()-1);
    return subsets;
}
publicstaticarraylist出现在我的谷歌搜索中,但他的实现(JoaoSilva)使用了大量复制,似乎不是最优的。然而,我经常看到他的实现,这让我感到困惑。这个实现比我正在使用的更好吗(当然,除了他正在使用泛型之外)

他的代码:

public static <T> Set<Set<T>> powerSet(Set<T> originalSet) {
    Set<Set<T>> sets = new HashSet<Set<T>>();
    if (originalSet.isEmpty()) {
        sets.add(new HashSet<T>());
        return sets;
    }
    List<T> list = new ArrayList<T>(originalSet);
    T head = list.get(0);
    Set<T> rest = new HashSet<T>(list.subList(1, list.size())); 
    for (Set<T> set : powerSet(rest)) {
        Set<T> newSet = new HashSet<T>();
        newSet.add(head);
        newSet.addAll(set);
        sets.add(newSet);
        sets.add(set);
    }       
    return sets;
}
公共静态设置电源集(设置原始设置){
Set Set=新的HashSet();
if(originalSet.isEmpty()){
add(newhashset());
返回集;
}
列表列表=新的ArrayList(originalSet);
T head=list.get(0);
Set rest=newhashset(list.subList(1,list.size());
用于(组:动力组(其余)){
Set newSet=newhashset();
新闻集添加(标题);
newSet.addAll(集合);
添加(新闻集);
集合。添加(集合);
}       
返回集;
}
您可能会发现这很有用。它包含各种语言和使用不同方法的powerset实现。对于Java,有三种方法:

  • 迭代的
  • 递归的
  • 并使用二进制字符串
  • 其实我最喜欢第三条路,因为这里面有个好主意。不同之处在于,它们假设输入是一个
    字符串


    顺便说一句,如果要在生产中使用任何代码,我宁愿避免使用递归,因为堆栈可能存在问题(不幸的是,Java中仍然不支持尾部递归)

    您的优先级是递归还是优化?我只是想以最佳方式实现递归形式。我很惊讶有这么多糟糕/懒惰的实现。对于纯优化,我将迭代地实现它。