怎样实现一个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);
}
}


}

...全文
190 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chiny 2006-08-14
  • 打赏
  • 举报
回复
这个放到服务器端好像比较麻烦。

本身就是为了在客户端用户进行老数据分类,
用户保存以后才进行服务器的操作。
未保存之前可以随意拖拽。
孟子E章 2006-08-14
  • 打赏
  • 举报
回复
你可以在服务端写,前端调用,如Web Service方式等
孟子E章 2006-08-14
  • 打赏
  • 举报
回复
Javascript和Java虽然名称很相似,但两者没有什么联系,也不是相同的语言或者语言的子集。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧