配列

番号付きのお薬ケースのように、同じ大きさの部屋を一列に並べてデータを番号順に保管する整理ボックスです。

定義 コンピュータの記憶装置(メモリ)に、同じ種類のデータを隙間なく一列に並べて保管する最も基本的なデータ構造です。各部屋に番号札(インデックス)が振られているため、何番目であっても順番待ちなしで一瞬でデータを取り出すことができます。

お薬ケースに錠剤を入れる仕組み

月曜日から日曜日まで曜日が書かれたお薬ケースをイメージしてみてください。各曜日の枠には決まった薬がぴったり入り、枠と枠の間に隙間はありません。

コンピュータもデータを保管するとき、このようなケースをよく作ります。これが「配列」です。配列を作ると、コンピュータはメモリの中に連続して一列に同じ大きさの部屋を確保します。部屋同士がぴったり隣り合って並んでいるため、データを管理するのがとてもすっきりします。

面白いのは、コンピュータのお薬ケースの番号札(インデックス)が通常「0番」から始まることです。最初の部屋は0番、2番目の部屋は1番になります。日常生活では1から数えますが、コンピュータは「先頭からどれくらい離れているか(距離)」を基準にするため、先頭そのものを0番と呼ぶのです。

配列の連続メモリ構造と0始まりインデックス インデックス(0始まり) 0 1 2 3 4 10 25 42 77 99 隙間なく連続したメモリ (データが順番に並んで格納)

番号さえ分かれば一瞬で見つかる秘密

収納ケースのあちこちに物が散らばっていたら、探すために家じゅうをひっくり返さなければなりません。でも、同じ大きさの引き出しが番号順に並んでいたらどうでしょう? 何番目の引き出しさえ分かれば、迷わずすぐに開けられますよね。

配列の最大の強みは、この圧倒的な検索(アクセス)スピードです。コンピュータは最初の部屋の位置と部屋1つの大きささえ分かっていれば、簡単な掛け算の計算で目的の部屋の場所を即座に割り出せます。例えば5番目の部屋を探したいなら、先頭の位置に「部屋の大きさ × 5」を足すだけで一発で移動できるのです。

このおかげで、データが10個あろうと100万個あろうと、目的の番号の部屋を見つけるのにかかる時間は全く同じです。これをコンピュータ科学では順番に探さず一瞬でたどり着く「ランダムアクセス」と呼びます。

少し詳しく:途中に割り込むのは苦手

しかし、配列にもはっきりとした弱点があります。ぎっしり詰まったお薬ケースの水曜日と木曜日の間に、新しい薬を無理やり割り込ませたいときはどうすればいいでしょうか? 木曜日から日曜日までに入っていた薬をすべて右に1マスずつずらして、ようやく空きができますよね。

配列もまったく同じです。先頭や途中に新しいデータを追加するには、それ以降のすべてのデータを1つずつ後ろへずらさなければなりません。逆に途中のデータを削除すると、空いた隙間を埋めるために後ろのデータをすべて前へ詰める必要があります。そのため、データの挿入や削除を行うときに時間がかかってしまうのが難点です。

また、最初に作った部屋の数を途中で増やしたり減らしたりしにくいのも限界の一つです。ケースがいっぱいになったら、もっと大きな新しいケースを用意してデータを全部移し替える必要があります。そのため、サイズが頻繁に変わったり途中の割り込みが多い処理には、配列の代わりに別の仕組み(連結リストなど)が使われることもあります。

配列途中挿入時の後続データ移動 新データ挿入 1マス右へ移動 A B 空き C D [0] [1] [2] [3] [4] 途中に挿入するには後続データをすべてずらす必要があります

🤔 よくある誤解

✕ 誤解

配列の最初の部屋番号は当然1番から始まる。

✓ 事実

多くのプログラミング言語では、最初の部屋の番号(インデックス)は0番です。先頭の位置から「どれくらい離れているか(オフセット)」を基準に場所を計算するためです。

🧺 日常で出会う場面

1 スマートフォンの音楽プレイリストのように、曲が順番通りに並んでいる構造です。
2 出席簿で1番から30番まで生徒の名前が番号順に並んで管理されているような仕組みです。
💡 つまり ひとことで

配列は、メモリ上にデータを隙間なく一列に並べ、番号札を使って一瞬で目的のデータを取り出せる最も基本的なデータ構造です。