2013-07-09 31 views
0

我有一個Jave類,它爲給定的元素數組計算所有可能的組合,並使用遞歸方法執行此操作。 它工作正常,但當輸入元素的數量上升,我發現內存不足的問題。 我想要做的是計算給定大小的塊的組合。 我的問題是,我不知道如何保存和恢復遞歸方法, 特別是當它的調用深度很高的狀態。 Beolw是代碼。 非常感謝。爲使用遞歸方法的Java類保存狀態

package uty; 

import java.io.FileOutputStream; 
import java.util.ArrayList; 

public class ESCalcCombination { 

    int iMax = 0; 
    boolean bEnd = false; 
    int iLenInp; 
    ArrayList<Integer[]> resultList; 

    public ESCalcCombination(int[] inElements, int inMaxElem, int inMaxElemLen) { 
     if (inMaxElem > 0) { 
      iMax = inMaxElem; 
     } else { 
      iMax = new Double(Math.pow(2d, new Integer(inElements.length).doubleValue())).intValue(); 
     } 
     resultList = new ArrayList(iMax); 
     iLenInp = inElements.length; 
     for (int i = 1; i <= iLenInp; i++) { 
      if (inMaxElemLen > 0) { 
       if (i > inMaxElemLen) { 
        break; 
       } 
      } 
      for (int j = 0; j < iLenInp; j++) { 
       if ((iLenInp - j) < i) { 
        break; 
       } 
       addNextElement(inElements, j, i, null); 
       if (bEnd) { 
        break; 
       } 
      } 
      if (bEnd) { 
       break; 
      } 
     } 
    } 

    private void addNextElement(int[] inElements, int inCurIndex, int inLimitLen, ArrayList<Integer> inCurrentCombination) { 
     if (inCurrentCombination != null 
       && (inCurrentCombination.size() + (iLenInp - inCurIndex)) < inLimitLen) { 
      return; 
     } 
     ArrayList<Integer> alCombinationLoc = new ArrayList(); 
     if (inCurrentCombination != null) { 
      alCombinationLoc.addAll(inCurrentCombination); 
     } 
     alCombinationLoc.add(inElements[inCurIndex]); 
     if (alCombinationLoc.size() == inLimitLen) { 
      Integer[] arComb = new Integer[alCombinationLoc.size()]; 
      arComb = alCombinationLoc.toArray(arComb); 
      resultList.add(arComb); 
      alCombinationLoc.clear(); 
      alCombinationLoc = null; 
      if (resultList.size() == iMax) { 
       bEnd = true; 
      } 
      return; 
     } 
     for (int i = ++inCurIndex; i < iLenInp; i++) { 
      addNextElement(inElements, i, inLimitLen, alCombinationLoc); 
      if (bEnd) { 
       return; 
      } 
     } 
    } 

    public void close() { 
     ESUty.closeAL(resultList); 
    } 

    public ArrayList<Integer[]> getCombinations() { 
     return resultList; 
    } 

    public static void main(String[] args) { 
     ESCalcCombination ESCaCo = new ESCalcCombination(new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, 0, 15); 
     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream("c:\\test\\conbinations.txt"); 
      for (int i = 0; i < ESCaCo.getCombinations().size(); i++) { 
       StringBuilder sb = new StringBuilder(); 
       for (int j = 0; j < ESCaCo.getCombinations().get(i).length; j++) { 
        sb.append(ESCaCo.getCombinations().get(i)[j]); 
       } 
       System.out.println("elemento " + i + " = " + sb.toString()); 
       fos.write((sb.toString() + System.getProperty("line.separator")).getBytes()); 

      } 
     } catch (Exception ex) { 
      System.out.println("errore " + ex); 
     } finally { 
      ESUty.closeFileOutputStream(fos); 

     } 

     System.exit(0); 
    } 
} 
+0

您正在嘗試查找nCr嗎? –

+0

在課堂上放置方法。將實例變量中的迭代器位置存儲。在構造函數中設置值。 –

回答

1

隨着遞歸,部分數據在堆棧上,堆棧不能輕鬆保存。如果需要這種功能,請改用while循環和StackArrayDeque數據結構。這允許保存和恢復狀態而沒有問題。

+0

'java.util.Stack'是舊的JDK 1.0數據結構之一。最好使用更新更快的'java.util.ArrayDeque'。 –