アルゴリズムとデータ構造勉強会 B+tree
B+木 多量のデータの移動を避ける方法として、B木の内部節点にレコードのキーだけを格納することができる。 これらの節点には、別の場所に保存された実際のデータレコードを指すポインタだけを格納する。 プログラムによってバケットを再配列する場合でも、レコードのキーとポインタだけを移動すればよく、レコード全体を移動する必要がなくなる。 この種のB木をB+木と呼ぶ。 B木については前回の輪講資料を参考 子節点へのポインタ キー ポインタ データ データへのポインタ データ データ キー ポインタ キー ポインタ
B+木の利点 B+木の節点に格納される要素サイズを小さくすれば、プログラムは各節点にそれだけ多くのキーを格納することが可能になる。 同じサイズの節点に対して、木の次数を上げることができ、それによって木の高さを低くすることができる。 B+木は複数のキーをレコードのセットに関連付けることが容易にできる。
B+木のプログラム 別紙参照 挿入のみ、2次のB+木 根節点の分割が起こる時点で終了 構造 Key (このプログラムではage をkeyとした) ポインタ Name (名前) Age (年齢) Address (住所) キー(age) ポインタ Name(名前) Age (年齢) Address (住所)
プログラムの動作確認(1) <初期状態> saino@bass[~]%./b+tree2-24 Q:insert node ? yes: input 1 // no: input other 3 ROOT<22#67# 0# 0> ________________________________________| | | | | / _____________________________ | | | | / / ___________________| | | / / / ________| | /B_1 /B_2 /B_3 /B_4 |B_5 < 9#14#20# 0> <23#45# 0# 0> <77#112# 0# 0> < 0# 0# 0# 0> < 0# 0# 0# 0> Q:print ? yes: input 1 // no: input other 1 ROOT.b[0]:Daisuke,22,Fukuoka ROOT.b[1]:Mike,67,Hawaii B_1.[0]:Wong,9,HongKong B_1.[1]:Kent,14,London B_1.[2]:Youngman,20,Tokyo B_2.[0]:Ann,23,New York B_2.[1]:Bill,45,Paris B_3.[0]:Lucky,77,Rome B_3.[1]:Oldman,112,Okinawa
プログラムの動作確認(2) 挿入するデータ <データの挿入> Q:insert node ? yes: input 1 // no: input other 1 name = Kitano age = 50 address = Cannes ROOT<22#67# 0# 0> ________________________________________| | | | | / _____________________________| | | | / / ___________________| | | / / / ________| | /B_1 /B_2 /B_3 /B_4 |B_5 < 9#14#20# 0> <23#45#50# 0> <77#112# 0# 0> < 0# 0# 0# 0> < 0# 0# 0# 0> Q:print ? yes: input 1 // no: input other 1 ROOT.b[0]:Daisuke,22,Fukuoka ROOT.b[1]:Mike,67,Hawaii B_1.[0]:Wong,9,HongKong B_1.[1]:Kent,14,London B_1.[2]:Youngman,20,Tokyo B_2.[0]:Ann,23,New York B_2.[1]:Bill,45,Paris B_2.[2]:Kitano,50,Cannes B_3.[0]:Lucky,77,Rome B_3.[1]:Oldman,112,Okinawa 挿入するデータ
プログラムの動作確認(3) 挿入するデータ この時点で バケットが一杯 <バケットの分割> name = Rui age = 13 address = Vienna ROOT<22#67# 0# 0> ________________________________________| | | | | / _____________________________| | | | / / ___________________| | | / / / ________| | /B_1 /B_2 /B_3 /B_4 |B_5 < 9#13#14#20> <23#45#50# 0> <77#112# 0# 0> < 0# 0# 0# 0> < 0# 0# 0# 0> Q:print ? yes: input 1 // no: input other 1 ROOT.b[0]:Daisuke,22,Fukuoka ROOT.b[1]:Mike,67,Hawaii B_1.[0]:Wong,9,HongKong B_1.[1]:Rui,13,Vienna B_1.[2]:Kent,14,London B_1.[3]:Youngman,20,Tokyo B_2.[0]:Ann,23,New York B_2.[1]:Bill,45,Paris B_2.[2]:Kitano,50,Cannes B_3.[0]:Lucky,77,Rome B_3.[1]:Oldman,112,Okinawa 挿入するデータ この時点で バケットが一杯
プログラムの動作確認(4) 挿入するデータ 中間キーを新たに加える 分割 !! <バケットの分割> name = Shinji age = 17 address = Amsterdam ROOT<14#22#67# 0> ________________________________________| | | | | / _____________________________| | | | / / ___________________| | | / / / ________| | /B_1 /B_2 /B_3 /B_4 |B_5 < 9#13# 0# 0> <17#20# 0# 0> <23#45#50# 0> <77#112# 0# 0> < 0# 0# 0# 0> Q:print ? yes: input 1 // no: input other 1 ROOT.b[0]:Kent,14,London ROOT.b[1]:Daisuke,22,Fukuoka ROOT.b[2]:Mike,67,Hawaii B_1.[0]:Wong,9,HongKong B_1.[1]:Rui,13,Vienna B_2.[0]:Shinji,17,Amsterdam B_2.[1]:Youngman,20,Tokyo B_3.[0]:Ann,23,New York B_3.[1]:Bill,45,Paris B_3.[2]:Kitano,50,Cannes B_4.[0]:Lucky,77,Rome B_4.[1]:Oldman,112,Okinawa 挿入するデータ 中間キーを新たに加える 分割 !!