定義
コンピューターの記憶装置(メモリ)に、同じ種類のデータをすき間なく一列につなげてしまっておく、いちばん基本的な整理箱です。それぞれのマスには番号札(インデックス)がついているので、何番目のマスでも、番号を指定するだけで待たされることなく中身をすぐ取り出せます。
仕切りピルケースに薬を入れるには
月曜日から日曜日まで曜日が書かれた、仕切りつきのピルケースを思い浮かべてください。各曜日のマスには決まった薬がすっと収まり、マスどうしは途中にすき間なくぴったりくっついています。
コンピューターもデータをしまうとき、こんなピルケースをよく作ります。これがまさに配列です。配列を作ると、コンピューターはメモリの中に同じ大きさの部屋をメモリ上に連続して並べて用意します。部屋がくっついているので、コンピューターがデータを管理するのがとてもすっきりします。
面白いのは、コンピューターのピルケースの番号札(インデックス)が、ふつう0番から始まるという点です。1つ目のマスは0番の部屋、2つ目のマスは1番の部屋になります。日常では1から数えますが、コンピューターは「始まりの位置からどれだけ離れているか」で考えるので、始まりの位置そのものを0番と呼ぶのです。
番号さえ分かれば一発で見つけられる秘訣
収納棚に物があちこち散らばっていたら、ほしい物を探すために家じゅうをひっくり返さなければなりません。でも、同じ大きさの引き出しが一列に並んでいたらどうでしょう。何番目の引き出しか番号さえ分かれば、目を閉じていてもすぐにその引き出しを開けられます。
配列のいちばん強力な長所が、この速い検索速度です。コンピューターは、最初の部屋の位置と部屋ひとつの大きささえ知っていれば、かんたんなかけ算で特定の部屋のアドレスをすぐに割り出せます。たとえば5番の部屋(0番から数えるので6つ目のマス)を探したいなら、開始位置に「部屋の大きさ×5」を足して、一気に移動する、という具合です。
そのおかげで、データが10個でも100万個でも、ほしい番号のマスを見つけるのにかかる時間は同じです。これをコンピューターサイエンスでは、順番に探さずに一発でたどり着く「ランダムアクセス」と呼びます。
もう少し正確にいうと:途中に割り込ませるのは大変です
ただし、配列にもはっきりした弱点があります。いっぱいのピルケースの水曜日と木曜日のあいだに、新しい薬をむりやり入れようとしたら、どうすればよいでしょうか。木曜日から日曜日まで入っていた薬をすべて右へ1マスずつずらして、ようやく空きができます。
配列も同じです。先頭や途中に新しいデータを追加するには、後ろにあるデータをすべて1つずつ後ろへ移さなければなりません。反対に、途中のデータを消したら、空いた場所を埋めるために後ろのデータをすべて前へ引き寄せる必要があります。そのため、データを割り込ませたり削除したりするときに時間がかかるという負担があります。
最初に作った部屋の数を、あとから増やしたり減らしたりしにくい点も限界です。箱がいっぱいになったら、もっと大きな新しい箱を作って、既存のデータをすべて移し替えなければならないからです。そのため、サイズがよく変わる作業や、途中への挿入が多い作業では、配列の代わりに別の保管方法(連結リストなど)をあわせて使うこともあります。
よくある誤解
配列の最初のマスの番号は、当然1番である。
ほとんどのプログラミング言語では、最初のマスの番号(インデックス)は0番です。始まりの位置から「どれだけ離れているか(距離)」を基準にアドレスを計算するためです。
日常で出会う場面
スマートフォンの音楽プレイリストのように、曲が順番に並んでいる構造です。
出席簿で1番から30番までの生徒の名前を番号順に書いて管理するやり方です。
つまり ひとことで
配列は、メモリにデータをすき間なく一列に並べ、番号札で一発で見つけ出せる、もっとも基礎的なデータ構造です。