二叉排序树,B树和B+树的一些思考

1、一句话概括什么是二叉排序树?

左边比根节点小,右边比根节点大,并且,左右子树都是二叉排序树

2、B+树查询的时间大概是多少?

这和树的高度相关,log(n)

3、hash存储索引,查询时间是多少?

平均时间O(1)

4、什么情况下使用平衡树?

在二叉排序树问题中,会出现一些极端的情况,比如插入序列是有序的,就会出现二叉排序树退化成链表

 这时候,我们要用平衡树,在插入的时候同时调整这棵树,让它的节点尽可能均匀分布

红黑树其实就是平衡树的一种,它的复杂的定义和规则,最后都是为了保证树的平衡性。

5、为什么要费尽心思保证树的平衡性?

因为树的查找性能取决于树的高度,让树尽可能平衡,就是为了降低树的高度。java中的TreeSet的底层就是用的红黑树

 6、一句话介绍B树?

 B树是一种多路搜索树,它的每个节点可以拥有多于两个孩子节点。M路的B树最多拥有M个孩子节点

 这是一个3路的B树,每个节点最多可以拥有3个孩子,同样是搜索树

7、为什么要设计成多路?

为了降低树的高度,路数越多,树的高度就越低

8、为什么不能设计成无限多路?

这样B树就退化成有序数组了

9、我们知道B树一般用于文件系统的索引比较多,为什么文件系统的索引喜欢用B树而不用红黑树或有序数组呢?

因为文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中

如果一棵树都无法一次性加载进内存,该怎么查找呢?

B树的多路存储的威力就在于此,可以每次加载B树的一个节点,然后,一步步往下找

假设内存一次性只能加载2个数,这么长的有序数组是无法一次性进内存的。

如果把它组织成一棵三路的B树,这样每个节点最多有2个数。

 查找时候,每次载入一个节点进内存就行,如果在内存中,红黑树比B树效率更高,但是涉及到磁盘操作,B树就更优了。

 10、一句话概括什么是B+树?

B+树是在B树基础上进行改造的,它的数据都在叶子节点,同时叶子节点之间还加了指针形成链表。

 这是一个4路B+树,它的数据都在叶子节点,并且有链表相连

11、为什么B+树要这样设计?

B+树在数据库的索引中用的比较多,如果数据库select数据,不一定只选一条,很多时候选多条,比如按照id排序后选10条。

这样如果是多条的话,B树需要做局部的中序遍历,可能需要跨层访问,而B+树由于所有数据都在叶子节点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了

 比如选出7到19,只需要在叶子节点中就能找到。这就是B+树的威力

12、既然hash比B+树更快,为什么MySql还用B+树来存索引?
这和业务场景有关。如果只选一个数据,那确实是hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多了。

而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。

 

参考:

为什么 MySQL 数据库要用B+树存储索引?

posted @ 2020-11-28 15:03  GumpYan  阅读(476)  评论(0编辑  收藏  举报