2012-10-06 25 views
0

我正在學習JAVA,我正在學習有關memoization。但我有點失去我的方式...如何在java中計算組合?通過使用memoization?

有沒有人有關於如何通過使用遞歸和使用memoization來加速算法計算在Java組合的示例代碼?

就像計算C5,3 = 5 * 4 * 3/3 * 2 * 1 = 10的方法一樣。但使用遞歸?

+3

郵編顯示你已經嘗試過的情況,並在具體情況,你被卡住。因爲這個問題太廣泛了。 –

+0

也許你最好搜索'二項式係數'。這裏是代碼http://penguin.ewu.edu/cscd320/Topic/Strategies/DynamicPgming/Binom_Memo.java – halex

回答

1

讓我們用一個例子做20選5

由於20 choose 5被定義爲20!/(5! * (20-5)!)

我們可以使用memoization來存儲那些因子計算,所以我們不必連續在我們的遞歸下重新計算它們。

所以:

//STORING FACTORIAL COMPUTATIONS 
    private Map<Integer,Long> factorialMap = new HashMap<Integer,Long>(); 


    public Long getFactorial(int number) { 

     //CHECK IF I ALREADY COMPUTED THIS FACTORIAL 
     Long val = factorialMap.get(number); 
     if(val != null) { 
      //GOT IT! 
      return val; 
     } else { 
      //NEED TO COMPUTE! 
      val = getFactorialRecursive(number); 
      //STORING IT TO SAVE COMPUTATION FOR LATER 
      factorialMap.put(number, val); 
      return val; 
     } 
    } 

    //RECURSIVE FUNCTION TO COMPUTE FACTORIAL 
    public Long getFactorialRecursive(int number) { 
     if(number < 2) { 
      return 1L; 
     } else { 
      return number * getFactorialRecursive(number-1); 
     } 
    } 


    //ACTUAL CALL TO "20 choose 5" 
    public Long combination(int fromVal, int chooseVal) { 
     return getFactorial(fromVal)/(getFactorial(chooseVal)*getFactorial(fromVal-chooseVal)); 
    } 
+0

感謝您的幫助。我可以理解它,但我真的是新的Java。我實際上無法運行您的代碼.... – jackhao

+0

這並不意味着運行代碼,但作爲示例 – gtgaxiola

+0

@jackhao我把它放在pastebin上http://pastebin.com/TMavCnb4 – gtgaxiola