あなたの場合、最良の実装は連想配列(具体的には、そのハッシュテーブル実装)になると思います。キーは座標になり、値は保存されたデータになります。プログラミング言語によっては、何らかの方法でキーを処理する必要があります。
例:
[0,0,0] -> someData(1,2,3,4,5)
[0,0,1] -> someData(4,2,4,6,2)
[0,0,2] -> someData(2,3,2,1,5)
単純な連想配列を使用すると、挿入速度と読み取り速度が大幅に向上しますが、データ ブロックの複雑な選択が必要な場合、コードは混乱します。その場合、何らかのデータベースを使用するのが合理的かもしれません (ただし、連想配列のハッシュマップ実装よりは遅くなります)。特定のデータをバッチでクエリすることができます。たとえば、1 つの単純なクエリを使用して、データの行全体 (または複数の行) を取得できます。
SELECT * FROM data WHERE x=1 AND y=2 ORDER BY z ASC
または、3D データの中央から 2x2x2 の立方体を選択するとします。
SELECT * FROM data WHERE x>=5 AND x <=6 AND y>=10 AND Y<=11 AND z >=3 AND z <=4 ORDER BY x ASC, y ASC, z ASC
EDIT:
実行時に次元のサイズが変わらない場合は、もう一度考えてみてください-最速のソリューションであるため、すべての数学を自分で使用して1次元配列を使用する必要があります。3 次元配列を配列の配列の配列として初期化しようとすると、要素への読み取り/書き込みごとに、必要なアドレスを見つけるためにメモリ内で 2 つの追加ホップが必要になります。ただし、次のような関数を記述します。
int pos(w,h, x,y,z) {return z*w*h+y*w+x;} //w,h - dimensions, x,y,z, - position
ほとんどのコンパイラでインライン化され、かなり高速になります。