コンテンツにスキップ

データ及びデータ構造

コンピュータが処理する情報は、すべて「データ」として扱われます。たとえば、あなたの名前、年齢、テストの点数、写真──これらはすべてデータです。プログラムはこうしたデータを受け取り、加工し、結果を出力します。

データを効率よく扱うには、データの「入れ物」と「並べ方」を工夫する必要があります。入れ物にあたるのが変数配列といった仕組みであり、並べ方にあたるのがデータ構造です。この節では、まずデータの基本的な入れ物を学び、次にデータ構造の代表例を見ていきます。

変数とは、データを一時的に格納しておく「名前付きの入れ物」です。たとえば「合計点」という変数に 250 という値を入れておけば、プログラム内で「合計点」と書くだけでその値を参照できます。変数には一度に1つの値だけが入り、新しい値を代入すると古い値は上書きされます。

フィールドとは、1つのデータ項目を表す最小単位です。たとえば、社員の情報を管理するとき、「社員番号」「氏名」「所属部署」のそれぞれがフィールドにあたります。データベースの世界では「列(カラム)」と同じ意味で使われることもあります。

レコードとは、関連する複数のフィールドをひとまとめにしたものです。先ほどの例では、「社員番号:1001」「氏名:山田太郎」「所属部署:営業部」という3つのフィールドをまとめたものが1件のレコードです。

社員番号氏名所属部署
1001山田太郎営業部
1002鈴木花子開発部

この表では、1行が1レコード、各列がフィールドに対応しています。

ファイルとは、同じ種類のレコードを集めたものです。上の表全体が「社員ファイル」にあたります。コンピュータでは、データをファイルとしてまとめてハードディスクなどに保存します。

試験で出るポイント

フィールド・レコード・ファイルの階層関係を整理しておきましょう。**フィールド(項目)→ レコード(1件分のデータ)→ ファイル(レコードの集まり)**という包含関係がポイントです。

配列とは、同じ種類のデータを番号(添字・インデックス)付きで一列に並べたデータの入れ物です。たとえば、5人のテスト点数を管理するとき、変数を5つ個別に用意するのではなく、「点数[0], 点数[1], 点数[2], 点数[3], 点数[4]」のようにまとめて扱えます。

配列の特徴は、番号を指定すれば目的のデータにすぐアクセスできる点です。一方で、途中にデータを挿入したり削除したりするのは手間がかかります(後ろのデータをすべてずらす必要があるため)。

プログラムで大量のデータを扱うとき、データをどのような形で保持し、どのような順序で出し入れするかによって、処理の効率が大きく変わります。この「データの保持・管理の仕組み」をデータ構造と呼びます。

代表的なデータ構造には、リストスタックキュー木構造があります。

リストとは、データを順番に並べ、各データが「次のデータの場所」を指し示すことでつながっているデータ構造です。配列と似ていますが、リストは途中へのデータの挿入や削除が容易である点が異なります。

配列では途中にデータを入れると後続のデータをすべてずらす必要がありますが、リストでは「次のデータの場所」を書き換えるだけで済みます。その代わり、リストは番号を指定して直接アクセスすることはできず、先頭からたどっていく必要があります。

比較項目配列リスト
データへのアクセス番号指定で高速先頭から順にたどる
途中への挿入・削除遅い(ずらす必要がある)速い(つなぎ替えるだけ)
メモリの使い方連続した領域が必要離れた場所でもよい

スタック(Stack)── 後入れ先出し

Section titled “スタック(Stack)── 後入れ先出し”

スタックとは、データを積み重ねるように格納し、最後に入れたデータから先に取り出すデータ構造です。この取り出し方をLIFO(Last In First Out:後入れ先出し)と呼びます。

スタックの操作は2つだけです。

  • PUSH:スタックの一番上にデータを積む(追加する)
  • POP:スタックの一番上からデータを取り出す(削除する)

身近な例で考えてみましょう。本を机の上に積み上げたとき、取り出せるのは一番上の本だけです。これがまさにスタックの動作です。

コンピュータでは、Webブラウザの「戻る」ボタンがスタックの代表例です。ページA → B → C と遷移すると、閲覧履歴がスタックに積まれます。「戻る」を押すと、最後に見たページC から順に B、A と戻っていきます。

試験で出るポイント

過去問では、PUSH と POP を順に実行して「最終的にスタックに残るデータは何か」「次に取り出されるデータは何か」を答えさせる問題が出ています。操作を1つずつ丁寧にたどることが正答のコツです。

キュー(Queue)── 先入れ先出し

Section titled “キュー(Queue)── 先入れ先出し”

キューとは、データを一列に並べ、先に入れたデータから先に取り出すデータ構造です。この取り出し方をFIFO(First In First Out:先入れ先出し)と呼びます。

キューでは、データの追加は列の末尾に行い、取り出しは列の先頭から行います。

身近な例では、プリンターの印刷待ち行列があります。先に印刷を指示したドキュメントから順に印刷されます。コンビニのレジ待ちの行列も同じ仕組みです。先に並んだ人から先に会計を済ませます。

スタックとキューは混同しやすいため、対比して整理しましょう。

比較項目スタックキュー
取り出し順LIFO(後入れ先出し)FIFO(先入れ先出し)
イメージ積まれた本レジ待ちの行列
追加の位置上(トップ)末尾
取り出しの位置上(トップ)先頭
具体例ブラウザの「戻る」機能プリンターの印刷待ち

試験で出るポイント

「LIFO はスタック、FIFO はキュー」──この対応を確実に覚えましょう。選択肢でスタックとキューの説明が入れ替えられる引っかけ問題が定番です。

木構造(ツリー構造)とは、データが親子関係で階層的につながっているデータ構造です。ちょうど木を逆さにしたような形をしており、一番上に「根」、途中に「節」、末端に「葉」があります。

木構造の各要素をノード(節点)と呼びます。ノードには以下の種類があります。

用語意味
根(ルート)木構造の最上位にある唯一のノード。親を持たない
節(内部ノード)親と子の両方を持つノード。中間にある
葉(リーフ)子を持たない末端のノード

身近な例では、パソコンのフォルダ構造が木構造の代表です。「Cドライブ」というルートフォルダの下に「ドキュメント」「写真」などのフォルダがあり、さらにその下にファイルやフォルダが入れ子になっています。企業の組織図(社長 → 部長 → 課長 → 一般社員)も木構造で表現できます。

2分木(二分木)とは、すべてのノードが持つ子の数が最大2つである木構造です。つまり、各ノードは「左の子」と「右の子」の最大2つだけを持ちます。

2分木はデータの検索や並べ替えに活用される重要な構造です。たとえば「2分探索木」では、左の子には親より小さい値、右の子には親より大きい値を配置するルールにすることで、効率的にデータを探すことができます。

試験で出るポイント

木構造の用語(根・節・葉)の意味と、2分木の「各ノードの子が最大2つ」という特徴を押さえておきましょう。フォルダ構造や組織図が木構造の例として出題されることがあります。

この節で学んだデータとデータ構造の全体像を整理します。

分類用語ポイント
データの入れ物変数1つの値を格納する名前付きの箱
配列同じ種類のデータを番号付きで並べる
データのまとまりフィールドレコードファイル項目 → 1件分 → 集合体の階層
データ構造リストデータを鎖のようにつなげる。挿入・削除が容易
スタックLIFO(後入れ先出し)。PUSH / POP で操作
キューFIFO(先入れ先出し)。行列のイメージ
木構造階層的な親子関係。根・節・葉で構成
2分木子が最大2つの木構造

アプリで問題を解こう!