はじめに
この記事は「Rustでデータ構造書いてみた(B木編):前編」の続きです.まだ読んでいないかたは先にそちらをご参照下さい.
概要
前編
- B木の操作について説明したよ
- 検索
- 挿入
後編
- B木の操作について説明したよ
- 削除
- RustでB木の実装をしたよ
B木の仕組み
削除
B木からの削除は場合分けが多くかなり複雑ですが,1つづつみていきましょう.
B木 からキー を削除するアルゴリズムは以下のとおりです.(ノード が に存在することを仮定します)
アルゴリズム:
- を の根へのポインタで初期化する
その後,以下の場合分けにしたがう.
- キー がノード に存在し, が葉であるとき, を から削除する
- キー がノード に存在し, が内部ノードであるとき,
- における の直前の子 のサイズが 以上のとき
→ の部分木の最大値 を削除し, において を に置き換える
- における の直後の子 のサイズが 以上のとき
→ の部分木の最小値 を削除し, において を に置き換える
- , のサイズがいずれも のとき
→ をこの順で併合し,併合したノードから を削除する
- における の直前の子 のサイズが 以上のとき
- キー がノード に存在しないとき,キー を部分木に含むような の子 を特定する. のサイズが のとき,ステップ3-1, 3-2のいずれかを実行し, の適切な子に再帰する.
- のサイズが であり,かつ, または のサイズが のとき
→ のキーを に移す.その代わりとして, の最大値,または の最小値を削除し,元あった場所に挿入する. または の適切な子ポインタも に移動する.
- のサイズが であり,かつ, と のサイズがどちらも のとき
→ をどちらかの兄弟と併合する
- のサイズが であり,かつ, または のサイズが のとき
ノードの併合については以下で説明します.
ノードの併合
ノード のキー の左の子 ,右の子 のサイズがともに であるとき, , のキーをこの順に に移し, を削除します. 子のポインタについても適切に移動します.
例で見ていきましょう.
1. 葉からの削除
値 を削除する場合を考えます.
- の右の子に進みます
- の左の子に進みます.
- を発見したので削除します.
- これで完了です.
2-1. 内部ノードからの削除(左右のいずれかの子のサイズが t 以上)
値 を削除する場合を考えます.
- の左の子に進みます.
- を発見しますが,そのまま消すことはできません. の左の子のサイズが 以上なので の左の子から最大値 を削除します.
- を削除し,その位置を先ほど取ってきた を入れて完了です.
2-2. 内部ノードからの削除(左右の両方の子のサイズが t-1 以下)
値 を削除する場合を考えます.
- の右の子に進みます.
- を発見しますが,そのまま消すことはできません. の左の子と右の子のサイズがともに なので,それらをマージします.
- マージされた頂点に進みます.
- マージされた頂点から値を削除します.
- これで完了です.
3-1,2. サイズが t-1 以下のノードに進む場合
値 を削除する場合を考えます.
- 根ノードの2つの子のサイズがともに なので,これらをマージします.(3-2)
- マージが完了しました.
- の左の子に進みますが,このノードのサイズは しかないのでそのままでは進めません.
- の右の子のサイズは 以上なので,ここから最小値を削除します.
- 削除した最小値を左の子に移します.これで左の子のサイズが 以上になりました! の左の子に移動します.
- を削除します.
- これで完了です!
実装
実装はこちらにアップロードしました:https://github.com/kentakom1213/rust-btree
各操作については,
- 検索:https://github.com/kentakom1213/rust-btree/blob/main/src/node/search.rs
- 挿入:https://github.com/kentakom1213/rust-btree/blob/main/src/node/insert.rs
- 削除:https://github.com/kentakom1213/rust-btree/blob/main/src/node/remove.rs
をご覧ください.
また,動かして遊べるページも作ったのでぜひ試してみてください.
後編のまとめ
ここまで,
- B木の操作
- 値の削除
- B木の実装
を見てきました.この記事の内容は以上となります.
おわりに
ここまで読んでくださりありがとうございました.
今年のクリスマスツリーはB木できまりですね!
メリークリスマス🎅
参考文献
- 浅野哲夫.「アルゴリズムイントロダクション」第3版 第2巻,近代科学社,2012年,p106-121
- B木,Wikipedia,https://ja.wikipedia.org/wiki/B木,2024年12月3日閲覧