数据结构与算法学习笔记8:B树和B+树

数据结构与算法学习笔记8:B树和B+树

适合做索引的要求是搜索速度快,主要有以下三种结构:

  • 哈希表 : 空间固定,适合数据量少的情况
  • 红黑树 : 空间不固定,适合频繁增删,数据量不确定的情况,非常适合在内存中使用
  • B + 树 : 多路平衡搜索树(真真平衡),层高低,适合用于磁盘上,和MySQL有关系~

B 树

  • 多路平衡搜索树

  • B-Tree 是B树 中间是杠 不是B减树 别犯傻!!几阶就是几叉的意思~

特性

对于m阶的B树来说:

  • 1、每个节点最多有m-1个关键字

  • 2、根节点最少有1个关键字

  • 3、每个节点最少有ceil(m-2)-1个关键字(ceil是向上取整的意思)

  • 4、每个节点的关键字都按照从小到大的顺序排列,每个关键字的左子树的所有关键字都小于它,右子树的所有关键字都大于它

  • 5、所有叶子节点都位于同一层

插入

插入的键值对也成为记录;

  • 如果要插入的记录已经存在,需要将插入的value替换掉旧的value

  • 如果要插入的记录不在

    • 根据要插入的key,找到叶子节点并插入;

    • 判断节点关键字的个数是否小于等于m-1,小于则操作结束;

      如果大于m-1,则当前节点发生裂变,以中间节点为中心,分裂成左右两个部分,中间关键字上升至父节点当中,这个关键字的左子树指向分裂后的左半部分,右子树指向分裂后的右半部分;

    • 以父亲节点作为新的操作节点继续判断和m-1之间的关系并进行操作。

删除
  • 当前被删除key在非叶子节点,用后继key覆盖替换掉要删除的key(最后要删除的key一定在叶子节点上);
  • 删除之后,判断当前节点的关键字个数和 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1的关系;
    • 若当前节点的关键字个数大于等于 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1,则结束
    • 若当前节点的关键字个数小于 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1,则看兄弟节点的个数和 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1的关系;
      • 如果兄弟节点个数大于 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1,则将父亲节点内的关键字下移至当前节点,兄弟节点的关键字上移至父亲节点
      • 如果兄弟节点个数等于 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1,则将父亲节点的一个key下移,与当前节点及当前节点的兄弟节点进行合并,合并成一个新节点。

ps:上述的key表示key-value

B + 树

特性

对于m阶的B+树来说:

  • 1、每个节点最多有m-1个关键字
  • 2、关键字值在节点内部,按照从小到大的顺序排列,对于一个内部节点,左子树所有的key均小于它,右子树所有的key均大于等于它。(等于是因为key值可以重复,添加的时候有复制到内部节点的情况)
  • 3、B+树包含两种类型的节点:内部节点(也成为索引节点)和叶子节点,其中根节点可以是内部节点也可以是叶子节点。
  • 4、B+树和B树的不同在于:B+树的内部节点是不保存数据的,只用于索引,所有的记录都保存在叶子节点中
  • 5、每个叶子节点都存有指向相邻叶子节点的指针,叶子节点本身依关键字的大小从小到大顺序连接
插入
  • 如果为空树,则创建一个叶子节点,将记录放入其中,此时该叶子节点也为根节点;
  • 根据key值找到对应的叶子节点进行插入,判断当前节点的关键字个数和m-1的关系;
    • 小于等于m-1,插入结束;
    • 大于m-1,分裂,左叶子节点包含前 m 2 \frac{m}{2} 2m个记录,右叶子节点包含剩余的记录,第 m 2 + 1 \frac{m}{2}+1 2m+1个记录的key复制进位到父亲节点中;
  • 判断父亲节点关键字个数和m-1的关系;
    • 小于等于m-1,结束;
    • 大于m-1,裂变。
删除
  • 删除叶子节点中对应的key,删除后看节点个数

    • 如果节点个数大于等于 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1,操作结束

    • 如果节点个数小于 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1,看兄弟节点个数;

      • 如果兄弟节点个数富余,则向兄弟节点借一个记录,同时用借到的记录的key替换二者父亲的key

      • 如果兄弟节点不富裕,则当前节点和兄弟节点合并成一个新的节点,同时删除二者父亲节点的key

      • 此时判断索引节点的key个数和 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1的关系;

        • 如果索引节点的key个数大于等于 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1,操作结束;
        • 如果索引节点的key个数小于 c e i l ( m 2 ) − 1 ceil(\frac{m}{2})-1 ceil(2m)1,则看索引节点的兄弟节点;
          • 如果兄弟节点富裕,则兄弟的key上移,父亲的key下移到当前节点;
          • 如果兄弟不富裕,则将当前节点、父亲下移的key和兄弟节点合并成一个新的节点。

B 树和B+树的对比

  • 根据搜索的节点位置,B树的搜索效率最大为 l o g n m log_nm lognm,离根节点越近搜索效率会越高,而B+树由于记录都在叶子节点上,所以其效率稳定在 l o g n m log_nm lognm

  • 在范围搜索上,B树需要一个个节点遍历,而B+树由于“每个叶子节点都存有指向相邻叶子节点的指针,叶子节点本身依关键字的大小从小到大顺序连接”的特性,可以连续读取,因此非常适合范围搜索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

97Marcus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值