データ構造

  • 配列 → 配列、動的配列(new とか使ってとってdeleteでけすやつ)
  • レコード型 → 構造体で表現できそう 
  • スタック → 配列+変数 LIFO(Last-in First-out 後入れ先出し) 下から詰めていって上からとる PEZとか、トランプを重ねて上からとる状態
    • トランプをシャッフル(ごちゃまぜ)して、スタックにトランプの構造体を並べて上から配る
  • キュー → 配列+変数 FIFO(First-in First-out 先入れ先出し) 待ち行列、並べた順にとる。先に並べたものを先にとる
    • エンキュー: キューにデータを格納する → 行列の後ろにデータを追加する   
    • デキュー: データを待ち列から取り出す
  • 木・グラフ
    • グラフ:有向グラフと無向グラフがあるよ。 ノード(頂点)とエッジ(辺)で表される。

木構造:根、枝、節、葉をもつ

 根:ルートとも呼ばれる。これ以上さかのぼれない一番上位の節(一番親になる節)  枝:節と節をつなぐエッジの事。  節:ここにデータが格納されている。枝によって接続されてる。上位に向かってたどると、必ず根にたどり着くはず  葉:一番下位の節、それ以上の子要素を持たない。

  親           根
 /\        / | \ ← 枝
子  子      節  節  節 
          /\ /\ /\  
           葉  葉 葉 葉 葉

二分木  C++でどうやって表現する?

        根   
      /   \
     節     節
      / \     / \
    節  節  節   節
    /\  /\ /\   /\
    葉 葉葉 葉葉 葉 葉
構造体を使って、まじめに概念通り実装
struct tree
{
    int node;//格納するデータ
    struct tree *left; //左の子
    struct tree *right; //右の子
}
構造を考慮して、配列で表現
             根       
       /   \  
      節      節
      / \      / \   
     節   節   節   節
    /\   /\  /\   /\ 
   葉  葉 葉 葉 葉 葉 葉

           0              ← 1段目 1個のデータ
        /    \
       1       2          ← 2段目 2個のデータ
       / \      / \
      3    4    5     6   ← 3段目 4個のデータ
      /\   /\  /\   /\ 
     7   8 9 10 11 12 13   14 ← 4段目 8個のデータ
     

上の図からわかること: n段目には何個の節がある? 2の(n-1)乗個の節(データ)があるよ。

  • ノード番号:上の図の配列の添え字に対応する番号の事(勝手に読んでるよ)
  • 自分から見た右の子の番号 = 自分x2+2
  • 自分から見た左の子の番号 = 自分x2+2ー1= 自分x2+1

教科書P178(1)の2分木

[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11][12][13][14]
[ 6][ 3][ 7][ 1][ 4][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]

(仮) 逆もやってみよう(配列表現→木構造図示)

[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11][12][13][14]
[ 7][ 9][15][22][11][18][27][  ][  ][  ][  ][  ][  ][  ][  ]

練習問題:これは配列で表すとどうなる?

        7           
      /  \
     9     15
    / \   / \ 
   22  11  18   27
  • game-engineer/classes/2021/game-algorithm/9-13-2.txt
  • 最終更新: 4年前
  • by root