B树和B+树的区别?

908 阅读3分钟

b和b+的区别?

b-就是b,-不是减,而是连接符。即b树和b-树,是同一个东西。

b+,是加,顾名思义,就是在b树的基础之上,改进了一下。

改进了什么呢?

1、  b树的所有节点都存储数据,而b+树只有叶子节点才存储数据(记录)。为什么呢?因为非叶子节点不存储数据,意味着非叶子节点可以存储更多的索引(索引字段),其实目的就是为了降低树高,这样查找速度更快。

2、  另外,b树的叶子节点之间并没有双向链接起来,b+树的叶子节点之间则双向链接了起来,为什么要链接起来?因为要范围查找,链接起来之后范围查询直接遍历链表即可,而不是每个数据都要从树里面重新查找一遍。


所以,改进点,就是两个:

1、  一个是为了继续提高查询速度
通过增大叉数,来降低树高。

2、  一个是为了解决范围查询的问题
其实也是为了解决范围查询这个需求的查询速度。


所以,最后总结一下发展史,就是:

1、  先有二叉树
这个是二叉示意图

image.png

2、  后有多叉树,即b树

b树的本质,其实就是多叉树,多叉树的本质,其实就是为了降低树高,提高查询速度。

这个是多叉示意图

image.png

3、  为了提高b树的性能,又搞出来了b+树

b+树的本质,其实就是在b树的基础之上,把叉的数量搞的更多,把树高降的更低,把查找速度搞的更快。


最后再来看一下b+树的示意图,因为b+树更特殊一点,所以把它拆分一下来看,主要是看它解决了两个问题,根据这两个问题来单独看示意图。

第一,只有叶子节点才有数据(记录),示意图如下:

image.png 叶子节点才有数据,非叶子节点只有索引。

第二,它解决了范围查找的问题,示意图如下:

image.png 重点在最底层,即最下面一层的叶子节点,先不用管这里的图是二叉,重点是叶子节点之间使用双向链表链接了起来,目的就是为了方便范围查询。

具体怎么范围查询呢?就是遍历即可,看下面的示意图: image.png

内存为什么用二叉?磁盘为什么用多叉?

其实树本来就适合内存,但是内存里面,一般用二叉树即可。到了磁盘,却要用多叉树。这是为什么呢?

因为内存和磁盘最大的区别是,内存比较小,所以不适合太多数据,即不适合多叉,但是内存速度快,所以树高高一点也没关系。

而磁盘空间大,所以适合大数据量,即适合多叉,但是磁盘速度慢,树高不能太高,一高的话速度就很慢。

b是什么意思?

b不是二(binary)的意思,即不是二叉树的二的意思,因为b树是多叉树!

那b是什么意思呢?是平衡balance的意思。即是平衡树。

参考

王争:《数据结构和算法之美》

java数据结构和算法