Java创建新集合太慢
我有一个程序,它有一些递归函数,类似于:Java创建新集合太慢,java,set,Java,Set,我有一个程序,它有一些递归函数,类似于: public static void lambda(HashSet<Integer> s){ if(end(s)){ return; } for(int i=0;i<w;i++){ HashSet<Integer> p = (HashSet) s.clone(); p.addAll(get_next_set()); do_stuff_to
public static void lambda(HashSet<Integer> s){
if(end(s)){
return;
}
for(int i=0;i<w;i++){
HashSet<Integer> p = (HashSet) s.clone();
p.addAll(get_next_set());
do_stuff_to(p);
lambda(p);
}
}
我要做的是把每一个集合和集合s结合起来。在工会的每一个人身上运行lambda。
我运行了一个探查器,发现c.clone操作占用了我代码的100%时间。有什么方法可以大大加快速度吗?当你进行克隆时,你真正想做的是什么,也许你不需要做一个完整的克隆 提高lambda函数性能的最佳方法是扩展哈希集,并使用特定于您的情况的自定义定义覆盖克隆定义
不幸的是,我不知道有什么其他方法可以真正帮助你获得更多信息。如果我做对了,你可以尝试做以下几点:
lambda(Set p) {
lambda(p + further elements);
}
您可以避免克隆,例如通过重新实现列表并将节点用作lambda的参数:
class Node {
int content;
Node next;
Node(int content, Node next) {
this.content = content;
this.next = next;
}
}
void lambda(Node set) {
// add new elements to front
Node newSet = set;
for(Integer i : new_elements() ) {
newSet = new Node(i, newSet);
}
lambda(newSet);
// Observe that set is not modified by adding new elements
}
这是一个低级的解决方案,如果依赖集合中的唯一元素,则必须实现一个缓慢的顺序搜索/查找算法,但根据我的经验,这样的堆栈对于大多数递归算法来说是一个很好的解决方案。这就是我所做的加速一切的方法,这样我就不必创建新的集合
public static void lambda(HashSet<Integer> s){
if(end(s)){
return;
}
ArrayList<Integer> diff = new ArrayList<Integer>();
for(int i=0;i<w;i++){
//an array version of the next set, it is pre-computed
int[] a = get_next_set_array();
for(int j=0;j<a.length;j++){
if(!s.contains(a[j])){
diff.add(a[j]);
}
}
s.addAll(diff);
do_stuff_to(s);
s.removeAll(diff);
diff.clear();
lambda(p);
}
}
平均来说,这要快得多,程序在addAll和removall上花费的时间大致相同。100%的时间是我的代码。真正地你确定测量包括下一步要做的事情和要做的事情吗?这100%代表多少个挂钟秒?对于你的需求来说,它真的太慢了吗?另外,克隆可能不是最好的方法,它几乎保证不会做你认为它正在做的事情。提示:它实际上并没有复制集合中的对象,只是复制引用。我认为这没什么好处。他需要所有集合元素的完整副本,默认克隆已经相当快了,例如比复制构造函数快。我真的不知道克隆的目的是什么,如果他能提供更多信息,那么我们可以建议一个替代方案,此外,他可能知道HashSet的一些特殊属性,这些属性可以帮助设计更快的克隆,当前的克隆实现只是一个新的HashSet,因此可能有一种更快的方法,这实际上加快了我对小数据的处理。但是,当数据变得非常大时,顺序搜索将占主导地位,并且比原始搜索使用更多的时间,因此它变得不可行。