《データ構造》
Create:2002/02/11
[BACK] [NEXT] [メニュー]
【キュー】
   キューとは、窓口(例えば銀行等のキャッシュディスペンサー)をイメージしてもらえればいい。
   次の図のように表すことができる。

         ─────
      入口       出口
         ─────

   これに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│
           └───┘       └───┘

[BACK] [NEXT] [メニュー]