老王:最近怎么没精打采的呢?
小王:最近面试卡住了,B+ tree 没回答上来
老王:不对呀,你不早就学过吗,经典教程都写这呢?
小王:别提啦,当时脑中一片空白。
当时情况是这样的!
大王:谈谈你对B+ tree理解?
小王:这个我知道,就是数据全部存储到叶子节点上,在同一层次 !
大王;然后呢。。。。
小王:支支吾吾 说不上来了。
大王:还有没有补充的
小王:查询效率很高。
大王:怎么查询的?
小王:。。。。。。。
大王:过,就到这里。
老王:我来讲一讲
查询tree_search (k, root) 逻辑
从对应子树 继续寻找tree_search (k, root.1.child) 递归遍历
Function: tree_search (k, node)
if node is a leaf then
return node;
switch k do
case k ≤ k_0
return tree_search(k, p_0);
case k_i < k ≤ k_{i+1}
return tree_search(k, p_{i+1});
case k_d < k
return tree_search(k, p_{d});
小王:
我有一个疑问,查询元素12时候,明明中间元素 已经存在,为什么还要继续查询走到叶子节点才算结束, 这不是浪费时间吗?
老王:
观察很仔细呀,漫画算法:什么是 B+ 树。
程序员小灰已经给出解释了,你不是看过一次,怎么忘记了!
小王:
我确实看过,不过对里面一句话根本不明白
有K个元素,K个指针 ,一个节点对应一个指针呀, 这个不对呀,2个元素会拆分3个指针呢?
在叶子节点 (1 2 3) 上插入新元素 4 ,B tree 结果是:
在叶子节点 (1 2 3) 上插入新元素 4 ,B+ tree 结果是:
顺序插入元素:1 2 3 4 5 6 7 9 10 11 创建 4 阶 B+ tree 完整演示(慢速10倍)
插入关键字k的步骤
删除元素 5
删除元素 7
7.gif
(小王)这个有点复杂,需要借助相邻的元素,这个操作我描述不出来
基本分为三个步骤
但是漏洞很多,无法具体描述。开始支支吾吾了
(老王) 你说对,这个情况比较复杂。未完待续
B+ tree 是一个 M 阶平衡搜索树 (Balanced multiway search trees)
哈哈哈
你一已经猜到 一个4阶B+tree,一个节点最多允许 3个key,4个子树指针。
因为B+ tree 结构是递归的,我只专心看最小子问题,就是一个节点组成
typedef struct BTNode{
int keynum; /// 结点中关键字的个数,ceil(ORDER/2)-1<= keynum <= ORDER-1
KeyType key[ORDER-1]; /// 关键字向量为key[0..keynum - 1]
struct BTNode* child[ORDER]; /// 孩子指针向量为child[0..keynum]
char isLeaf; /// 是否是叶子节点的标志
}BTNode;
数据结构和算法结构化
B+ treeFrom Wikipedia
MySQL索引背后的数据结构及算法原理
漫画算法:什么是 B+ 树
算法导论 18章