日期:2014-05-20  浏览次数:20703 次

高手帮我解读一下这个求幂集的程序,谢谢
算法目的就是求一个集合的幂集,比如:集合A={a,b,c},则A的幂集p(A)={a,b,c,ab,ac,bc,abc,空}
从网上找到了这个算法,可我看了一晚上也没看懂后面递归是什么意思,不知道求幂集的算法思想,谁能帮小弟看一看,给我讲一下算法思想,谢谢

import java.util.*;

public class Collection {

public static void main(String[] args) {
Vector collection = new Vector();

collection.add("a");
collection.add("b");
collection.add("c");

Object[] o = function (collection);

for (int i = 0 ; i < o.length ; i++ ){
List a = (List)o[i];
if(a.size() > 0) {
System.out.println(a);
}
}
}

public static Object[] function(Vector collection) {

ArrayList pCollection = new ArrayList();
ArrayList collectionTemp = new ArrayList();

function1 (1, collection, collectionTemp, pCollection);

Object[] o = pCollection.toArray();

return o;

}
   
public static void function1(int i, Vector collection, ArrayList collectionTemp, ArrayList pCollection) {

if (i > collection.size()){
pCollection.add(collectionTemp.clone());
} else {

Object o = collection.elementAt(i-1);  
collectionTemp.add(o);  
function1(i+1,collection,collectionTemp,pCollection); //就这3条递归语句看不明白,我觉得关键是没有理解该算法的思想
collectionTemp.remove(collectionTemp.size()-1);  
function1(i+1,collection,collectionTemp,pCollection);
}
}
}


------解决方案--------------------
求幂积最简单的算法思想就是从最后一个元素倒着来遍历所有元素,比如说最后一个就是自己 "c" ;
倒数第二个:首先把自己和幂积里面已有的所有元素做乘积("bc"),然后加到幂积里,此时为{c,bc};最后再加上自己"b",{b,c,bc}
倒数第三个:把自己(a)和幂积中所有元素做乘积{ab,ac,abc},加到幂积集合中,此时幂积中为:{b,c,bc,ab,ac,abc};最后再加上自己本身"a",为:{a,b,c,bc,ab,ac,abc}.
依次类推即可,多少元素都能计算其幂积,至于具体编程就不说了,有这个思想,编程应该是比较简单了,就留给楼主了。
------解决方案--------------------
无非就是一个递归嘛 看下面这个函数我们可以知道最终的结果是存在了一个Object数组中 
Java code
public static Object[] function(Vector collection) { 

ArrayList pCollection = new ArrayList(); 
ArrayList collectionTemp = new ArrayList(); 

function1 (1, collection, collectionTemp, pCollection); 

Object[] o = pCollection.toArray(); //Object数组的值来自于ArrayList pCollection,也就是说collectionTemp是过渡的  

return o; 

}

------解决方案--------------------
用二进制数的原理自己写一个也很简单.
------解决方案--------------------
呵呵,一开始我也看不明白,在本地运行了一下,结果是:
[a, b, c]
[a, b]
[a, c]
[a]
[b, c]
[b]
[c]
理解递归并不难,我觉得比较难想到的是处理后面的逻辑
collectionTemp.remove(collectionTemp.size()-1);
function1(i+1,collection,collectionTemp,pCollection);

删除集合的最后一个元素再调用递归, 这个才是这个算法的关键.