2010-03-29 50 views
0

我有這個計劃的地方也有類似的這種有些遞歸函數:的Java創建一套新的太慢

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%的時間。有什麼方法可以大大加快速度?

+0

「我的代碼100%的時間」。真?你確定測量包括get_next_set和do_stuff_to嗎?這些100%代表多少個鐘錶秒鐘?您的需求真的太慢嗎? – Thilo 2010-03-29 02:01:06

+0

也.clone()可能不是最好的方式來做到這一點,它幾乎可以保證沒有做你認爲它正在做的事情。提示:它實際上並沒有製作集合中對象的副本,只有引用的副本。 – 2010-03-29 15:29:56

回答

0

這就是我爲加快速度所做的一切,這種方式我從來不需要創建新的套件。

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和removeAll上花費的時間大致相同。

0

當你在克隆時,你真正想做什麼,也許你不需要做一個完整的cloan?

改善你的lambda函數的性能最好的辦法是延長HashSet的,並在此改變與自定義一個是特別的,您的情況克隆定義...

我不知道的任何其它方式真的幫助更多的信息不幸。

+0

我不認爲這會有很大的好處。他需要所有設置元素的完整副本,並且默認克隆已經非常快(例如,它比複製構造函數更快)。 – Thilo 2010-03-29 02:25:39

+0

我真的不知道克隆的目的是什麼,如果他可以提供更多的信息,那麼我們可以提出一個替代方案,也可能有他知道的有關HashSet的特殊屬性,可以幫助設計更快的克隆, 當前的克隆實現只是一個新的HashSet(set),所以可能會有更快的方式 – hhafez 2010-03-29 02:30:31

0

如果我得到它的權利,你儘量做到以下幾點:

lambda(Set p) { 
    lambda(p + further elements); 
} 

你能避免克隆p如通過重新實現一個列表,並使用該節點作爲參數拉姆達:

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 
} 

這是一種低層次的解決方案,你就必須實現一個緩慢的順序搜索/查找算法(如果你依靠獨特的元素該集),但在我的經驗,這樣的堆棧是大多數遞歸算法的一個很好的解決方案。

+0

這實際上加快了我爲小數據所做的工作。但是當數據變得非常大時,順序搜索將佔據主導地位並使用比原始數據更多的時間,因此它變得不可行。 – 2010-03-29 17:51:28