2016-05-05 1 views
1

私はのコード化経験があります。C++です。 最近、私はJavaを学ぼうとしてきました。JAVA:配列次元に関する時間係数

私はオンラインジャッジで簡単な問題を練習していました。 問題には2×1000000次元の配列が必要です。 私は、配列宣言:

int ara[][]=new int[1000000][2]

をが、コードは3秒の制限時間内に収まらない可能性があり、制限時間は非常に最初のテストケースに評決を超過ました。

は、その後、私はちょうどこのような寸法を切り換える:

int ara[][]=new int[2][1000000]

し、それに応じてコードを変更し、コードを受け付けました。

私は最初のコードがタイムリミットを超過した唯一の理由だと思っていました。

int ara[][]=new int[1000000][2]int ara[][]=new int[2][1000000]の違いは何ですか? なぜこれらの配列宣言の間に巨大な時間差がありますか?

+3

もっと速いと思いますか?それぞれ2つの値を持つ1000000配列を割り当てるか、それぞれ1000000の値を持つ2つの配列を割り当てますか?どうしてそう思うの? –

+0

C++から来て、おそらく 'int [3] [5]'は2次元配列だと思います。そうではない。これは配列の配列です。内部的には大きな違いですが、機能的には2D配列のように振る舞います*。しかし、配列の配列であるため、各セカンダリ配列は実際には異なるサイズであり、純粋な2D配列ではできません。 [JLS 15.10.2](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.10.2)および例15.10.2-2を参照してくださいシーンの後ろに何が起こっているのか見てみましょう。 – Andreas

答えて

1

メモリの割り当てに時間がかかります。 5つの要素の1つの配列を割り当てることは、1つの要素の5つの配列を割り当てることと同じ時間を取らない。割り当てごとに、OSは空きブロックがあるかどうかをページテーブルで調べ、割り当てる必要があります。

したがって、1つの例では2つの配列だけを宣言し、もう1つの配列では1000000を宣言します。もう一方よりも。

関連する問題