2011-10-04 58 views
6

我已寫了一碼來計算長度的總和,由此創建一個有效的方式來總結

syra(1) = 1

syra(2) = n + syra(n/2) if n%2==0

syra(3) = n + (n*3) + 1

例如。

  • syra(1)將產生1
  • syra(2)將產生2 1
  • syra(3)將產生3 10 5 16 8 4 2 1
  • 長度(3)將所有syra(1),syra(2),syra的總和(3),其是11.

下面的代碼:

public static int lengths(int n) throws IllegalArgumentException{ 
    int syra = n; 
    int count = 0;  
    int sum = 0; 
    if (syra < 1){ 
    throw new IllegalArgumentException("Value must be greater than 0"); 
    }else{ 
    for (int i=1; i<=syra; i++){ 
     count = i; 
     sum++; 
     while (count > 1){ 
     if ((count % 2) == 0){ 
      count = count/2; 
      sum++; 
     }else{ 
      count = (count * 3) + 1; 
      sum++; 
     } 
     } 
    } 
    } 
    return sum; 
} 

問題是,如果我用700000的大值爆炸這些長度,它將需要很長時間並且對於已經出現在syra(3)中的syra(10),syra(5)...重複步驟。

如何微調代碼來存儲重疊序列的一些臨時(數組)?

好的,根據這些信息,這裏是我的另一個帶有數組的修改後的代碼,爲什麼它會產生數組索引超出限制的錯誤?

public class SyraLengths{ 

public static void main (String[]args){ 
    lengths(3); 
} 

public static int lengths(int n) throws IllegalArgumentException{ 
    int syra = n; 
    int count = 0; 
    int sum = 0; 
    int [] array = new int [syra+1]; 
    array[0] = 0; 
    if (syra < 1){ 
     throw new IllegalArgumentException("Value must be greater than 0"); 
     }else{ 


       for (int i=1; i<=syra; i++){ 
        count = i; 
        sum++; 

        while (count > 1){ 

         if(array[count] !=0){sum = sum + array[count];} 

         else if ((count % 2) == 0){ 
          count = count/2; 
          array[count]=sum; 
          sum++; 
         }else{ 
          count = (count * 3) + 1; 
          array[count]=sum; 
          sum++; 

          } 
         } 
       } 
      }return sum; 
} 

}

+2

'syra(2)= n + syra(n/2)'中的'n'是什麼? –

+0

@Hemal - 閱讀代碼。 –

+0

謝謝,@Ed。不是數學家,我不知道什麼是Syra函數,並認爲我會根據規範檢查代碼。 –

回答

3

使用HashMap<Integer, Integer>來存儲你已經計算出的結果,並試圖重新計算之前查找值存在。這種技術被稱爲memoization

+2

它需要是'HashMap '。 –

+0

@Kublai Khan:更正;謝謝。 (我主要用C#編碼,所以我忘了這個...) –

+3

一個簡單的int數組會更快,更容易,更小。 –

1

你想要做的技巧叫做memoization

您將需要在某些數據結構中存儲那些較小調用的輸出,然後使用它而不是一遍又一遍地計算。

考慮使用LinkedHashMap專用構造函數accessOrder=True並覆蓋removeEldestEntry()方法。閱讀javadoc LinkedHashMap。這裏有很好的描述。這樣做,你可以很容易地只保留那些最常用的值,並保持你的緩存合理的小(即大多數使用1000個元素)。

相關問題