データ構造

snack
snack

私たちは仕事などで様々なデータを扱うっすが、それらのデータはデータベースにきれいな形で整理・管理されているからこそ効率的に扱うことができるんすよ。

ボキタロー
ボキタロー

へぇー、今まで意識したことはなかったけどデータってそんな感じで管理されているんだね。

snack
snack

データ構造は次回学習するアルゴリズムを理解するための基礎知識になるっす。

目標・データ構造の基本的な考え方を理解する。
説明・業務データの分析や整理を行うために,データ及びデータ構造の基本的な考え方を理解する。
データ構造の概要

データ構造とは

コンピュータが取り扱うデータは一定の形式に従って格納されていますが、この形式のことをデータ構造といいます。

コンピュータの処理では、どのようにデータを格納して整理するかによってプログラムでのデータの扱いやすさが決まります。そのため、データ構造について理解し、それを適切に選択・使用することが、プログラミングにおいては重要な要素となります。

テーブル

情報を格納する表のことをテーブルといいます。このテーブルにおいて、データを1行に並べたもの(表の行のあたるもの)をレコードと呼び、表の列にあたるものをフィールドと呼びます。

テーブル
snack
snack

この辺については、データベースのところでもう少し詳しく学習するっす。

さらっと学習【配列】

フィールド内のデータを1列に並べたものを配列といいます。例えば、学生の平均点を知りたい場合は、各学生の得点だけが分かればいい(ほかの情報は必要ない)ので、「得点」のフィールド内のデータを [65, 93, 71,48]といった形で並べておくとプログラムで処理しやすくなります。

変数

プログラムで扱うデータを一時的に記憶する領域のことを変数と呼びます。変数はいわばデータを入れる箱のようなものです。この箱(変数)にいろいろな数値や文字を代入することによって、プログラムの実行結果を変化させることができます。

例えば、テストの得点が70点以上であれば「合格」、69点以下であれば「不合格」を出力するというようなプログラムを作りたいとします。

もし変数を使わなければ、0点のときは「不合格」、1点のときは「不合格」、2点のときは「不合格」・・・・、70点のときは「合格」、71点のときは「合格」・・・と、0点から100点までの101通りのプログラム文を用意しなければなりません。

しかし、変数を用いることで「変数”得点”に受験者の得点を代入し、変数”得点”が70点以上であれば「合格」、69点以下のときは「不合格」を出力する」というようなプログラム文を用意すれば、短いプログラム文で早く正確に処理することができるようになります。

変数

木構造

ひとつの要素が複数の子要素を持ったデータ構造を木構造(ツリー構造)といいます。階層が深くなるほど枝分かれしていき、木をひっくり返したような構造になっていることから木構造と呼ばれます。

木構造
参考

なお、要素が最大で2つの子を持つ木構造のことを2分木(バイナリツリー)といいます。2分探索法というデータの探索アルゴリズムなどで利用されます。

スタックとキュー

データの入力や出力(削除)を行う場合、その順序が問題となることがあります。この基本的な考え方となるものがスタックキューです。

スタック

コンピュータにおける基本的なデータ構造の1つで、データを後入れ先出し(LIFO: Last In First Out)の構造で保持します。つまり、後から入力したデータ(もっとも新しいデータ)を先に出力するという考え方です。

snack
snack

積み上げた本を上からとっていくようなイメージっすね。

push(プッシュ)で指定したデータを追加し、pop(ポップ)でデータを1個取り出します。

例題

スタックのデータ構造で、push a → push b → pop → push c、の順序で操作を行った場合。

スタック

popの操作では、最も新しい直近のデータ「b」を取り出します

キュー

コンピュータにおける基本的なデータ構造の1つで、データを先入れ先出し(FIFO: First In First Out)の構造で保持します。つまり、先に入力したデータ(もっとも古いデータ)を先に出力するという考え方です。

snack
snack

レジなどの待ち行列のようなイメージっすね。

enq(エンキュー)で指定したデータを追加し、deq(デキュー)でデータを1 個取り出します。

例題

キューのデータ構造で、enq a →enq b → deq →enq c、の順序で操作を行った場合。

キュー

deqの操作では、最も古いデータ「a」を取り出します

確認○×問題

問1

情報を格納する表のことをテーブルと呼び、データを1行に並べたものをフィールド、表の列にあたるものをレコードという。

答え:×

フィールドとレコードの説明が逆になっています。正しくは以下の記述となります。

情報を格納する表のことをテーブルと呼び、データを1行に並べたものをレコード、表の列にあたるものをフィールドという。

問2

二つの変数xとyに対して、次の手続きを1から順に実行する。処理が終了したとき、xの値は”4”になる。

(手続き)

  1. xに2を代入し、yに3を代入する。
  2. yの値から1を引いたものをyに代入する。
  3. xの値とyの値を加えたものをxに代入する。
  4. y≠1なら手続き2に戻り、y=1なら終了する。

答え:×

変数xと変数yの値を表にすると次のようになります。

手続き変数x変数y
123
222(=3-1)
34(=2+2)2
44y≠1なので手続き2に戻る
241(=2-1)
35(=4+1)1
45y=1なので終了

以上より、処理が終了したときのxの値は”5”になります。

問3

変数AとBに格納されているデータを入れ替えたい。データを一時的に格納するための変数をTMPとすると、次の手順によってデータを正しく入れ替えることができる。ここで”x←y”は、yのデータでxの内容を置き換えることを表す。

  1. TMP←A
  2. A←B
  3. B←TMP

答え:〇

変数AとBに格納されているデータを入れ替えたい場合、いきなり「A←B」としてしまうと、AのデータがBのデータで上書きされ、Aの内容が消えてしまいます。そこで、いったん変数TMPにAのデータを逃がしてやる必要があります。

変数Aに格納されているデータを「a」、変数Bに格納されているデータを「b」として考えていきます。

手順変数A変数BTMP
1aba
2bba
3baa

問4

木構造では、ひとつの親要素がもつ子要素は常に2つでなければならない。

答え:×

ひとつの要素が複数の子要素を持ったデータ構造を木構造(ツリー構造)といいます。なお、要素が最大で2つの子を持つ木構造のことを2分木(バイナリツリー)といいます。

問5

下から上へ品物を積み上げて、上にある品物から順に取り出す装置がある。この装置に対する操作は、次の二つに限られる。

PUSH x:品物 xを1個積み上げる。
POP:一番上の品物を1個取り出す。

最初は何も積まれていない状態から開始して、a、b、cの順で三つの品物が到着する。一つの装置だけを使った場合、以下のPOP操作で取り出される品物の順番として不可能なものが2つある。

  1. a,b,c
  2. b,a,c
  3. c,a,b
  4. c,b,a

答え:×

スタックは、コンピュータにおける基本的なデータ構造の1つで、データを後入れ先出し(LIFO: Last In First Out)の構造で保持します。push(プッシュ)で指定したデータを追加し、pop(ポップ)でデータを1個取り出します。

1.の順番での取り出し(可能):a,b,c

①push a:[a]

②pop:[ ]→aを取り出す

③push b:[b]

④pop:[ ]→bを取り出す

⑤push c:[c]

⑥pop:[ ]→cを取り出す

2.の順番での取り出し(可能):b,a,c

①push a:[a]

②push b:[a,b]

③pop:[a,b]→bを取り出す

④pop:[a]→aを取り出す

⑤push c:[c]

⑥pop:[ ]→cを取り出す

3.の順番での取り出し(不可能):c,a,b

①push a:[a]

②push b:[a,b]

③push c:[a,b,c]

④pop:[a,b]→cを取り出す

⑤次にpop操作をするとbが取り出されます。したがって、スタックではcの次にaを取り出すことはできません。

4.の順番での取り出し(可能):c,b,a

①push a:[a]

②push b:[a,b]

③push c:[a,b,c]

④pop:[a,b]→cを取り出す

⑤pop:[a]→bを取り出す

⑥pop:[ ]→aを取り出す

以上より、POP操作で取り出される品物の順番として不可能なものは1つ(3.の順番)です。

問6

先入れ先出し(First-In First-Out, FIFO)処理を行うのに適したキューと呼ばれるデータ構造に対して「8」、「1」、「6」、「3」 の順に値を格納してから、取出しを続けて2回行った。2回目の取出しで得られる値は「1」である。

答え:〇

キューは、コンピュータにおける基本的なデータ構造の1つで、データを先入れ先出し(FIFO: First In First Out)の構造で保持します。enq(エンキュー)で指定したデータを追加し、deq(デキュー)でデータを1 個取り出します。

キューでは古いデータから先に取り出すため「8」、「1」、「6」、「3」の順に値を格納した場合、取り出しの順番も「8」、「1」、「6」、「3」の順になります。したがって、2回目の取出しで得られる値は「1」となります。

問7

スタックとキューの二つのデータ構造がある。次の手続を順に実行した場合、変数xに代入されるデータは「b」である。ここで、

データyをスタックに挿入することを push(y)、

スタックからデータを取り出すことを pop()、

データyをキューに挿入することを enq(y)、

キューからデータを取り出すことを deq()、

とそれぞれ表す。

①push(a)

②push(b)

③enq(pop())

④enq(c)

⑤push(d)

⑥push(deq())

⑦x ← pop()

答え:〇

少しややこしいのですが、図を描きながら考えるとわかりやすいと思います。

①push(a):スタックに「a」を追加する

②push(b):スタックに「b」を追加する

③enq(pop()):キューに「スタックから取り出した値(b)」を追加する

④enq(c):キューに「c」を追加する

⑤push(d):スタックに「d」を追加する

⑥push(deq()):スタックに「キューから取り出した値(b)」を追加する

⑦x ← pop():xに「スタックから取り出した値(b)」を代入する

よって、変数xに代入されるデータは「b」となります。