前言
内存与磁盘区别
1.访问内存块,访问磁盘慢
2.内存断电以后数据消失,磁盘持久存储
为什么要用B树?
存储在磁盘上的数据,想要加载到内存需要寻址,这样是比较慢的,每次大约需要10ms,要想减少这个访问磁盘次数 需要一个层级比较低的数据结构。B树层高低,每个节点对应一个btree节点。
一、性质
- 一颗M阶B树T,满足以下条件
- 每个节点至多拥有M课子树
- 根结点至少拥有两颗子树
- 除了根节点以外,其余每个分支节点至少拥有M/2课子树
- 所有的叶节点都在同一层上
- 有k课子树的分支节点则存在k-1个关键字,关键字按照递增顺序进行排序
- 关键字数量满足ceil(M/2)-1 <= n <= M-1
- 先有的数据结构,然后总结出来上面的性质
二、插入
1.从根节点插入(整棵树只有根节点)
- 如果插入时根节点满了M-1 (代码中为 2 * T->t - 1)
- 创建新节点node作为根节点
- 分裂node (3)
- 然后从子节点插入(2)
- 如果插入时根节点没有满
- 直接进入( 2)
void btree_insert(btree *T, KEY_VALUE key){
btree_node *r = T->root;
if(r->num == 2 * T->t -1){
//根节点满了 创建一个新的作为新的更节点
btree_node * node = btree_create_node(T->t, 0);
T->root = node;
node->childrens[0] = r;
btree_split_child(T, node ,0);
int i=0;
if(node->keys[0]<key) i++<