B木ノススメ
筑波大学附属駒場中学校 中高パ研
中学3年 河原井啓
自己紹介
• 河原井啓といいます。
• 普段はC++を使って画像加工や基礎的
なアルゴリズムの実装をやっています。
• 画像加工とか音声加工に興味がありま
す。
• twitterは@gotoloop1でやっています。
部活の紹介
• 一応中学部長なので部活の説明を…
部活の紹介(2)
• 私の部活は高1が3人、中3が5人、中2が
1人、中1が3人(?)で、合計12人ほどの
小さい部活です。最近衰退しています。
• 部員は競プロをやっていたりCGをやっ
ていたりいろいろなことをしています。
(だいたいC++を使っている)
• アットホームな感じで楽しいです。(ハ
ラスメントがすごいですが…)
部活の紹介(3)
• 年間予定的なものはこうなっています。
4月 新入生歓迎(目立つポスターを作る)
7月~11月 文化祭準備
12月~3月 JOI対策など
部活の紹介(4)
最近の実績は…
• namonakiaccountがPCKで優勝しました。
• JOIでnamonakiaccountががんばっている
ので強いと思っています。
• 今年の文化祭で数年ぶりに賞をもらいまし
た。(ポスター大賞ですけど)
少ないですね…
それでは本題へ
私がここへ来た目的
• 私がここへ来た理由は、皆さんにB木の
仲間、B+木のすばらしさを伝えるため
です。
B+木とは
• 平衡多分木の一種。
• 要素の挿入・削除・検索が1つ当たり
O(log n) (nは要素数)で行えるデータ
構造。
• C++のstd::setみたいなもの。
• でもsetより格段に早い!
B+木とは(2)
• B+木はハードディスク上に実装するの
にも適しているデータ構造なので、
データベースなどにも使われています。
また、OSなどのファイルシステムにも
使われているかもしれません。(適当)
• なので知っている人もいるかも…
B+木とは(3)
• それではB+木の構造について説明した
いと思います。
• まず、B木と同じように親ノードは1~
N個、そのほかのノードはN/2個~N個
のデータを持ちます。
• また、B木とは違って葉以外のノードは
データを持たずデータのインデックス
を持ちます。
B+木とは(4)
• 構造としてはこんな感じ
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
B+木とは(4)
• 構造としてはこんな感じ
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
B+木とは(6)
B+木の特徴としては、
• 親のノードを保持しなくてよい
• B木より大体の処理が軽い
• 実装が50行ぐらい短い(適当)
というものがあげられます。
良いところしかありません。
B+木とは(7)
• それではB+木に対する処理について説
明したいと思います。
find処理
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
20を探す場合
find処理
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
20を探す場合
find処理
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
20を探す場合
find処理
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
20を探す場合
find処理
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
20を探す場合
find処理
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
20を探す場合
find処理
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
20を探す場合
find処理
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
20を探す場合
insert処理
16
21 25
21 22
6 12
6 91 3 25 2612 13 16 17
20を挿入する場合
insert処理
16
21 25
21 22
6 12
6 91 3 25 2612 13 16 17
20を挿入する場合
insert処理
16
21 25
21 22
6 12
6 91 3 25 2612 13 16 17
20を挿入する場合
20
insert処理
16
21 22
21 22
6 12
6 91 3 25 2612 13 16 17
20を挿入する場合
20
25
insert処理
16
21
21 22
6 12
6 91 3 25 2612 13 16 17
20を挿入する場合
20
25
22
erase処理
20を削除する場合
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
erase処理
20を削除する場合
16 30
20 25
20 22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
erase処理
20を削除する場合
16 30
22 25
22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
erase処理
20を削除する場合
16 30
22
22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
erase処理
20を削除する場合
16
3022
22
6 12 35 39
6 9 35 361 3 39 4030 3225 2612 13 16 17
速度比較
• それでは最後に同じような機能を持つ
もので速度を比べた結果をお見せしま
す。
• 比較したものは、AVL木・std::set(赤黒
木)・Treap・splay木・2-3木・B木・
B+木です。
速度比較(2)
• find処理はこんな感じ
速度比較(3)
• insert処理はこんな感じ
速度比較(4)
• erase処理はこんな感じ
速度比較(5)
• どの処理でもB+木が一番早い!
• 皆さんもB+木を使いませんか?
• もう定数倍なんて怖くない!
ご清聴ありがとうございました。

b木ノススメ