数据结构大总结系列之B树和R树

本文详细介绍了B树(B-树与B+树)和R树这两种数据结构,重点阐述了它们的特性、插入与删除操作,以及在磁盘I/O操作中的优势。B树通过减少磁盘存取次数优化查找效率,B+树则通过所有关键字在叶子节点的有序链接提供更稳定的查询性能。R树是高维空间的数据结构,通过最小边界矩形(MBR)实现空间分割,有效提高了多维度查询的效率。
摘要由CSDN通过智能技术生成

数据结构大总结系列之B树

一,B-树

B树是为磁盘或其他直接存储辅助存储设备而设计的一种平衡二叉查找树(通常说的B树是B-树,在1972年由R.Bayer和E.M.McCreight提出,B+树是B树的一种变形),B树与红黑树类似,但在降低磁盘I/O操作次数方面要更好一些,数据库就是通常用B树来进行存储信息。

    B树的结点可以有许多子女,从几个到几千个不等,一个B树结点可以拥有的子女数是由磁盘页的大小所决定,这是因为一个结点的大小通常相当于一个完整的磁盘页。磁盘存取次数是按需要从盘中读出或向盘中写入的信息的页数来度量的,所以,存取磁盘的总时间可以近似为读或写的页数。因此,B树一般都选择大的分支因子,这样可以大大降低树的高度,以及寻找任意关键字所需的磁盘存取次数。一棵分支因子为1001, 高度为2的B树,可以储存超过10亿个关键字,同时因为根节点可以持久地保留在内存中,故在这棵树中,寻找一个关键字至多只需要两次磁盘存取。

相信,从上图你能轻易的看到,一个内结点x若含有n[x]个关键字,那么x将含有n[x]+1个子女。如含有2个关键字D H的内结点有3个子女,而含有3个关键字Q T X的内结点有4个子女。

B树的性质:

1) 每个节点x的域:

a) n[x],x中的关键字数,若x是B树中的内节点,则x有n[x] + 1个子女。

b) n[x]个关键字本身,以非降序排列,key1[x] <= key2[x] <= … <= keyn[x][x]

c) leaf[x],布尔值,如果x是叶节点,则为TRUE,若为内节点,则为FALSE

2) 每个内节点x还包含n[x] + 1个指向其子女的指针c1[x], c2[x], …, cn[x] + 1[x]

3) 如果ki为存储在以ci[x]为根的子树中的关键字,则k1 <= key1[x] <= k2 <= key2[x] <= … <= keyn[x][x] <= keyn[x] + 1

4) 每个叶节点具有相同的深度

5) B树的最小度数t

a) 每个非根的节点必须至少有t – 1个关键字

b) 每个节点可包含至多2t – 1个关键字。

B树的数据结构:

B树插入关键字

B树插入是指插入到一个已知的叶节点上,因为不能把关键字插入到一个满的叶结点上,故引入一个操作,将一个满的结点y(有2t – 1个关键字)按其中间关键字key[y]分裂成两个各含t – 1个关键字的节点,中间关键字提升到y的双亲结点,如果y的双亲也是满的,则自底向上传播分裂。

    如同二叉查找树,插入时,需要从根部沿着树下降到叶子,当沿着树往下查找新关键字所属位置时,就分裂遇到的每一个满结点,这样就能保证,要分裂一个满结点y时,就能确保它的双亲不是满的。

分裂图示:

插入结点伪代码:

B-TREE-INSERT(T, k)作用是对B树用单程下行遍历方式插入关键字。3~9行处理根结点r为满的情况。

B-TREE-SPLIT-CHILD(x, i, y) 第1~8行行创建一个新结点,并将y的t – 1个最大关键字以及相应的t个子女给它,第九行调整关键字计数。第10~16行将z插入为x的一个孩子,提升y的中间关键字到x来分裂y和z,并调整x的关键字计数。

B-TREE-INSERT-NONFULL(x, k) 第3~8行处理x是叶子的情况,将关键字k插入x;如果不是,则第9~11确定向x的哪个子结点递归下降。第13行检查递归是否将降至一个满子结点上,若是,14行用B-TREE-SPLIT-CHILD将该子结点分类成两个非满的孩子,第15~16行确定向两个孩子中的哪一个下降是正确的。

各种情况都包含的插入图示:(最小度数t为3)

 

3)删除操作:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值