場合によっては、内側のループをSystem.arraycopy
に置き換えると、高速になります。しかし、あなたの記憶のレイアウトにはないと思います。
可能であれば、配列をコピーする代わりに、参照を更新することを検討してください。Java の「多次元」配列は、実際には配列の配列であることを思い出してください。
特に、
boolean[] tmp = multi[0];
multi[0] = multi[1];
multi[1] = tmp;
ゼロに近いコストで 2 つの配列参照を交換します。これは、古い値をコピーしてから上書きするよりもはるかに高速です。ただし、コピーが必要な場合 (古い値を上書きしない場合) は、これを行うことができません。
これを盲目的に行うべきではないことに注意してください。
multi[0][0] = 1;
multi[1] = multi[0];
multi[1][0] = 0;
System.err.println(multi[0][0]);
これは、 と が同じネストされた配列を指している0
ためです。使用する必要がありました。multi[0]
multi[1]
multi[1] = multi[0].clone();
また、複製は深くないためmulti.clone()
、 と同じネストされた配列を指すことに注意してくださいmulti
。Java には組み込みのディープ クローンやディープ アレイコピーはありません。どちらの方法でもループを使用する必要があります。
しかし、繰り返しになりますが、多くの arrayで 2 番目の要素を最初の要素にコピーしたい場合、これらのどれも機能しないと思われます。これはメモリ レイアウトの問題です。
データ構造がメモリ内でどのように見えるかを思い出してください。
boolean[][][] -> boolean[][] -> boolean[]{ 0, 1 }
\ \> boolean[]{ 0, 1 }
\> boolean[][] -> boolean[]{ 0, 1 }
\> boolean[]{ 0, 1 }
各配列に 1 つの要素をコピーします。それらはメモリ全体に存在する可能性があるため(すべてboolean[]...
が独自のオブジェクトです!)、プリミティブを使用してこれを高速化する方法はありません。データは散らばっています。可能であれば、メモリ レイアウトの変更を検討してください。
ブール配列に代わるものも検討してください。ブール値は 1 バイトのメモリを使用しますが、保存できるのは 1 ビットのみです (これはより高速になる可能性があるため、それ自体は悪くないことに注意してください!)。BitSet
ただし、代わりにブール配列全体を aまたは along
に格納してから、実際のビット操作を行うことが理にかなっている場合があります。しかし、利益は、時にはそれが報われることもあれば、時には傷つくこともあります。