二叉搜索树是简单的左子树结点小于等于它的根节点,右子树结点值大于等于它的根结点
由于查询效率和树的层次有关,二叉搜索树可能出现都连在左边或者右边,退化成链表所以需要平衡及使树的层次最小的二叉搜索树,成为平衡二叉树。
但频繁插入结点会使时间浪费在维持二叉树平衡上,所以出现了红黑树。红黑树使尽量做到平衡,同时兼顾每次平衡的次数。
红黑树的调整两种方法:变色和旋转(左旋转和右旋转)
JDK的集合类TreeMap和TreeSet底层就是红黑树,JDK8中,HashMap也用了红黑树。
B树是一种多功能搜索树,它的每一个结点都可以拥有多余两个孩子的结点。M路的B树最多拥有M个孩子结点,每个结点都有数据域。常用于文件系统
B+树是在B树的基础上进行改造,它的数据都在叶子结点,同时叶子结点之间还加了指针形成链表。常用于数据库索引
为啥文件索引要用B树而不用二叉查找树或者哈希表?
如果是查找效率(即比较次数)的话,实际上二叉树可以说是最快的了,但是,我们的文件索引是存放在磁盘上的,所以我们不仅要考虑查找效率,还要考虑磁盘的寻址加载次数哦,而这也是我们为什么要用 B 树的原因。
在把磁盘里的数据加载到内存中的时候,是以页为单位来加载的,而我们也知道,节点与节点之间的数据是不连续的,所以不同的节点,很有可能分布在不同的磁盘页中。所以对于上面的二叉查找树,我们可能需要进行 4 次寻址加载,而对于 B 树,由于 B 树的每一个节点,可以存放多个元素,所以磁盘寻址加载的次数会比较少
哈希表虽然能够再 O(1) 查找到目标数据,不过如果我们要进行模糊查找的话,却只能遍历所有数据,并且如果出现了极端情况,哈希表冲突的元素太多,也会导致线性时间的查找效率的。
为什么B+树在数据库用的多(Mysql底层是B+树),不用B树或者hash?
数据库中select数据,不一定只选一条,B树的话需要做局部的中序遍历,可能跨层访问,而B+树由于所有数据都在叶子节点,并且链表链接,只要找到首尾,就能去除所有数据。数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批