SlideShare a Scribd company logo
1 of 38
Download to read offline
データ構造
    と
 アルゴリズム
( データの検索、 B-Tree)
ある値(キー)を持つデータ
    (レコード)を検索する

●   データの持ち方:データ構造
●   データの扱い方:アルゴリズム



    データ構造とアルゴリズムは表裏一体
データ構造

●   データを整理するための箱・
    構造
●   例)
         配列、リスト、スタック、キュー、
          木、グラフ …
木構造とは (1/2)

●   各データは親子構造で格納
●   子は一つしか親を持たない
●   閉路がない
    (≠ グラフ )

                Wikipedia 木構造 ( データ構造 )
木構造とは (2/2)
●   基本的には再帰的な扱いをする
●   用語:ノードとエッジ、ルート ( ノード ) 、
    リーフ ( 葉 ) ノード
ノードの構造
   子へのポインタ (2 つだと 2 分木、それ以上で
    多分木 )
   キー値
   データへのポインタ ( 必要なら )


    キー値 ( 配列 )
                   子ノードへのポインタ ( 配列 )
    (2 分木は 1 つ )
2 分探索木
●   ( 左の子のキー値 ) < ( 親のキー値 ) < ( 右の
    子のキー値 )
●   木を下る:おおざっぱな探索 → 詳細な探索
    ( 絞り込み )
●   木の高さ (log N)
       → 探索の回数
2 分探索木のためのアルゴリズム 1/5
                   ( 基本 )
●   木の走査アルゴリズム
●   基本的に次のステップ
      –   木の中で入力キーのポジションを決める
           ●   キーがそこに存在したら特定の処理
      –   ポジションの子に対して再帰的に処理を
           実行 ( 葉の場合には特定の処理 )
                  sub inorder_display(node) {
                     if (node->left) inorder(node->left);
                     print node->value;
                     if (node->right) inorder(node->right);
                  } # 大体こんな感じ
2 分探索木のためのアルゴリズム 2/5
                                  ( 探索 )
 以下をルートから再帰的に行う
1. 現在いるノードのキーと入力キーを比較、大小を
  見て左右どちらかのノードで再帰呼出し
2. 入力キーと等しいものがあれば発見 ( 探索終了 )
3. 葉ノードまで辿って見つからなかったら存在しな
  い ( 探索終了 )


(2 分木の疑似アルゴリズムはグループに一部記載があります )
2 分探索木のためのアルゴリズム 3/5
      ( ソート済キーリスト取得 )

以下をルートから再帰的に行う
1. 左のノードがあれば辿って再帰呼出し
2. リストにキーを追加する
3. 右のノードがあれば辿って再帰呼出し
( 中間順走査 )
2 分探索木のためのアルゴリズム 4/5
                        ( 挿入 )
●   手順は探索とほぼ同様
●   探索失敗確定位置に ( 子ノードとして ) 挿入す
    る               L




                           L
2 分探索木のためのアルゴリズム 5/5
                   ( 削除 1/3)
1. ルートから手順を開始する。
2. 現在いるノードのキーと入力キーを比較、大
  小を見て左右どちらかのノードを辿って再帰
3. 着目ノードが削除する対象(以下、削除ノー
  ド)の場合
   次のページへ
2 分探索木のためのアルゴリズム 5/5
                    ( 削除 2/3)
3. 着目ノードが削除する対象(以下、削除ノー
  ド)の場合
  a) 削除ノードが子どもを持たないなら、その
     ノードをそのまま削除する。
  b) 削除ノードが子どもを一つしかもっていない
     場合は、削除ノードを削除してその子どもと
     置き換える。
                          b
  c) ( 次ページ )
                a
2 分探索木のためのアルゴリズム 5/5
                         ( 削除 3/3)
3. 着目ノードが削除する対象(以下、削除ノー
  ド)の場合
      c) 削除ノードが子どもを二つ持つ場合
         i. 削除ノードの左の子から最大の値を ( 再帰的
            に ) 探索する。
         ii. i. で探索してきたノード(以下、探索ノード)
             を削除対象のノードと置き換えて、削除対象の
             ノードを削除する。このとき探索ノードの左の
          子を探索ノードの元位置に置き換える
 *D
               ( 最大・最小、左右は逆でも良い )
多分木とは
●   2 分木の各ノードのキーは 1 つ、子は 2 つ

    → キー・子へのポインタを配列とし、 2 以上の
    キー・子を取れるようにしたもの
●   基本的なアルゴリズムは 2 分木と同様
      –   左右の子 → 該当キーの前後の子




          詳しくは B-Tree で !
単純な木構造アルゴリズムの
                                  問題点
●   バランスが保証されない
     –   追加・削除等の操作順によっては線形探
          索と同じ探索コストになることもある
              a


                  b

                      c


                          d


                              e
そこで Btree




( 以降の図はアルゴリズムイントロダクション第 2 巻からの引用 )
Btree とは
    特徴
●   多分木の平衡木 ( バランス木 )
●   全部の葉ノードが常に同じ高さ (Log オー
    ダー保証 )
●   各葉のキーの詰まり方 ( 密度 ) は半分以上
    を保証する
Btree とは
    定義 (1/2) :文字
●   ノード x の持つフィールド
●   キー数: n[x]
●   キー配列: key[x]_i
●   子供へのポインタ : c_i[x] ( i は n[x]+1 まで )
●   葉であるかどうか: leaf[x] (Boolean)

    ( 今回はアルゴリズムイントロダクション 18 章の定
    義・実装 )
Btree とは
    定義 (2/2)
●   すべての葉は同じ深さを持つ
●   1 つのノードが格納できるキー数に上界と下界がある。
       –   ルートを除く全てのノードは t 以上の子を持つ
            (t: 最小次数 )
       –   ルートは少なくとも 1 つのキーを持つ
       –   どのノードも最大 2t-1 個のキーを格納できる
Btree のアルゴリズム

●   探索、リスト取得は N 分木同様
●   挿入、削除時にバランス取れるような工夫 ( ア
    ルゴリズム ) が入っている
Btree のアルゴリズム
              ( 挿入時のノードの分割処理 )
●   飽和ノードを 2 分割、中央キーを親に上げる
●   木の高さは基本的に不変 ( ルートの分割でのみ高さ増え
    る)
                      ノード x における split_child




●   挿入により木があふれないことを保証して木を下る
Btree のアルゴリズム
            ( 挿入時のノードの分割処理 )
●   ツリーの成長:ルートノードの分割
Btree のアルゴリズム
                ( 挿入処理例 )




葉に挿入




分割して
葉に挿入




ルート分割して
木が成長
Btree のアルゴリズム
                            ( 削除 )
●   ノードの併合処理
      –   キーが足りなくなる可能性のあるノードを兄弟で
           マージ ( 削除後にキーの密度が半分以上になる
           ように )
      –   やり方:親から両者を分けるキーを拝借して繋ぐ
           ( 挿入時の分割と逆 )
●   木の高さは不変 ( ルートの併合でのみ高さが減る )
●   経路上、どこで削除してもノード条件を満たせるよう保
    証しながら木を下る
Btree のアルゴリズム
( 削除の具体例 1:t=3 ( 最大キー数 5 、最小キー数 2))
1. 接点 x にキーが存在し、 x が葉の場合

   そのまま削除可能




      x
Btree のアルゴリズム
                          ( 削除の具体例 2)
2. 接点 x にキーが存在し、 x が節の場合
a. 直前の子 y が t 以上のキーを持っている (*)

b. 直後の子 y' が t 以上のキーを持っている

       x

           y


           左の子の最大値
           ( 再帰的に探索 )


                上書き



               削除
Btree のアルゴリズム
                      ( 削除の具体例 3)
2. 接点 x にキーが存在し、 x が節の場合

c. 前後の子が両方 t 未満のキー → 併合

      x




          子の併合



            上書き
Btree のアルゴリズム
                             ( 削除の具体例 4)
3. 接点 x にキーが存在せず、 x が節の場合
  ( 葉の場合は消せないので終了 ( 何もしない ) 、それ以外は削除枠を担保 )

 b. 前後の子が両方 t 未満のキー → 併合 ( 削除枠担保 )
                   x


                                       上書き
           y




                       削除   ルートは最後にチェックして
                            キーが空なら削除
挿入時の分割と
逆の操作
Btree のアルゴリズム
                            ( 削除の具体例 5)
3. 接点 x にキーが存在せず、 x が節の場合
 ( 葉の場合は消せないので終了 ( 何もしない ) 、それ以外は削除枠を担保 )

a. 左右どちらかが t 以上のキーを持つ → 拝借する

              x




     辿った後に B は削除される
以下参考 ( 課題はグループ )
( 参考 ) Btree のアルゴリズム
                                       ( 疑似コード:検索 )
B-Tree-Search(x, k)

   i <- 1
    while i <= n[x] and k > key_i[x]
        do i <- i + 1 // find_location の動作
    if i <= n[x] and k = key_i[x]
        then return (x, i)
    if leaf[x]
        then return NIL
        else
            return B-Tree-Search(c_i[x], k)
( 参考 ) Btree のアルゴリズム
                                       ( 疑似コード:挿入 )
B-Tree-Insert(T, k)

  r <- root[T]
  if n[r] = 2t - 1
    then s <- Allocate-Node()
        root[T] <- s
        leaf[s] <- FALSE
        n[s] <- 0
        c_1 <- r
        B-Tree-Split-Child(s, 1, r)
        B-Tree-Insert-Nonfull(s, k)
    else B-Tree-Insert-Nonfull(r, k)
( 参考 ) Btree のアルゴリズム
       ( 疑似コード:飽和してないノードへの挿入 )
B-Tree-Insert-Nonfull(x, k)

i <- n[x]                              i <- i + 1
if leaf[x]                             if n[c_i[x]] = 2t - 1
  then while i >= 1 and k < key_i[x]   then B-Tree-Split-Child(x, i, c_i[x])
        do key_i+1[x] <- key_i[x]          if k > key_i[x]
             i <- i - 1                     then i <- i + 1
       key_i+1[x] <- k                 B-Tree-Insert-Nonfull(c_i[x], k)
       n[x] <- n[x] + 1
  else while i >= 1 and k < key_i[x]
        do i <- i - 1
( 参考 ) Btree のアルゴリズム
                      ( 疑似コード:挿入のための子分割 )
B-Tree-Split-Child(x, i, y)

z <- Allocate-Node()          n[y] <- t - 1
leaf[z] <- leaf[y]            for j <- n[x] + 1 downto i + 1
n[z] <- t - 1                   do c_j+1[x] <- cj[x]
for j <- 1 to t - 1           c_i+1 <- z
  do key_j[z] <- key_j+t[y]   for j <- n[x] downto i
if not leaf[y]                  do key_j+1[x] <- key_j[x]
  then for j <- 1 to t        key_i[x] <- key_t[y]
      do c_j[z] <- c_j+t[y]   n[x] <- n[x] + 1
( 参考 ) Btree のアルゴリズム
                   ( 疑似コード:削除の疑似コード 1/2)
B-Tree-Delete(x, k): 斜体は定義なし
i ← find_location (x, k)                        else if n[c_i+1[x]] > t-1 // a'.
// 1.                                              then km <- find_min(c_i+1[x])
if exists (key_i[x], k) then                       key_i[x] = km
  if leaf[x]                                       B-Tree-Delete(c_i+1[x], km)
    then return delete key_i[x]                 else // c.
// 2. x が中間ノード                                     // c_i[x] 側にマージ
    else                                           Merge-Child (x, c_i[x], c_i+1[x])
        if n[c_i[x]] > t-1 // a.                   B-Tree-Delete (c_i[x], k)
           km <- find_max(c_i[x])           else // 3. x にキーがない
           key_i[x] = km                      // ( 次ページ )
           B-Tree-Delete(c_i[x], km)
                                       find_location は List::MoreUtils::firstidx を使うと簡単
( 参考 ) Btree のアルゴリズム
                 ( 疑似コード:削除の疑似コード 2/2)
B-Tree-Delete(x, k): 斜体は定義なし
 // 3a                                  else
if n[c_i-1[x]] > t-1 then                 Merge-Child(x,c_i-1[x], c_i[x])
  // 右回転
  rotate_right (x, c_i[x], c_i-1[x])
 // 3b
  else if n[c_i+1[x]] > t-1 then
   // 左回転
   rotate_left (x, c_i[x], c_i+1[x])
  else
    if c_i+1[x] then
      Merge-Child(x,c_i[x], c_i+1[x])
その他参照

    id:ninjinkun のスライド参照
●   http://www.slideshare.net/ninjinkun/algo
    rithm-introduction-18-btree?
    type=powerpoint

More Related Content

What's hot

何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作るTaketo Sano
 
第5章 拡張モデル(前半)
第5章 拡張モデル(前半)第5章 拡張モデル(前半)
第5章 拡張モデル(前半)Akito Nakano
 
最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)
最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)
最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)Nguyen Tuan
 
アルゴリズムとデータ構造7
アルゴリズムとデータ構造7アルゴリズムとデータ構造7
アルゴリズムとデータ構造7Kenta Hattori
 
PFDS 5.5 Pairing heap
PFDS 5.5 Pairing heapPFDS 5.5 Pairing heap
PFDS 5.5 Pairing heap昌平 村山
 
第2回R勉強会1
第2回R勉強会1第2回R勉強会1
第2回R勉強会1Paweł Rusin
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化Miyoshi Yuya
 
「トピックモデルによる統計的潜在意味解析」読書会 2章前半
「トピックモデルによる統計的潜在意味解析」読書会 2章前半「トピックモデルによる統計的潜在意味解析」読書会 2章前半
「トピックモデルによる統計的潜在意味解析」読書会 2章前半koba cky
 
第三回R勉強会
第三回R勉強会第三回R勉強会
第三回R勉強会Paweł Rusin
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作るTaketo Sano
 
すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料Hiromasa Ohashi
 
データを工夫して記録するデータ構造
データを工夫して記録するデータ構造データを工夫して記録するデータ構造
データを工夫して記録するデータ構造Katsutoshi Nagaoka
 
Casual learning machine learning with_excel_no4
Casual learning machine learning with_excel_no4Casual learning machine learning with_excel_no4
Casual learning machine learning with_excel_no4KazuhiroSato8
 
04.第四章用Matlab求偏导数
04.第四章用Matlab求偏导数04.第四章用Matlab求偏导数
04.第四章用Matlab求偏导数Xin Zheng
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数Taketo Sano
 
130604 fpgax kibayos
130604 fpgax kibayos130604 fpgax kibayos
130604 fpgax kibayosMikio Yoshida
 
第5章 時系列データのモデリング, 補助情報を考慮したモデリング
第5章 時系列データのモデリング, 補助情報を考慮したモデリング第5章 時系列データのモデリング, 補助情報を考慮したモデリング
第5章 時系列データのモデリング, 補助情報を考慮したモデリングksmzn
 
ノートの作成法(数学)
ノートの作成法(数学)ノートの作成法(数学)
ノートの作成法(数学)studyPresenter
 

What's hot (20)

何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作る
 
第5章 拡張モデル(前半)
第5章 拡張モデル(前半)第5章 拡張モデル(前半)
第5章 拡張モデル(前半)
 
最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)
最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)
最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)
 
アルゴリズムとデータ構造7
アルゴリズムとデータ構造7アルゴリズムとデータ構造7
アルゴリズムとデータ構造7
 
PFDS 5.5 Pairing heap
PFDS 5.5 Pairing heapPFDS 5.5 Pairing heap
PFDS 5.5 Pairing heap
 
第2回R勉強会1
第2回R勉強会1第2回R勉強会1
第2回R勉強会1
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化
 
動的計画法
動的計画法動的計画法
動的計画法
 
「トピックモデルによる統計的潜在意味解析」読書会 2章前半
「トピックモデルによる統計的潜在意味解析」読書会 2章前半「トピックモデルによる統計的潜在意味解析」読書会 2章前半
「トピックモデルによる統計的潜在意味解析」読書会 2章前半
 
第三回R勉強会
第三回R勉強会第三回R勉強会
第三回R勉強会
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作る
 
すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料
 
Rで学ぶロバスト推定
Rで学ぶロバスト推定Rで学ぶロバスト推定
Rで学ぶロバスト推定
 
データを工夫して記録するデータ構造
データを工夫して記録するデータ構造データを工夫して記録するデータ構造
データを工夫して記録するデータ構造
 
Casual learning machine learning with_excel_no4
Casual learning machine learning with_excel_no4Casual learning machine learning with_excel_no4
Casual learning machine learning with_excel_no4
 
04.第四章用Matlab求偏导数
04.第四章用Matlab求偏导数04.第四章用Matlab求偏导数
04.第四章用Matlab求偏导数
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
 
130604 fpgax kibayos
130604 fpgax kibayos130604 fpgax kibayos
130604 fpgax kibayos
 
第5章 時系列データのモデリング, 補助情報を考慮したモデリング
第5章 時系列データのモデリング, 補助情報を考慮したモデリング第5章 時系列データのモデリング, 補助情報を考慮したモデリング
第5章 時系列データのモデリング, 補助情報を考慮したモデリング
 
ノートの作成法(数学)
ノートの作成法(数学)ノートの作成法(数学)
ノートの作成法(数学)
 

Viewers also liked

CETS 2013, Greg Owen-Boger, Dale Ludwig, & Seth Kannof, Producing eLearning V...
CETS 2013, Greg Owen-Boger, Dale Ludwig, & Seth Kannof, Producing eLearning V...CETS 2013, Greg Owen-Boger, Dale Ludwig, & Seth Kannof, Producing eLearning V...
CETS 2013, Greg Owen-Boger, Dale Ludwig, & Seth Kannof, Producing eLearning V...Chicago eLearning & Technology Showcase
 
introtomongodb
introtomongodbintrotomongodb
introtomongodbsaikiran
 
Dress The Drink Wholesale Distribution Preso 4 21 11
Dress The Drink Wholesale Distribution Preso 4 21 11Dress The Drink Wholesale Distribution Preso 4 21 11
Dress The Drink Wholesale Distribution Preso 4 21 11dressthedrink
 
V2 digital collaboration
V2 digital collaborationV2 digital collaboration
V2 digital collaborationMary Jo Davis
 
Picasso[1]
Picasso[1]Picasso[1]
Picasso[1]mbushong
 
Moneda
MonedaMoneda
MonedaEver
 
3 months before and 3 months after entering Japan market, by Liew Choon Lian ...
3 months before and 3 months after entering Japan market, by Liew Choon Lian ...3 months before and 3 months after entering Japan market, by Liew Choon Lian ...
3 months before and 3 months after entering Japan market, by Liew Choon Lian ...Technopreneurs Association of Malaysia
 
Development of the Logistics Sector in the United States: Past, Present and F...
Development of the Logistics Sector in the United States: Past, Present and F...Development of the Logistics Sector in the United States: Past, Present and F...
Development of the Logistics Sector in the United States: Past, Present and F...Technopreneurs Association of Malaysia
 
Tech 2.0: Tech Tips to Boost Office Productivity
Tech 2.0: Tech Tips to Boost Office ProductivityTech 2.0: Tech Tips to Boost Office Productivity
Tech 2.0: Tech Tips to Boost Office ProductivityJohn Chen
 
Callture White Label Partner Presentations
Callture White Label Partner PresentationsCallture White Label Partner Presentations
Callture White Label Partner PresentationsCallture Inc
 
투이컨설팅 제11회 Y세미나 : 설문결과
투이컨설팅 제11회 Y세미나 : 설문결과투이컨설팅 제11회 Y세미나 : 설문결과
투이컨설팅 제11회 Y세미나 : 설문결과2econsulting
 

Viewers also liked (20)

CETS 2010, Steve Lowenthal, How Companies Are Making the Most of Moodle
CETS 2010, Steve Lowenthal, How Companies Are Making the Most of MoodleCETS 2010, Steve Lowenthal, How Companies Are Making the Most of Moodle
CETS 2010, Steve Lowenthal, How Companies Are Making the Most of Moodle
 
CETS 2013, Greg Owen-Boger, Dale Ludwig, & Seth Kannof, Producing eLearning V...
CETS 2013, Greg Owen-Boger, Dale Ludwig, & Seth Kannof, Producing eLearning V...CETS 2013, Greg Owen-Boger, Dale Ludwig, & Seth Kannof, Producing eLearning V...
CETS 2013, Greg Owen-Boger, Dale Ludwig, & Seth Kannof, Producing eLearning V...
 
introtomongodb
introtomongodbintrotomongodb
introtomongodb
 
Tick App
Tick AppTick App
Tick App
 
Dress The Drink Wholesale Distribution Preso 4 21 11
Dress The Drink Wholesale Distribution Preso 4 21 11Dress The Drink Wholesale Distribution Preso 4 21 11
Dress The Drink Wholesale Distribution Preso 4 21 11
 
Pavasaris
PavasarisPavasaris
Pavasaris
 
emmettryan2010
emmettryan2010emmettryan2010
emmettryan2010
 
V2 digital collaboration
V2 digital collaborationV2 digital collaboration
V2 digital collaboration
 
Study abroad 1
Study abroad 1Study abroad 1
Study abroad 1
 
Picasso[1]
Picasso[1]Picasso[1]
Picasso[1]
 
Moneda
MonedaMoneda
Moneda
 
Vietnam ICT Summit 2012 itinerary - update 29 may
Vietnam ICT Summit 2012 itinerary - update 29 mayVietnam ICT Summit 2012 itinerary - update 29 may
Vietnam ICT Summit 2012 itinerary - update 29 may
 
3 months before and 3 months after entering Japan market, by Liew Choon Lian ...
3 months before and 3 months after entering Japan market, by Liew Choon Lian ...3 months before and 3 months after entering Japan market, by Liew Choon Lian ...
3 months before and 3 months after entering Japan market, by Liew Choon Lian ...
 
Development of the Logistics Sector in the United States: Past, Present and F...
Development of the Logistics Sector in the United States: Past, Present and F...Development of the Logistics Sector in the United States: Past, Present and F...
Development of the Logistics Sector in the United States: Past, Present and F...
 
Internet Market in Indonesia June 2011
Internet Market in Indonesia June 2011Internet Market in Indonesia June 2011
Internet Market in Indonesia June 2011
 
Doc1
Doc1Doc1
Doc1
 
Tech 2.0: Tech Tips to Boost Office Productivity
Tech 2.0: Tech Tips to Boost Office ProductivityTech 2.0: Tech Tips to Boost Office Productivity
Tech 2.0: Tech Tips to Boost Office Productivity
 
Callture White Label Partner Presentations
Callture White Label Partner PresentationsCallture White Label Partner Presentations
Callture White Label Partner Presentations
 
Malaysia Freight Logistics: The Way Forward
Malaysia Freight Logistics: The Way ForwardMalaysia Freight Logistics: The Way Forward
Malaysia Freight Logistics: The Way Forward
 
투이컨설팅 제11회 Y세미나 : 설문결과
투이컨설팅 제11회 Y세미나 : 설문결과투이컨설팅 제11회 Y세미나 : 설문결과
투이컨설팅 제11회 Y세미나 : 설문결과
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 

Recently uploaded (8)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

インターン講義8日目「データ構造」

  • 1. データ構造 と アルゴリズム ( データの検索、 B-Tree)
  • 2. ある値(キー)を持つデータ (レコード)を検索する ● データの持ち方:データ構造 ● データの扱い方:アルゴリズム データ構造とアルゴリズムは表裏一体
  • 3. データ構造 ● データを整理するための箱・ 構造 ● 例) 配列、リスト、スタック、キュー、 木、グラフ …
  • 4. 木構造とは (1/2) ● 各データは親子構造で格納 ● 子は一つしか親を持たない ● 閉路がない (≠ グラフ ) Wikipedia 木構造 ( データ構造 )
  • 5. 木構造とは (2/2) ● 基本的には再帰的な扱いをする ● 用語:ノードとエッジ、ルート ( ノード ) 、 リーフ ( 葉 ) ノード
  • 6. ノードの構造  子へのポインタ (2 つだと 2 分木、それ以上で 多分木 )  キー値  データへのポインタ ( 必要なら ) キー値 ( 配列 ) 子ノードへのポインタ ( 配列 ) (2 分木は 1 つ )
  • 7. 2 分探索木 ● ( 左の子のキー値 ) < ( 親のキー値 ) < ( 右の 子のキー値 ) ● 木を下る:おおざっぱな探索 → 詳細な探索 ( 絞り込み ) ● 木の高さ (log N) → 探索の回数
  • 8. 2 分探索木のためのアルゴリズム 1/5 ( 基本 ) ● 木の走査アルゴリズム ● 基本的に次のステップ – 木の中で入力キーのポジションを決める ● キーがそこに存在したら特定の処理 – ポジションの子に対して再帰的に処理を 実行 ( 葉の場合には特定の処理 ) sub inorder_display(node) { if (node->left) inorder(node->left); print node->value; if (node->right) inorder(node->right); } # 大体こんな感じ
  • 9. 2 分探索木のためのアルゴリズム 2/5 ( 探索 ) 以下をルートから再帰的に行う 1. 現在いるノードのキーと入力キーを比較、大小を 見て左右どちらかのノードで再帰呼出し 2. 入力キーと等しいものがあれば発見 ( 探索終了 ) 3. 葉ノードまで辿って見つからなかったら存在しな い ( 探索終了 ) (2 分木の疑似アルゴリズムはグループに一部記載があります )
  • 10. 2 分探索木のためのアルゴリズム 3/5 ( ソート済キーリスト取得 ) 以下をルートから再帰的に行う 1. 左のノードがあれば辿って再帰呼出し 2. リストにキーを追加する 3. 右のノードがあれば辿って再帰呼出し ( 中間順走査 )
  • 11. 2 分探索木のためのアルゴリズム 4/5 ( 挿入 ) ● 手順は探索とほぼ同様 ● 探索失敗確定位置に ( 子ノードとして ) 挿入す る L L
  • 12. 2 分探索木のためのアルゴリズム 5/5 ( 削除 1/3) 1. ルートから手順を開始する。 2. 現在いるノードのキーと入力キーを比較、大 小を見て左右どちらかのノードを辿って再帰 3. 着目ノードが削除する対象(以下、削除ノー ド)の場合 次のページへ
  • 13. 2 分探索木のためのアルゴリズム 5/5 ( 削除 2/3) 3. 着目ノードが削除する対象(以下、削除ノー ド)の場合 a) 削除ノードが子どもを持たないなら、その ノードをそのまま削除する。 b) 削除ノードが子どもを一つしかもっていない 場合は、削除ノードを削除してその子どもと 置き換える。 b c) ( 次ページ ) a
  • 14. 2 分探索木のためのアルゴリズム 5/5 ( 削除 3/3) 3. 着目ノードが削除する対象(以下、削除ノー ド)の場合 c) 削除ノードが子どもを二つ持つ場合 i. 削除ノードの左の子から最大の値を ( 再帰的 に ) 探索する。 ii. i. で探索してきたノード(以下、探索ノード) を削除対象のノードと置き換えて、削除対象の ノードを削除する。このとき探索ノードの左の 子を探索ノードの元位置に置き換える *D ( 最大・最小、左右は逆でも良い )
  • 15. 多分木とは ● 2 分木の各ノードのキーは 1 つ、子は 2 つ → キー・子へのポインタを配列とし、 2 以上の キー・子を取れるようにしたもの ● 基本的なアルゴリズムは 2 分木と同様 – 左右の子 → 該当キーの前後の子 詳しくは B-Tree で !
  • 16. 単純な木構造アルゴリズムの 問題点 ● バランスが保証されない – 追加・削除等の操作順によっては線形探 索と同じ探索コストになることもある a b c d e
  • 18. Btree とは 特徴 ● 多分木の平衡木 ( バランス木 ) ● 全部の葉ノードが常に同じ高さ (Log オー ダー保証 ) ● 各葉のキーの詰まり方 ( 密度 ) は半分以上 を保証する
  • 19. Btree とは 定義 (1/2) :文字 ● ノード x の持つフィールド ● キー数: n[x] ● キー配列: key[x]_i ● 子供へのポインタ : c_i[x] ( i は n[x]+1 まで ) ● 葉であるかどうか: leaf[x] (Boolean) ( 今回はアルゴリズムイントロダクション 18 章の定 義・実装 )
  • 20. Btree とは 定義 (2/2) ● すべての葉は同じ深さを持つ ● 1 つのノードが格納できるキー数に上界と下界がある。 – ルートを除く全てのノードは t 以上の子を持つ (t: 最小次数 ) – ルートは少なくとも 1 つのキーを持つ – どのノードも最大 2t-1 個のキーを格納できる
  • 21. Btree のアルゴリズム ● 探索、リスト取得は N 分木同様 ● 挿入、削除時にバランス取れるような工夫 ( ア ルゴリズム ) が入っている
  • 22. Btree のアルゴリズム ( 挿入時のノードの分割処理 ) ● 飽和ノードを 2 分割、中央キーを親に上げる ● 木の高さは基本的に不変 ( ルートの分割でのみ高さ増え る) ノード x における split_child ● 挿入により木があふれないことを保証して木を下る
  • 23. Btree のアルゴリズム ( 挿入時のノードの分割処理 ) ● ツリーの成長:ルートノードの分割
  • 24. Btree のアルゴリズム ( 挿入処理例 ) 葉に挿入 分割して 葉に挿入 ルート分割して 木が成長
  • 25. Btree のアルゴリズム ( 削除 ) ● ノードの併合処理 – キーが足りなくなる可能性のあるノードを兄弟で マージ ( 削除後にキーの密度が半分以上になる ように ) – やり方:親から両者を分けるキーを拝借して繋ぐ ( 挿入時の分割と逆 ) ● 木の高さは不変 ( ルートの併合でのみ高さが減る ) ● 経路上、どこで削除してもノード条件を満たせるよう保 証しながら木を下る
  • 26. Btree のアルゴリズム ( 削除の具体例 1:t=3 ( 最大キー数 5 、最小キー数 2)) 1. 接点 x にキーが存在し、 x が葉の場合 そのまま削除可能 x
  • 27. Btree のアルゴリズム ( 削除の具体例 2) 2. 接点 x にキーが存在し、 x が節の場合 a. 直前の子 y が t 以上のキーを持っている (*) b. 直後の子 y' が t 以上のキーを持っている x y 左の子の最大値 ( 再帰的に探索 ) 上書き 削除
  • 28. Btree のアルゴリズム ( 削除の具体例 3) 2. 接点 x にキーが存在し、 x が節の場合 c. 前後の子が両方 t 未満のキー → 併合 x 子の併合 上書き
  • 29. Btree のアルゴリズム ( 削除の具体例 4) 3. 接点 x にキーが存在せず、 x が節の場合 ( 葉の場合は消せないので終了 ( 何もしない ) 、それ以外は削除枠を担保 ) b. 前後の子が両方 t 未満のキー → 併合 ( 削除枠担保 ) x 上書き y 削除 ルートは最後にチェックして キーが空なら削除 挿入時の分割と 逆の操作
  • 30. Btree のアルゴリズム ( 削除の具体例 5) 3. 接点 x にキーが存在せず、 x が節の場合 ( 葉の場合は消せないので終了 ( 何もしない ) 、それ以外は削除枠を担保 ) a. 左右どちらかが t 以上のキーを持つ → 拝借する x 辿った後に B は削除される
  • 32. ( 参考 ) Btree のアルゴリズム ( 疑似コード:検索 ) B-Tree-Search(x, k) i <- 1 while i <= n[x] and k > key_i[x] do i <- i + 1 // find_location の動作 if i <= n[x] and k = key_i[x] then return (x, i) if leaf[x] then return NIL else return B-Tree-Search(c_i[x], k)
  • 33. ( 参考 ) Btree のアルゴリズム ( 疑似コード:挿入 ) B-Tree-Insert(T, k) r <- root[T] if n[r] = 2t - 1 then s <- Allocate-Node() root[T] <- s leaf[s] <- FALSE n[s] <- 0 c_1 <- r B-Tree-Split-Child(s, 1, r) B-Tree-Insert-Nonfull(s, k) else B-Tree-Insert-Nonfull(r, k)
  • 34. ( 参考 ) Btree のアルゴリズム ( 疑似コード:飽和してないノードへの挿入 ) B-Tree-Insert-Nonfull(x, k) i <- n[x] i <- i + 1 if leaf[x] if n[c_i[x]] = 2t - 1 then while i >= 1 and k < key_i[x] then B-Tree-Split-Child(x, i, c_i[x]) do key_i+1[x] <- key_i[x] if k > key_i[x] i <- i - 1 then i <- i + 1 key_i+1[x] <- k B-Tree-Insert-Nonfull(c_i[x], k) n[x] <- n[x] + 1 else while i >= 1 and k < key_i[x] do i <- i - 1
  • 35. ( 参考 ) Btree のアルゴリズム ( 疑似コード:挿入のための子分割 ) B-Tree-Split-Child(x, i, y) z <- Allocate-Node() n[y] <- t - 1 leaf[z] <- leaf[y] for j <- n[x] + 1 downto i + 1 n[z] <- t - 1 do c_j+1[x] <- cj[x] for j <- 1 to t - 1 c_i+1 <- z do key_j[z] <- key_j+t[y] for j <- n[x] downto i if not leaf[y] do key_j+1[x] <- key_j[x] then for j <- 1 to t key_i[x] <- key_t[y] do c_j[z] <- c_j+t[y] n[x] <- n[x] + 1
  • 36. ( 参考 ) Btree のアルゴリズム ( 疑似コード:削除の疑似コード 1/2) B-Tree-Delete(x, k): 斜体は定義なし i ← find_location (x, k) else if n[c_i+1[x]] > t-1 // a'. // 1. then km <- find_min(c_i+1[x]) if exists (key_i[x], k) then key_i[x] = km if leaf[x] B-Tree-Delete(c_i+1[x], km) then return delete key_i[x] else // c. // 2. x が中間ノード // c_i[x] 側にマージ else Merge-Child (x, c_i[x], c_i+1[x]) if n[c_i[x]] > t-1 // a. B-Tree-Delete (c_i[x], k) km <- find_max(c_i[x]) else // 3. x にキーがない key_i[x] = km // ( 次ページ ) B-Tree-Delete(c_i[x], km) find_location は List::MoreUtils::firstidx を使うと簡単
  • 37. ( 参考 ) Btree のアルゴリズム ( 疑似コード:削除の疑似コード 2/2) B-Tree-Delete(x, k): 斜体は定義なし // 3a else if n[c_i-1[x]] > t-1 then Merge-Child(x,c_i-1[x], c_i[x]) // 右回転 rotate_right (x, c_i[x], c_i-1[x]) // 3b else if n[c_i+1[x]] > t-1 then // 左回転 rotate_left (x, c_i[x], c_i+1[x]) else if c_i+1[x] then Merge-Child(x,c_i[x], c_i+1[x])
  • 38. その他参照 id:ninjinkun のスライド参照 ● http://www.slideshare.net/ninjinkun/algo rithm-introduction-18-btree? type=powerpoint