b和b+的区别?
b-就是b,-不是减,而是连接符。即b树和b-树,是同一个东西。
b+,是加,顾名思义,就是在b树的基础之上,改进了一下。
改进了什么呢?
1、 b树的所有节点都存储数据,而b+树只有叶子节点才存储数据(记录)。为什么呢?因为非叶子节点不存储数据,意味着非叶子节点可以存储更多的索引(索引字段),其实目的就是为了降低树高,这样查找速度更快。
2、 另外,b树的叶子节点之间并没有双向链接起来,b+树的叶子节点之间则双向链接了起来,为什么要链接起来?因为要范围查找,链接起来之后范围查询直接遍历链表即可,而不是每个数据都要从树里面重新查找一遍。
所以,改进点,就是两个:
1、 一个是为了继续提高查询速度
通过增大叉数,来降低树高。
2、 一个是为了解决范围查询的问题
其实也是为了解决范围查询这个需求的查询速度。
所以,最后总结一下发展史,就是:
1、 先有二叉树
这个是二叉示意图
2、 后有多叉树,即b树
b树的本质,其实就是多叉树,多叉树的本质,其实就是为了降低树高,提高查询速度。
这个是多叉示意图
3、 为了提高b树的性能,又搞出来了b+树
b+树的本质,其实就是在b树的基础之上,把叉的数量搞的更多,把树高降的更低,把查找速度搞的更快。
最后再来看一下b+树的示意图,因为b+树更特殊一点,所以把它拆分一下来看,主要是看它解决了两个问题,根据这两个问题来单独看示意图。
第一,只有叶子节点才有数据(记录),示意图如下:
叶子节点才有数据,非叶子节点只有索引。
第二,它解决了范围查找的问题,示意图如下:
重点在最底层,即最下面一层的叶子节点,先不用管这里的图是二叉,重点是叶子节点之间使用双向链表链接了起来,目的就是为了方便范围查询。
具体怎么范围查询呢?就是遍历即可,看下面的示意图:
内存为什么用二叉?磁盘为什么用多叉?
其实树本来就适合内存,但是内存里面,一般用二叉树即可。到了磁盘,却要用多叉树。这是为什么呢?
因为内存和磁盘最大的区别是,内存比较小,所以不适合太多数据,即不适合多叉,但是内存速度快,所以树高高一点也没关系。
而磁盘空间大,所以适合大数据量,即适合多叉,但是磁盘速度慢,树高不能太高,一高的话速度就很慢。
b是什么意思?
b不是二(binary)的意思,即不是二叉树的二的意思,因为b树是多叉树!
那b是什么意思呢?是平衡balance的意思。即是平衡树。
参考
王争:《数据结构和算法之美》
java数据结构和算法