怎样实现一个Javascript版本的取集合子集的功能?
chiny 2006-08-14 05:17:14 附Java 1.5+ 的实现,请保存后使用编译运行。
由于用到的一些Java类Javascript没有,不知道怎么写。
再算法复杂度有点高。如果可以帮忙改进一下。
谢谢!
package a;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* 一般集合的子集个数包含空集为2^n,n为集合内的数目
* @author David Chan
*/
public class Subset {
public static void main(String[] args) {
//集合内的数据
Set<Integer> set = new HashSet<Integer>();
//第一层数据集的集合
//比如{1},{2}只包含一个元素为第一层
//如{1,2},{2,3}等包含两个元素的为第二层
Set<Set<Integer>> first = new HashSet<Set<Integer>>();
//初始化集合和第一个集合
initData(set,first);
//集合内所有的子集
List<Set<Set<Integer>>> all_subset = new ArrayList<Set<Set<Integer>>>();
//初始化每层的集合
for (int i = 1; i <= set.size(); i++)
all_subset.add(new HashSet<Set<Integer>>());
all_subset.add(0,first);
//这儿的算法复杂度太高了,注意三个Max
for (int i = 1; i <= set.size(); i++) //Max:N
{
Set<Set<Integer>> pre = all_subset.get(i-1);
Set<Set<Integer>> current = all_subset.get(i);
Iterator<Set<Integer>> it = pre.iterator();
while (it.hasNext()) //Max: Cn(n/2)(最多从n中取N/2个元素)
{
Set<Integer> arr = it.next();
calculate(current,set,arr);//Max:N-1
}
}
//打印
for (int i = 0; i <= set.size(); i++)
System.out.println(all_subset.get(i));
}
public static void initData(Set<Integer> set,Set<Set<Integer>> first)
{
Set<Integer> single;
set.add(1);
single = new HashSet<Integer>();
single.add(1);
first.add(single);
set.add(2);
single = new HashSet<Integer>();
single.add(2);
first.add(single);
set.add(3);
single = new HashSet<Integer>();
single.add(3);
first.add(single);
set.add(4);
single = new HashSet<Integer>();
single.add(4);
first.add(single);
set.add(5);
single = new HashSet<Integer>();
single.add(5);
first.add(single);
}
public static void calculate(Set<Set<Integer>> current, Set<Integer> set , Set<Integer> arr)
{
Set<Integer> back = new HashSet<Integer>(set);
//取两个集合的差,如{1,2,3,4,5}-{1,2,3} = {4,5}
back.removeAll(arr);
Iterator<Integer> ite = back.iterator();
while (ite.hasNext())
{
Set<Integer> n = new HashSet<Integer>(arr);
//产生如下集合{1,2,3,4},{1,2,3,5}
n.add(ite.next());
current.add(n);
}
}
}