回答編集履歴
1
ちょっと文章変更
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
`val`と`wgt`の定義部分がないためforで回している添字からの推測なりますが、N個の要素に対する全ての組合せ数である2^N(2のN乗)個の要素からなる配列を用意しているのだと思います。31個の場合は2^31個の要素の配列、32個の場合は2^32個の要素の配列ということでしょう。
|
2
2
|
|
3
|
-
結論から言うとJavaの言語仕様とJavaVMの制限から不可能です。
|
3
|
+
結論から言うとJavaの言語仕様とJavaVMの制限から**不可能**です。
|
4
4
|
|
5
5
|
まず、Javaの言語仕様として配列の添字は`int`であるという制限があります。`int`の最大値は2^31-1ですので、どうやっても0~2^31-1、つまり2^31個の要素の配列しか作れません。さらに、`new int[X]`とするときの`X`も`int`です。ここに入る最大の数は2^31-1であり、結局、2^31-1個の配列が限界になります。
|
6
6
|
|
@@ -8,6 +8,6 @@
|
|
8
8
|
参考: [Java の配列要素数の上限 - 地平線に行く](http://d.hatena.ne.jp/chiheisen/20130929/1380442186)
|
9
9
|
64bit環境でも2^31-3が最大であり、それ以上は無理となります。定義部分がないため確実なことは言えませんが、Math.powで2^31を計算しても`int`にキャストすると2^31-1に丸め込まれますので、その大きさで配列を作ろうとしたのでしょう。しかし、上のJavaVMの制限によりOutOfMemoryErrorが発生したと考えられます。
|
10
10
|
|
11
|
-
|
11
|
+
つまり、JavaとJavaVMと配列を使う限り、どんなにメモリを積んだり、オプションでヒープサイズなどを調整しても、2^31個の要素の配列を作ることは**不可能**になるということです。なお、`long`を使えばと思うかも知れませんが、Javaの配列は添字アクセス等が`int`になるため、結局キャストが必要になり、意味がありません。ArrayListも`int`であり同じです(そもそもArrayListは内部で配列を使って実装されています)。LinkedListであれば実装上の制限がないように思えますが、`size()`等が`int`を使うため、同じと思われます(ここら辺は試してません)。
|
12
12
|
|
13
13
|
巨大な配列を作らなくても計算できるアルゴリズムに変更するしかないと思われます。または、かなり遅くなりますが、外部ファイルに配列でやろうとしていたことを入れていくという手段ぐらいしかないかと思います(intの2^31個保存するのに8GBのファイルになりますけど)。
|