B树---插入调整

本文介绍了B树的性质,包括每个节点最多有M个子树,叶节点在同一层等,并详细阐述了B树的插入过程,包括从根节点插入、从子节点插入以及分裂节点的操作。对于插入时子节点已满的情况,会执行分裂操作,以保持B树的平衡。
摘要由CSDN通过智能技术生成


前言

内存与磁盘区别
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++<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值