数据结构与算法笔记-----B树,B+树及其应用

学习路径:

在这里插入图片描述

B树的特点

一个M阶的b树具有如下几个特征:
(1)定义任意非叶子结点最多只有M个儿子,且M>2;
(2)根结点的儿子数为[2, M];
(3)除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整;
(4)非叶子结点的关键字个数=儿子数-1;
(5)所有叶子结点位于同一层,且不带信息(实际上为NULL)
(6)k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系
在这里插入图片描述

B树的基本操作

这是考研数据结构考试大纲的一个考点
在这里插入图片描述
(1)查找
类似于二叉查找树:如上图三叉B树所示,如果关键字比18小,往左边找,如果比30大往右边找,在18-30直接,在中间找。
(2)插入
1.定位,找到最底层,比如说插入40
在这里插入图片描述
已经插入成功了
但是插入60,改变了B树的性质(3阶B树一个节点最多只能有m-1=2个关键字)
在这里插入图片描述
2.分裂结点
中间的数字上移
节点分裂
在这里插入图片描述
(3)删除很复杂
可以参考这篇博客:B树的插入和删除操作详解

B+树

B+树是B树的一种变体,有着比B树更高的查询性能
B+树在考研中只要求会概念,不要求会他的增删改查
在这里插入图片描述
B+树的特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
在这里插入图片描述
B+树比B树的优势有三个:

1、单一节点存储更多的元素,使得查询的IO次数减少;

2、所有查询都要查找到叶子节点,查询性能稳定;

3、所有叶子节点形成有序链表,便于范围查询。

B树和B+树的设计初衷

设计动机
弥合不同的存储级别之间的访问速度上的巨大差异,实现高效的 I/O
事实实践中 : 系统存储容量的增长速度 << 应用问题规模的增长速度

B树是存储关键码的词条结构,比普通的 BST 更宽,更矮 !也称之为平衡多路搜索树

**出现的背景:**平衡二叉树的查找效率是非常高的,并可以通过降低树的深度来提高查找的效率。但是当数据量非常大,树的存储的元素数量是有限的,这样会导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。另外数据量过大会导致内存空间不够容纳平衡二叉树所有结点的情况。B树是解决这个问题的很好的结构
采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。

为什么MySQL数据库要用B+树存储索引?

(1)文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中。
数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。
树的路(分叉)越多,那么I/O的效率也越高,但是如果分叉接近无限大,那么就退化成有序数组,这样的I/O效率是最高的,但是对内存的负载也特别大,
(2)B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层。同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。
(3)和业务场景有关
如果只选一个数据,那确实是hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值