算法——B树,B-树,B+树,B*树全面解析笔记

算法——B树,B-树,B+树,B*树全面解析笔记

https://www.cnblogs.com/lianzhilei/p/11250589.html
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
https://zhuanlan.zhihu.com/p/54102723

树的有序简单理解

该图片来源于https://www.jianshu.com/p/e136ec79235c
在这里插入图片描述
ps:中序遍历就是沿x轴从左到右扫描

索引的本质

    MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。

    我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引

ps:实际的数据库系统几乎没有使用二叉查找树或其进化品种红黑树(red-black tree)实现的,大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构

B树 = B-树

    B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树

ps:比动态规划还要让人火大的译名
ps:动态规划=递归+数组缓存(一维或二维),在数学中有个令人又爱又恨的名字——数列。已知首项a1,程序员寻找递归公式an和an-1的关系,让计算机暴力破解通项公式
ps:好像不小心跑题了,欸嘿

    B树的出现是为了弥合不同的存储级别之间的访问速度上的巨大差异,实现高效的 I/O。平衡二叉树的查找效率是非常高的,并可以通过降低树的深度来提高查找的效率。但是当数据量非常大,树的存储的元素数量是有限的,这样会导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。另外数据量过大会导致内存空间不够容纳平衡二叉树所有结点的情况。B树是解决这个问题的很好的结构。

    首先,B树不要和二叉树混淆,在计算机科学中,B树是一种自平衡树的数据结构,它维护有序数据并允许以对数时间进行搜索,顺序访问,插入和删除。B树是二叉搜索树的一般化,因为节点可以有两个以上的子节点。与其他自平衡二进制搜索树不同,B树非常适合读取和写入相对较大的数据块(如光盘)的存储系统。它通常用于数据库和文件系统

ps:Mysql使用的是B+树

B树定义

B树是一种平衡的多分树,通常我们说m阶的B树,它必须满足如下条件:
· 每个节点最多只有m个子节点
· 每个非叶子节点(除了根)具有至少⌈ m/2⌉子节点
· 如果根不是叶节点,则根至少有两个子节点
· 具有k个子节点的非叶节点包含k -1个键
· 所有叶子都出现在同一水平,没有任何信息(高度一致)

B树阶

B树中一个节点的子节点数目的最大值,用m表示,假如最大值为10,则为10阶,如图
请添加图片描述
所有节点中,节点【13,16,19】拥有的子节点数目最多,四个子节点(灰色节点),所以可以定义上面的图片为4阶B树

ps:先定义树阶,再根据树阶构建树,树的结构转换不会影响树阶。4阶表示最多4个分叉,可以小于4个,就像二叉树不一定是满二叉树

根节点

节点【10】即为根节点,特征:根节点拥有的子节点数量的上限和内部节点相同,如果根节点不是树中唯一节点的话,至少有俩个子节点(不然就变成单支了)。在m阶B树中(根节点非树中唯一节点),那么有关系式2<= M <=m,M为子节点数量;包含的元素数量 1<= K <=m-1,K为元素数量

ps:2 <= 子节点数量M <= 树阶m,1 <= 元素数量K <= 树阶m-1

内部节点

节点【13,16,19】、节点【3,6】都为内部节点,特征:内部节点是除叶子节点和根节点之外的所有节点,拥有父节点和子节点。假定m阶B树的内部节点的子节点数量为M,则一定要符合⌈ m/2⌉<= M <=m关系式,包含元素数量M-1;包含的元素数量 ⌈ m/2⌉-1<= K <=m-1,K为元素数量。m/2向上取整

ps:树阶m/2 <= 内部节点子节点数量M <= 树阶m,表示每个节点至少要装一半,树阶m/2去掉小数 <= 元素数量K <= 树阶m-1

叶子节点

节点【1,2】、节点【11,12】等最后一层都为叶子节点,叶子节点对元素的数量有相同的限制,但是没有子节点,也没有指向子节点的指针。特征:在m阶B树中叶子节点的元素符合⌈ m/2⌉-1<= K <=m-1

ps:树阶m/2去掉小数 <= 元素数量K <= 树阶m-1

B树插入

针对m阶高度h的B树,插入一个元素时,首先在B树中是否存在,如果不存在,即在叶子结点处结束,然后在叶子结点中插入该新的元素
· 若该节点元素个数小于m-1,直接插入
· 若该节点元素个数等于m-1,引起节点分裂;以该节点中间元素为分界,取中间元素(偶数个数,中间两个随机选取)插入到父节点中
· 重复上面动作,直到所有节点符合B树的规则;最坏的情况一

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值