动态索引之B树和B+树

基本概念

  • 动态索引结构
    • 索引结构本身也可能发生改变
    • 在系统运行过程中插入或删除记录时
  • 目的
    • 保持较好的性能
    • 例如较高的检索效率

B树

是一种平衡的多分树 (Balanced Tree)

m 阶 B 树的结构定义

  • 每个结点至多有 m 个子结点
  • 除根结点和叶结点外,其它每个结点至少有[m/2]个子结点
    • m/2恰好保证了在合并的时候不会因为合并而导致分裂,同时让每一层的结点尽可能得多,修改的话要么让树的深度增加,要么让删除操作变得复杂。
  • 根结点至少有两个子结点
    • 唯一例外的是根结点就是叶结点时没有子结点
    • 此时 B 树只包含一个结点
  • 所有的叶结点在同一层
  • 有 k 个子结点的非根结点恰好包含 k-1个关键码(注意比k小1)

B树的节点结构

B 树的性质

  1. 树高平衡,所有叶结点都在同一层
  2. 关键码没有重复,父结点中的关键码是其子结点的分界
  3. B 树把(值接近)相关记录放在同一个磁盘页中,从而利用了访问局部性原理
  4. B 树保证树中至少有一定比例的结点是满的
    • 这样能够改进空间的利用率
    • 减少检索和更新操作的磁盘读取数目

B 树的查找

交替的两步过程

  1. 把根结点读出来,在根结点所包含的关键码 K1,...,Kj中查找给定的关键码值
    • 找到则检索成功
  2. 否则,确定要查的关键码值是在某个Ki和Ki+1 之间,于是取 pi 所指向的结点继续查找。如果pi 指向外部空结点,表示检索失败

B 树插入

  • 注意保持性质,特别是等高和阶的限制
    • 找到最底层,插入
    • 若溢出,则结点分裂,中间关键码连同新指针插入父结点
    • 若父结点也溢出,则继续分裂
  • 分裂过程可能传达到根结点(则树升高一层)

B树插入时,如果发生上溢出就分裂,为什么不是送给兄弟结点一些关键码?

因为插入操作大部分是发生在创建阶段,分裂的结点很快会增加新的关键码。而如果送给兄弟结点,则会修改兄弟结点和父结点,访外开销太大。

3阶B树(2-3树)的插入

最终根节点变为23。

B 树的删除

  • 删除的关键码不在叶结点层,跟叶中后继对换
  • 删除的关键码在叶结点层
    • 删除后关键码个数不小于[m/2]-1,直接删除
    • 关键码个数小于[m/2]-1
      • 如果兄弟结点关键码个数不等于[m/2]-1,从兄弟结点移若干个关键码到该结点中来(父结点中的一个关键码要做相应变化)
      • 如果兄弟结点关键码个数等于[m/2]-1,它所在结点的剩余关键字和指针,加上双亲结点中的关键字Ki一起,合并到Ai所指兄弟结点中(若无右兄弟,则合并到左兄弟结点中)。如果因此使双亲结点中的关键字数目少于ceil(m/2)-1,则依次类推。

B 树的性能分析

  • 包含 N 个关键码的 m阶B 树
    • 有 N+1 个外部空指针
    • 假设外部指针在第 k 层
      • k≤1+ logm/2((N+1)/2)
  • 没插入一个节点,节点平均分裂次数 s≤1/(m/2 -1)

B+ 树

是B 树的一种变形,在叶结点上存储信息

  • 所有的关键码均出现在叶结点上
  • 各层结点中的关键码均是下一层相应结点中最大关键码(或最小关键码)的复写

B+ 树的结构定义

m 阶 B+ 树的结构定义如下:

  1. 每个结点至多有 m 个子结点
  2. 每个结点(除根外)至少有[m/2]个子结点
  3. 根结点至少有两个子结点
  4. 有 k 个子结点 的结点必有 k 个关键码

B+ 树的查找

  • 在上层已找到待查的关键码,并不停止
  • 而是继续沿指针向下一直查到叶结点层的这个关键码

B+ 树的插入

插入——分裂

  • 过程和 B 树类似
  • 注意保证上一层结点中有这两个结点的最大关键码 (或最小关键码)

B+ 树的删除

  • 当关键码下溢出时,与左或右兄弟进行调整(甚至合并)
  • 关键码在叶结点层删除后,其在上层的复本可以保留,作为一个“分界关键码”存在
    • 也可以替换为新的最大关键码(或最小关键码)

B+ 树的存储效率实际上更高

  • 假设一个主文件有N个记录,假设一个页块可以存m个(关键码,子结点页块地址)二元对
  • 假设 B+ 树平均每个结点有 0.75m 个子结点
    • 充盈度为 (1+0.5)/2 = 75%
  • 因此 B+ 树的高度为[log0.75mN]
  • 假设 B 树充盈度也是75%,由于B树包含隐含指针所以只能存储2/3个(关键码,隐含指针,子结点页块指针),则 B 树结点有 0.667*0.75=0.5m 个子结点,B 树的高度为[log0.5mN],比B+树高

B+ 树应用得更为广泛

  • B+ 树的存储效率更高、检索层次更少(树较矮)
  • 因此,B+ 树应用得更为广泛
    • 数据库系统主码(primary key)索引
    • 基于B+树的磁盘文件虚拟存储存取管理 VSAM (Virtual Storage Access Method),取代了基于多分树的 ISAM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值