【キュー】
キューとは、窓口(例えば銀行等のキャッシュディスペンサー)をイメージしてもらえればいい。
次の図のように表すことができる。
─────
入口 出口
─────
これに1,3,5,7の順に数字を格納していくと、キューの中は次のように変化していく。
──── ──── ───── ─────── ─────────
(空)→ 1 → 3 1 → 5 3 1 → 8 5 3 1
──── ──── ───── ─────── ─────────
次に、データを取り出すと、入れた順に取り出される。
これをFIFO(Last-In First-Out 先入れ先出し)という。
───────
8 5 3 → 1が取り出される
───────
───────
8 5 → 3が取り出される
───────
───────
8 → 5が取り出される
───────
このようにFIFOの処理に適しているのは、キューである。
【スタック】
再帰的な手続きを実行するとき、必要なデータを記憶しておくのに最も適切なデータ構造である。
スタックにデータA,B,C,Dをこの順に格納した後、スタックから連続して取り出すときの
動作を次の図に示す。
Push A Push B Push C Push D
━┯━━━┯━ ━┯━━━┯━ ━┯━━━┯━ ━┯━━━┯━
│ A │ → │ B │ → │ C │ → │ D │
└───┘ ├───┤ ├───┤ ├───┤
│ A │ │ B │ │ C │
└───┘ ├───┤ ├───┤
│ A │ │ B │
└───┘ ├───┤
│ A │
└───┘
Pop Pop Pop
(Dが取り出される)(Cが取り出される)(Bが取り出される)
━━┯━━━┯━━ ━━┯━━━┯━━ ━━┯━━━┯━━
→ │ C │ → │ B │ → │ A │
├───┤ ├───┤ └───┘
│ B │ │ A │
├───┤ └───┘
│ A │
└───┘
このような動きをLIFO(Last-In First-Out 後入れ先出し)といい、これに適しているのが
スタックである。
【2分探索木】
┌─┐
│a│
└┬┘
┌───┴───┐
┌┴┐ ┌┴┐
│ │ │ │
└┬┘ └┬┘
左部分木 右部分木
2分探索木では、どの要素をとっても次の式が成立つ。
(左部分木の要素の最大値)<a<(右部分木の要素の最小値)
例)
aが6の場合
左部分木の要素の最大値=5
右部分木の要素の最小値=7 になる
例)
aが12場合
左部分木の要素の最大値=11
右部分木の要素の最小値=1 になる
(17)
/ \
/ \
(15) (19)
/ \ / \
/ \ / \
(14) (16) (18) (20)
【完全2分木】
○
┌──┴──┐
○ ○
┌─┴─┐ ┌─┴─┐
○ ○ ○ ○ k=3
完全2分木は、上図のように全ての節点(○で表している)が最下層を除いて
全て2つの節点を下に持っているような「木」である。
第k層めの節点の数は 2^(k−1) で表される。
第1層〜第k層までの節点の数の合計は
1+2+4+8+・・・+2^(k−1)
で表される。これは等比級数の和になるため
(2^((k−1)+1)−1)/(2−1)=2^k−1となる。
例)
次の2分木で表される算術式はどのようになるか。
┌─┐
|−|
└┬┘
┌─────┴─────┐
┌┴┐ ┌┴┐
|+| |÷|
└┬┘ └┬┘
┌─┴─┐ ┌─┴─┐
┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐
|A| |×| |+| |F|
└─┘ └┬┘ └┬┘ └─┘
┌─┴─┐ ┌─┴─┐
┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐
|B| |C| |D| |E|
└─┘ └─┘ └─┘ └─┘
順に式を組み立てていくと
(1) BとCと×から B×C
(2) Aと(1)と+から A+B×C
(3) DとEと+から D+E
(4) (3)とFと÷から (D+E)÷F
(5) (2)と(4)と−から A+B×C−(D+E)÷F
となる。
【B木 (バランス:BALANCE)】
探索木の一種で分かれていった木の構造の深さなどがほぼ同じで、挿入や削除を
してもそれぞれの木のバランスを調整できる。
2分木に比較すると、ひとつの頂点から出る枝が多いので、データ量が多く
なっても階層がさほど深くならない、平衡(バランス)をとりやすいという
特徴がある。
さらにB木は次のような特徴がある。
・索引順編成のように、あふれ領域を使用する必要がない。動的な索引保守を
行う。
・ページ使用率は50%以上あり、格納効率が良い。索引順編成のように偏在
することがない。
・直接アクセスには向いているが、順次アクセスの効率はよくない。
B木を用いてデータを格納するとき、階層の深さが同じになるように
ノードの分割・併合を行う。
B木を用いたデータの格納は、階層型データベースなどで使用される。
○
/ \
/ \
/ \
/ \
/ \
○ ○
/ \ / \
/ \ / \
○ ○ ○ ○
/ \ / \ / \ / \
○ ○ ○ ○ ○ ○ ○ ○
データの追加などにより階層の深さに差が出てきたときには、ノードを分割
したり併合したりして、各ノード(○)の下に2つのノードが来るようにしな
がら深さを揃えるようにする。
例)
図の各接点の値には,A4<A2<A6<A5<A7<A1<A3の大小関係が成り立っている。
この関係を持つ木を2分探索木という。
┌───┐
│ A1│
└─┬─┘
┌─────┴─────┐
┌─┴─┐ ┌─┴─┐
│ A2│ │ A3│
└─┬─┘ └───┘
┌─────┴─────┐
┌─┴─┐ ┌─┴─┐
│ A4│ │ A5│
└───┘ └─┬─┘
┌─────┴─────┐
┌─┴─┐ ┌─┴─┐
│ A6│ │ A7│
└───┘ └───┘