今天是分布式系统的第八篇文章,核心内容是B+树的原理。
今天的文章是上周B树的延伸,所以新关注的或者是有所遗忘的同学建议先从下方链接回顾之前的内容。
万字长文丰富图文详解B-树原理
B+树的特性
B+树和B树一样都是多路平衡树,也叫多叉树。两者的性质也基本一致,在具体来看详细内容之前,我们先来总体看下B+树的特性,先有个大概的印象。
我个人认为B+树大部分特性都和B树一样,唯一不同的只有以下几点:
- 所有的数据都存储在叶子节点,中间节点不存放数据
- 中间节点的元素数量和子树数量一致,而B树子树数量比元素数量多1
- 叶子节点是一个链表,可以通过指针顺序查找
我贴一张图,大家应该可以很直观地感受到。
![787742d5091bcd20ed38330d3c29e150.png](https://i-blog.csdnimg.cn/blog_migrate/ba4c1bd30bf002ffbd68b0a95bebacff.jpeg)
从上图我们可以看到,所有出现在中间节点的元素都能在叶子节点当中找到,这对应了刚才说的所有数据都存放在叶子节点当中。然后我们还可以发现,中间节点当中的元素数量和子树数量一致,同样对应了区间分割。父节点的每个元素对应了一个子树中最大的元素。
至于最后的链表,应该很好理解,无非是链表出现在树当中,看起来有些新奇而已。
我看上图最大的感受就是像,和B树实在是太像了,就好像两个孪生兄弟,猛地看上去几乎一模一样,细微分辨才能发现一点差别。那么针对这样一颗熟悉又陌生的树,我们应该怎么去增删改查呢?
让我们继续往下看,在此之前,我想说一句,虽然B+树是B树的提升版,但是实现难度上,其实是降低的。也就是说整体而言,它比B树更容易实现。
B+树的查
由于B+树当中所有的数据都存储在叶子节点,所以我们在查找的时候,必须要一直查找到叶子节点为止。也就是说不会再有中途退出的情况,这样就简化了我们的判断,几乎不再需要临时退出了。
另一个特性是B+树当中的元素数量和子树数量一致,并且每个元素都代表一棵子树当中的最大值。通过这个限制,我们可以很轻松地确定我们要查找的元素究竟在哪棵子树当中。而B树则有可能出现超界的情况,我们需要特殊判断。
举个例子,这是一棵B树:
![b8eaed361ff24e9e73cf9e11d6e3dea1.png](https://i-blog.csdnimg.cn/blog_migrate/b8f8b6febfdbdb9c9b688e83543e6b45.jpeg)
假设我们查找的元素是12,我们在根节点当中判断,先通过二分查找查找到9,发现12 > 9,于是我们去最右侧的子树当中检查。
而如果是B+树,会是这样,为了作图方便,我省去了叶子节点中横向的指针。
![36bdaeca8e0457791d2dcf7c7bbb3f2b.png](https://i-blog.csdnimg.cn/blog_migrate/ff50371b71a1ea1623d13e4a35962144.jpeg)
可以看到我们直接二分就可以精准地找到对应的子树,我们直接往下递归就好了。如果超界了,则说明肯定不在树上,可以提前返回。
所以这就是一个非常简单的树上查找,应该说只要理解了树的形状和递归的思路,应该是没有难度的。不过有一点需要注意,我们的查找接口并不只提供给外部,我们自己在插入的时候也