Java 计算功率集的算法

Java 计算功率集的算法,java,algorithm,math,Java,Algorithm,Math,我刚刚发现了一个求幂集的算法。我在谷歌上搜索解决方案,但没有找到任何有效的,所以我自己找到了一个。但我想知道它是什么算法,因为我在网上或任何书籍中都找不到它。我是说,它有名字吗?与我在一些网站上找到的计算功率集的算法相比,我认为我的算法要好得多,我想知道为什么没有人使用它 这是算法: R <- [] L <- [ e1, e2 ... en ] c <- 0 function: powerSet(L, c) R <- R union L for e in L st

我刚刚发现了一个求幂集的算法。我在谷歌上搜索解决方案,但没有找到任何有效的,所以我自己找到了一个。但我想知道它是什么算法,因为我在网上或任何书籍中都找不到它。我是说,它有名字吗?与我在一些网站上找到的计算功率集的算法相比,我认为我的算法要好得多,我想知道为什么没有人使用它

这是算法:

R <- []
L <- [ e1, e2 ... en ]
c <- 0
function: powerSet(L, c)
  R <- R union L
  for e in L starting at c
    powerSet(L\{e}, c)
  end
  return R
end

R主要有两个原因:

  • 它使用全局变量
  • 它是递归的,尽管这并不重要,因为它是一个
    O(2^n)
    算法 请看一下这一页。这里有一些递归解决方案的实现(包括Java实现)。不过,一般来说,递归解决方案意味着一个大得离谱的调用堆栈,这会减慢速度。

    公共最终静态集powerSet(Set s){
    
    public final static Set<Set<Character>> powerSet(Set<Character> s){
        Set<Set<Character>> result = new HashSet<Set<Character>>();
        result.add(s);
        for (Character c:s){
            Set<Character> subSet = new HashSet<Character>(s);
            subSet.remove(c);
            result.addAll(powerSet(subSet));
        }
        return result;
    }
    
    Set result=new HashSet(); 结果。添加(s); 用于(字符c:s){ 集合子集=新哈希集; 删除(c); 结果.addAll(powerSet(子集)); } 返回结果; }
    +1。它还为原始集合中的每个元素添加空集合。我应该指出,我只将我的算法与其他O(2^n)算法进行比较。我知道它太慢了。我提出了这个算法,因为我们在学校有一个任务,要创建一个暴力算法。但作为一个蛮力算法,我觉得我的我真的很好。我真的不明白为什么使用全局变量会有问题。在许多情况下,您实际上并不将集合存储在结果中,而是对集合执行操作。ChssPly76,它只添加了一个空集,这就是空集。算法的结果是幂集,而不是别的。幂集由2^n个元素组成,因此算法必须至少是
    O(2^n)
    ,除非我大错特错@rejeep-1:用于用低效代码恢复死线:-)这是ω(n!)。不是O(2^n)。
    public final static Set<Set<Character>> powerSet(Set<Character> s){
        Set<Set<Character>> result = new HashSet<Set<Character>>();
        result.add(s);
        for (Character c:s){
            Set<Character> subSet = new HashSet<Character>(s);
            subSet.remove(c);
            result.addAll(powerSet(subSet));
        }
        return result;
    }