データ構造入門:多次元配列を表す「配列の配列」とは?仕組みと実装方法を解説
多次元配列のもう一つの表現方法:「配列の配列」
データ構造において、多次元配列を扱う方法はいくつか存在します。本記事では、その中でも「配列の配列(Array of Arrays)」と呼ばれる表現方法について詳しく解説します。
この形式では、1つの親となる配列が、複数の配列それぞれの先頭アドレスを保持するという構造になっています。イメージとしては以下のようになります。

配列の配列の構造
上図は、サイズ [7 × 8] の2次元配列 x を表しています。この構造では、各行が独立した1次元配列として扱われ、最初の配列(親配列)がこれらの個々の配列へのアドレスを格納しています。
つまり、親配列の中身は「アドレスの集まり」であり、これはすなわちポインタの配列であると言えます。各ポインタが、別の配列(行データ)の先頭アドレスを指し示しているのです。このような構造は、C# や Java などでは「ジャグ配列(Jagged Array)」とも呼ばれます。
配列の配列の作成方法
この種の配列を作成するには、以下のように new キーワードを使用します。
int [][] x = new int[7][8];
この宣言により、7つの要素を持つポインタ配列が生成され、さらにそれぞれのポインタが8つの要素を持つ1次元配列を参照する形になります。
要素へのアクセス方法
位置 x[i, j] にある要素を取得する場合、まず x[i] を使って i 番目の配列(i 行目)の先頭アドレスを見つけ、その後、その配列内で j 番目のインデックスへ移動することで目的の要素にアクセスします。
この2段階のアクセス方式により、柔軟なメモリ管理が可能になり、例えば行ごとに異なる長さの配列を持たせることもできます。一方で、通常の2次元配列と比べると、間接参照が1段階増えるためアクセス速度が若干低下する点には注意が必要です。
-
セグメントツリー(Segment Tree)とは?データ構造の基本と仕組みをわかりやすく解説
セグメントツリーとは セグメントツリー(Segment Tree)は、配列に対する「区間に関する問い合わせ」と「要素の更新」を高速に処理するためのデータ構造です。本記事では、セグメントツリーが必要とされる背景と、その基本的な構成方法について解説します。 解決したい問題 まず、次のような問題を考えてみましょう。長さ n の配列 arr[0 … n-1] が与えられたとき、以下の2つの操作を効率よく行いたいとします。 区間和の取得:インデックス l から r までの要素の合計を求める(0 ≤ l ≤ r ≤ n-1) 要素の更新:指定したインデックス i の値を新しい値 x に変更する(arr
-
ハーフエッジデータ構造(HalfedgeDS)とは?基本概念とCGAL実装例をわかりやすく解説
はじめにテンプレートパラメータとして用いられるハーフエッジデータ構造(Halfedge Data Structure、略称 HalfedgeDS)は、頂点・辺・面の接続情報(インシデンス情報)を管理できる、辺を中心としたデータ構造として定義されています。平面地図(planar map)や多面体など、任意の次元空間に埋め込まれた向き付け可能な2次元曲面の表現に適した構造です。このデータ構造では、各辺が逆向きの向きを持つ2つのハーフエッジ(半辺)に分割されます。各ハーフエッジは、隣接する1つの面と1つの頂点への参照を保持し、逆に各面および各頂点にも、それぞれ1つの接続ハーフエッジが格納されます。さ