コンピュータコンテストでは、入力データを操作しなければならないという問題が発生しました。入力は、data(0)が繰り返しの数である配列にsplit()されています。最大10^18回の繰り返しがあります。私のプログラムはException in thread "main" java.lang.OutOfMemoryError: Java heap space
を返し、私はコンテストに失敗しました。ここでこのJavaスニペットをより効率的にするにはどうすればよいですか?
は、メモリとCPUを食べている私のコードの一部です:私のプログラムはたったの約7または8桁まで働くことができる
980046644627629799 9 123456 18 10000000 831918484 451864686 840000324 650000765
972766173386786486 123 1 10000000 10000000 590000001 680000000 610000001 970000002
299896237124947938 681206 164538 2280874 981991 416793690 904023823 813682336 774801135
:
long product[][]=new long[data[0]][2];
product[0][0]=data[1];
product[0][1]=data[2];
for(int a=1;a<data[0];a++){
product[a][0]=((data[5]*product[a-1][0] + data[6]) % data[3]) + 1; // Pi = ((A*Pi-1 + B) mod M) + 1 (for all i = 2..N)
product[a][1]=((data[7]*product[a-1][1] + data[8]) % data[4]) + 1; // Wi = ((C*Wi-1 + D) mod K) + 1 (for all i = 2..N)
}
は、ここで入力されたデータの一部です実行するには数分かかります。 18桁の数字で、Eclipseで「Run」をクリックするとすぐにクラッシュしました。
通常のコンピュータでそのように多くのデータを操作することが可能なのかどうか不思議です。私の質問が不明であるか、より多くの情報が必要な場合はお知らせください。ありがとう!
あなたの出力はどうなっていますか?あなたは製品「マトリックス」で何をしていますか? – Kiril
それはかなり複雑です。データ[0]だけが重要で、他の数字は数式にプラグインする数字です。私のプログラムの主なボトルネックは 'product [a] [0] =((data [5] * product [a-1] [0] + data [6])%data [3])+ 1;' ' [1] =((データ[7] *製品[a-1] +データ[8])%データ[4])+ 1 'となり、10^18回繰り返される。実際の質問を掲載するのが適切かどうかはわかりません。 –
まだ競合している場合は質問を投稿しないでください。あなた自身でそれを解決しようとします。しかし、なぜ*メモリが足りなくなったのか注意してください。あなたは本当にデータ[0]が成長すると成長する配列をしたいですか? –