5.平衡多叉树-B树

产生

  当数据量过大的时候,数据如果用平衡二叉树存储,就会导致树的深度过深,节点比对次数过多。查找不方便。而且当数据量过大的时候,也不能把所有数据全部放在内存中,只能放在外部存储器中,每次查找节点都是一次I/O操作,需要去外部存储器查找,而去外部存储器查找需要找到存储这个数据所对应的磁盘页面,这个过程是机械化的过程,需要依靠磁臂的转动,找到对应磁道,耗时长。所以说平衡二叉树不够用。
  于是出现了平衡多叉树。用来减少树的深度,减少节点比对次数,如果数据存储磁盘中,还能减少I/O操作的次数。

这是一个四阶B树(因为其最多有3个节点,M,D,G等这些是节点中的关键字信息,其还应存储这关键字对应的信息的文件地址,下面的空格是示意,代表其存储的子节点的指针,最后少画了一层空节点)
在这里插入图片描述
一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树(M阶代表一个树节点最多有多少个子节点)。它或者是空树,或者是满足下列性质的树:
1、根结点至少有两个子女;
2、每个非根节点所包含的关键字个数 j 满足:ceil(m/2) - 1 <= j <= m - 1;(ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2
3、非根非叶的节点至少有的Ceil(m/2)个子树(Ceil表示向上取整,图中3阶B树,每个节点至少有2个子树,也就是至少有2个叉)
4、所有的叶子结点都位于同一层。

注:一个节点存储了多个关键字,每个关键字对应的数据所在地址,关键字的子节点的指针地址。

在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。
因为叶子结点不包含关键字,所以可以把叶子结点看成在树里实际上并不存在外部结点,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总个数加1。

B树的非叶节点中的信息包括[n,P0,K1,P1,K2,P2,…,Kn,Pn],其中n表示该节点中保存的关键字个数,K为关键字且Ki<Ki+1,P为指向子树根节点的指针
上述图中的节点信息则是:
M节点:1,地址1,M,地址2
DG节点:2,地址3,D,地址4,G,地址5

B树的查询流程:

如上图我要从上图中找到E字母,查找流程如下

(1)获取根节点的关键字进行比较,当前根节点关键字为M,E<M(26个字母顺序),所以往找到指向左边的子节点(二分法规则,左小右大,左边放小于当前节点值的子节点、右边放大于当前节点值的子节点);

(2)拿到关键字D和G,D<E<G 所以直接找到D和G中间的节点;

(3)拿到E和F,因为E=E 所以直接返回关键字和指针信息(如果树结构里面没有包含所要查找的节点则返回null);

B树应用到外部磁盘存储数据的时候(数据库)的时候,充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每个块的大小为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘快大小范围;把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值