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,因此可能有一种更快的方法,这实际上加快了我对小数据的处理。但是,当数据变得非常大时,顺序搜索将占主导地位,并且比原始搜索使用更多的时间,因此它变得不可行。