2013-07-26 125 views
1

到Get冪集列表中,我實現了以下內容:最佳的方式獲得獲取列表(遞歸)的Powerset的

public static ArrayList<ArrayList<Integer>> getAllSubsets(ArrayList<Integer> set, int index, ArrayList<Integer> subset){ 
    ArrayList<ArrayList<Integer>> subsets = new ArrayList<ArrayList<Integer>>(); 

    if(index == set.size()){ 
     subsets.add(new ArrayList<Integer>(subset)); 
     return subsets; 
    } 

    subsets.addAll(getAllSubsets(set, index + 1, subset)); 
    subset.add(set.get(index)); 
    subsets.addAll(getAllSubsets(set, index + 1, subset)); 
    subset.remove(subset.size()-1); 
    return subsets; 
} 

這是最佳的方式來獲得的發電機組列表使用遞歸?關於如何在互聯網上實現這一點,我已經看到了很多不同的方式,但他們似乎比我的更復制(使用新的)。

例如,這個StackOverlow post出現在我的谷歌搜索,但他的實施(若昂席爾瓦)使用大量的複製,似乎並非最佳。但是,我經常看到他的實現經常令我困惑。這個實現是否比我使用的更好(另一個是他正在使用泛型的事實)?

他的代碼:

public static <T> Set<Set<T>> powerSet(Set<T> originalSet) { 
    Set<Set<T>> sets = new HashSet<Set<T>>(); 
    if (originalSet.isEmpty()) { 
     sets.add(new HashSet<T>()); 
     return sets; 
    } 
    List<T> list = new ArrayList<T>(originalSet); 
    T head = list.get(0); 
    Set<T> rest = new HashSet<T>(list.subList(1, list.size())); 
    for (Set<T> set : powerSet(rest)) { 
     Set<T> newSet = new HashSet<T>(); 
     newSet.add(head); 
     newSet.addAll(set); 
     sets.add(newSet); 
     sets.add(set); 
    }  
    return sets; 
} 
+0

是您的優先級遞歸,還是最優? –

+0

我只是想實現遞歸形式的最佳。我很驚訝有那麼多糟糕/懶惰的實現。對於純粹的最優化,我只是迭代地實現它。 –

回答

2

你會發現這個page有用。它包含了各種語言和使用不同方法的powerset的實現。對於Java有三種方法:

  1. 迭代
  2. 遞歸
  3. 和使用二進制字符串

其實我喜歡第三種方式最,因爲有很好的想法在裏面。不同的是,他們認爲輸入是String

順便說一句。如果它將是任何將用於生產的代碼,我寧願避免使用遞歸,因爲堆棧可能存在問題(遺憾的是,仍然不支持Java中的尾遞歸)

相關問題