二叉排序树,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+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。
参考: