云计算

多路搜索树 & B 树 & B+树 学习笔记

2018-03-08  本文已影响434人  专职跑龙套

关于我的 Leetcode 题目解答,代码前往 Github:https://github.com/chenxiangcyr/leetcode-answers


B树是一种查找树,目的都是为了解决某种系统中,查找效率低的问题。
二叉查找树的特点是每个非叶节点都只有两个孩子节点。然而这种做法会导致当数据量非常大时,二叉查找树的深度过深,搜索算法自根节点向下搜索时,需要访问的节点也就变的相当多。
如果这些节点存储在外存储器磁盘中,每访问一个节点,相当于就是进行了一次I/O操作,随着树高度的增加,频繁的I/O操作一定会降低查询的效率。

B树的基本逻辑就是这个思路,它要改二叉为多叉,每个节点存储更多的指针信息,以降低I/O操作数。

B 树

一颗 m 阶的B树是一颗平衡的 m 路搜索树,它或者为空树,或者满足下列条件:

一个标准的 B树 如下图:


B树

有关B树的一些特性:

B树的高度

所以当B树包含 N 个关键字时,B树的最大高度为 K-1(因为计算B树高度时,叶结点所在层不计算在内),即:K - 1 = log┌m/2┐((N+1)/2 )+1

在搜索B树时,很明显,访问节点(即读取磁盘)的次数与树的高度呈正比,而B树与平衡的或者普通的二叉查找树相比,虽然高度都是对数数量级,但是显然B树中 log 函数的底可以比 2 更大,因此,和二叉树相比,极大地减少了磁盘读取的次数。

B树的搜索

查找关键字为29的文件

搜索关键字的29的文件的过程:

B树的插入

首先找到要插入的关键字应该插入的叶子节点 u。如果 u 是满的,那么由于不能将一个关键字插入满的节点,我们需要对 u 按其当前排在中间关键字u.keyt 进行分裂,分裂成两个节点 u1u2;同时,作为分裂标准的关键字 u.keyt 会被上移到 u 的父节点中,在 u.keyt 插入前,如果 u 的父节点未满,则直接插入即可;如果 u 的父节点已满,则按照上面的方法对u的父节点分裂,这个过程如果一直不停止的话,最终会导致B树的根节点分裂,B树的高度增加一层。

B树的删除

删除操作的基本思想和插入操作是一样的,都是不能因为关键字的改变而改变B树的结构。
插入操作主要防止的是某个节点中关键字的个数太多,所以采用了分裂;删除则是要防止某个节点中,因删除了关键字而导致这个节点的关键字个数太少,所以采用了合并操作。

B+树

B+树是B树的一种变形,它更适合实际应用中操作系统的文件索引和数据库索引。
m 阶的B+树的特征:

一个标准的 B+树 如下图:


B+树

B树 Vs B+树

B+树和B树相比,主要的不同点在以下2项:

根据B+树的结构,我们可以发现B+树相比于B树,在文件系统,数据库系统当中,更有优势,原因如下:


引用:
B树与B+树
平衡二叉树、B树、B+树、B*树 理解其中一种你就都明白了
B树(B-树)、B+树、AVL树、B*树
b树和b+树的区别

上一篇 下一篇

猜你喜欢

热点阅读