2011-10-19 11 views
2

数字の連鎖を作成して、魔法使いが一番長いと思うプログラムを書いています。問題は、私は記憶がなくなってしまって、何がすべての記憶を食べるのか分かりません。誰もが問題があることを知っていますか?Java、メモリ不足、非効率的な機能

public static void main(String[] args) { 

    ArrayList<Integer> longestchain; 
    ArrayList<Integer> chain = new ArrayList<Integer>(); 
    int size = 0; 
    int longestsize = 0; 
    int start; 
    int number = 0; 

     for(int i = 3; i < 1000000; i++) 
     { 
      start = i; 
      chain.clear(); 
      chain.add(start); 
      size = 1; 
      while(true) 
      { 
       if(start == 1) 
       { 
        break; 
       } 
       if(iseven(start)) 
       { 
        start = start/2; 
       } 
       else 
       { 
        start = start*3 + 1; 
       } 

       chain.add(start); 
       size++; 

      } 

      if(size > longestsize) 
      { 
       longestsize = size; 
       longestchain = chain; 
       number = i; 

      } 
      //System.out.println(i); 

     } 
     System.out.println(number + ". " + longestsize); 

} 

public static boolean iseven(int n) 
{ 
    return (n % 2 == 0); 
} 

答えて

4

問題がi=113383あなたが整数オーバーフローに実行しているときということです。この結果、無限ループが発生し、ヒープスペースがなくなるまでchainに追加され続けます。 chainlongestchainArrayList<Long>,startからlongiseven()と変更すると、longとなり、この特定の問題が解決されます。

もう1つの問題は、longestchain = chainが参照を割り当てているのに対し、コンテンツをコピーする必要があることです。そうでなければ、次の反復はlongestchainをワイプします。

+0

ありがとうございました! – warbio

0

これはおそらく解決されませんが、ヒント:

のArrayListのデフォルトの配列サイズは10.あなたが期待しているものに近い値、または多くの配列の作品にあなたのArrayListを初期化していますボンネットの下に行われます。

// e.g. 
ArrayList<Integer> chain = new ArrayList<Integer>(50000); 
0

なぜあなたはメモリが不足しているのかわかりませんが、私はあなたのコードのバグに気がつきました。長いオブジェクトとチェーンが同じオブジェクトを指しているので、チェーンをクリアするとlongestchainもクリアされます。代入の代わりに連鎖の内容を持つ新しい配列を作成することで修正できます。

+0

ありがとう、私はその誤解をしたことに気付かなかった。 – warbio