计算功率集的算法
我刚刚发现了一种寻找功率集的算法。 我用google搜索解决方案,但发现没有任何好处,所以我自己想出了一个。 但我想知道它是什么算法,因为我无法在网上或任何书籍中找到它。 我的意思是,它有名字吗? 与我在某些网站上发现的用于计算功率集的算法相比,我认为我的function要好得多,并且想知道为什么没有人使用它?
这是算法:
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
在这里,它是用Java实现的:
public static void powerSet(List list, int count) { result.add(list); for(int i = count; i < list.size(); i++) { List temp = new ArrayList(list); temp.remove(i); powerSet(temp, i); } }
请查看Rosetta Code Power Set页面。 那里有一些递归解决方案的实现(包括Java)。 一般来说,递归解决方案意味着一个疯狂的大调用堆栈,这会减慢速度。
主要有两个原因:
- 它使用全局变量;
- 它是递归的,虽然这并不重要,因为它是一个
O(2^n)
算法。
public final static Set> powerSet(Set s){ Set> result = new HashSet>(); result.add(s); for (Character c:s){ Set subSet = new HashSet (s); subSet.remove(c); result.addAll(powerSet(subSet)); } return result; }