二叉搜索树、平衡二叉树、红黑树、B树、B+树面试题

二叉搜索树是简单的左子树结点小于等于它的根节点,右子树结点值大于等于它的根结点

由于查询效率和树的层次有关,二叉搜索树可能出现都连在左边或者右边,退化成链表所以需要平衡及使树的层次最小的二叉搜索树,成为平衡二叉树

但频繁插入结点会使时间浪费在维持二叉树平衡上,所以出现了红黑树。红黑树使尽量做到平衡,同时兼顾每次平衡的次数。

红黑树的调整两种方法:变色和旋转(左旋转和右旋转) 

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+树的设计可以允许数据分批

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值