データ構造は、たくさんのデータをどんな形に並べ、どの順で出し入れするかの決め方で、処理の手順(アルゴリズム)はこの形を前提に組み立てます。
データの型と、配列・レコード・ファイル
プログラムは、値を変数に入れて扱います。変数は、名前を付けた値の入れ物です。 入れてよい値の種類を型(タイプ)といい、整数だけを入れる整数型、小数も入れられる実数型、文字を入れる文字型、真か偽かを入れる論理型などがあります。 表の1つの項目(フィールド)にも、同じように型を決めます。点数のフィールドは整数、氏名のフィールドは文字、のようにです。 型を決めておくと、点数の欄に文字が入る、といった誤りを防げます。
値が1つなら変数1つで足りますが、40人分の点数を40個の変数で持つのは不便です。そこで使うのが次の3つの形です。
配列は同じ型を番号で並べ、レコードは型の違う項目を1件にまとめます。
配列 … 同じ型の値を並べ、1つの名前と要素番号で扱う。例:40人の点数を「点数の1番目」「点数の2番目」…と番号で呼ぶ
レコード … 1件分の、型の違う項目をまとめたもの。例:社員番号・氏名・入社日で社員1人分
ファイル … 同じ形のレコードを集めたもの。例:全社員分のレコード
配列とレコードの違いは、並べる値の型がそろっているかどうかです。 同じ型の値を番号で並べるのが配列、型の違う項目を1件分まとめるのがレコードです。 表にたとえると、レコードが横の1行、ファイルが表全体にあたります(関係データベースの表・レコード・フィールドは 17-1 データベース方式)。 配列は番号を2つ使って、行と列の表のように並べることもできます。これを2次元配列といいます。
配列の強みは、番号が分かればその場所をすぐ取り出せることです。 一方で、値が詰めて並んでいるので、途中に1つ入れるには、そこから後ろの値をすべて1つずつ後ろへずらす必要があります。 1,000個並んだ配列の先頭に1つ入れると、1,000個を動かすことになります。この弱点を補うのが次のリストです。
リスト ── 次を指す情報でつなぐ
リストは、データの1つ1つに次のデータがどこにあるかという情報を持たせ、それをたどって順につなぐ形です。 次を指すこの情報をポインタといいます。最後のデータには「次は無い」という印を入れておきます。
C を入れるときに書き換えるのは、B の次を指す情報と、C の次を指す情報の2つだけです。
A→B→D とつながったリストの B と D のあいだに C を入れるときは、C をどこか空いた場所に置き、 B のポインタを C に向け、C のポインタを D に向けるだけです。A や D は1つも動きません。 削除も同じで、B を外したければ、A のポインタを B の次の C に向け直せば、たどる道から B が消えます。
その代わり、リストは「先頭から5番目」をすぐには取り出せません。ポインタを先頭から順にたどるしかないからです。 途中への挿入や削除が多ければリスト、番号ですぐ取り出したければ配列、と向きが分かれます。 なお、次だけでなく前のデータを指すポインタも持たせると、どちらの向きにもたどれます。これを双方向リストといいます。
スタックとキュー ── 取り出す順番の決まり
データを1つずつ入れて、1つずつ取り出す入れ物を考えます。取り出す順番の決め方で、2つの形に分かれます。
スタックは入口と出口が同じ、キューは入口と出口が反対側にあります。
スタック … 最後に入れたものから取り出す。後入れ先出し(LIFO:Last In First Out)。入れることをプッシュ、取り出すことをポップという。例:Web ブラウザーの「戻る」、編集の「元に戻す」
キュー … 最初に入れたものから取り出す。先入れ先出し(FIFO:First In First Out)。待ち行列ともいう。例:プリンターの印刷の順番待ち、レジの行列
スタックは、皿を上へ積み重ねるのと同じで、取れるのはいちばん上の皿だけです。 Web ブラウザーは、開いたページを順にスタックへ積み、「戻る」を押すたびにいちばん上を取り出すので、直前に見たページからさかのぼれます。 キューは店の行列と同じで、先に並んだ人から呼ばれます。
出し入れが続くときは、頭の中だけで追わず、1回の操作ごとに中身を書き出します。 空の入れ物に A、B、C を順に入れ、1つ取り出し、D を入れ、また1つ取り出す、という同じ操作を、両方で追ってみます。
スタック(中身は下から上の順に書く) A を入れる → A B を入れる → A、B C を入れる → A、B、C 取り出す → C が出る。残り A、B D を入れる → A、B、D 取り出す → D が出る。残り A、B
キュー(中身は先頭から順に書く) A を入れる → A B を入れる → A、B C を入れる → A、B、C 取り出す → A が出る。残り B、C D を入れる → B、C、D 取り出す → B が出る。残り C、D
同じ操作でも、スタックは C、D の順、キューは A、B の順に出てきます。
スタックはいちばん新しいもの、キューはいちばん古いものが、次に出てきます。 取り出す前に「いま残っている中で、いちばん新しいのはどれか(スタック)」「いちばん古いのはどれか(キュー)」と考えれば、迷いません。
空のスタックに、A、B、C の順にデータを入れました。次に1つ取り出し、D を入れ、そのあと2つ続けて取り出しました。最後に取り出したデータはどれですか。
× A はいちばん下にあり、上に B が残っている限り取り出せません。A が先に出るのはキューのときです。
○ 正解 Bです。
A、B、C を入れる(下から A、B、C)→ 取り出すと C が出る(残り A、B)→ D を入れる(A、B、D)→ 取り出すと D が出る(残り A、B)→ 取り出すと B が出る。最後は B です。
× C は最初の取り出しで出ています。キューとして追うと、A、B、C の順に出るので最後が C になりますが、スタックは最後に入れたものから出ます。
× D は続けて取り出した2つのうち、1つ目に出ます。2つ目に出るのは、D の下にある B です。
木構造と2分木
木構造は、1つのデータから枝分かれして、下へ広がっていく階層の形です。木を逆さにした形で、上から下へ描きます。 会社の組織図(社長の下に部、部の下に課)や、パソコンのフォルダの階層がこの形です。
下に枝が続くかどうかで、節か葉かが決まります。
根(ルート) … いちばん上の1つ。ここからすべてが枝分かれする
節(ノード) … 下に枝が続いている途中の点
葉(リーフ) … 下に何もつながっていない末端
親と子 … 枝でつながった2つのうち、上が親、下が子。根以外には親が1つだけある
たとえば、社長の下に営業部があり、営業部の下に第1課と第2課がある組織図なら、根は社長です。 営業部は下に第1課と第2課が続くので節、第1課と第2課は下に何もつながっていないので葉です。 節か葉かは、名前や種類ではなく、その下に枝が続いているかどうかで決まります。
パソコンのフォルダ(ディレクトリ)とファイルの階層も、同じ決め方で読めます。手がかりになる事実は2つです。 ファイルの中には、別のファイルやフォルダを入れられません。フォルダは、中に何かを入れることも、空のまま置いておくこともできます。 この2つに「下に枝が続くかどうか」を当てはめれば、節になりうるもの、葉になりうるものが決まります (ファイルとディレクトリの仕組みは 14-3 コンピュータの構成要素)。
どの節も子を2つまでしか持たない木を2分木といいます。子は「左の子」「右の子」と区別します。 よく使われるのが、どの節でも左の子から下には自分より小さい値、右の子から下には自分より大きい値だけを置くという決まりを付けた2分木で、 値を探すときに根から比べて左か右へ進めば、見なくてよい枝を丸ごと飛ばせます。
根から順に比べて左か右へ進むので、6つのうち3つを見るだけで40に着きます。
上の2分木で 40 を探す 根の 50 と比べる → 40 は小さい → 左の子へ 30 と比べる → 40 は大きい → 右の子へ 40 と比べる → 一致。見つかった(比べたのは3回)
50 の右側にある 70 と 80 は、一度も見ていません。
ある会社の組織図は、社長の下に営業部と開発部があり、営業部の下に第1課と第2課があります。開発部の下に課はありません。この組織図を木構造と見たとき、葉にあたるものをすべて挙げたのはどれですか。
× 社長はいちばん上の1つで、根にあたります。下に営業部と開発部が続いています。
× 営業部の下には第1課と第2課が続くので、営業部は節です。葉かどうかは、部か課かではなく、下に続くものがあるかで決まります。
○ 正解 第1課と第2課と開発部です。
第1課と第2課の下には何もありません。開発部も、部ではありますが下に課が無いので、末端の葉です。
× 開発部が抜けています。開発部の下には何もつながっていないので、開発部も葉です。
まとめ
この回で持ち帰ること
1. 変数やフィールドには、入れてよい値の種類(型)を決める。配列=同じ型を要素番号で並べる、レコード=型の違う項目を1件分まとめる、ファイル=レコードの集まり
2. 配列は番号ですぐ取り出せるが、途中への挿入・削除では後ろをずらす。リストはポインタ(次を指す情報)でつなぎ、挿入・削除はポインタの書き換えで済む
3. スタック=後入れ先出し(LIFO。プッシュ/ポップ)。キュー=先入れ先出し(FIFO。待ち行列)。出し入れは1回ごとに中身を書き出して追う
4. 木構造は根・節・葉・親・子で表す。下に続くものがあれば節、無ければ葉。名前や種類では決まらない
5. 2分木=どの節も子が2つまで。左側に小さい値・右側に大きい値を置くと、根から比べて左右へ進むだけで探せる
この節で解ける公開問題
令和4〜8年度の公開問題のうち、この節の知識が決め手になる問題は次の1問です。
同じ分野の過去問を続けて解く(アルゴリズムとプログラミング 17問) →
教科書の一覧(現行の試験の順)教科書の一覧(新しい試験の順)過去問
Udemy の ITパスポート講座を、受講者数・★評価・口コミで比べたページです(広告を含みます)。
出典:IPA「ITパスポート試験 シラバス Ver6.5」。 練習問題は当サイトが説明のために作ったものです。

