结构上 B树中关键字集合分布在整棵树中,叶节点中不包含任何关键字信息,而B+树关键字集合分布在叶子结点中,非叶节点只是叶子结点中关键字的索引; B树中任何一个关键字只出现在一个结点中,而B+树中的关键字必须出现在叶节点中,也可能在非叶结点中重复出现; 性能上(也即为什么说B+树比B树更适合实际应用中操作系统的文件索引和数据库索引?) B+树的磁盘读写代价更低,因为B+树的所有非叶子节点只会存放索引信息,而真正的数据信息都只存放在叶子节点中,这样一来,每个非叶子节点存放的索引信息就更多,一次磁盘IO就可以读取更多的索引信息到内存中,可以减少磁盘IO的次数。 B+树的查询效率更加稳定,由于非叶子节点只存索引信息,而没有真正的数据信息,所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。 B+树更加适合在区间查询的情况,由于B+树的数据都存储在叶子结点中,非叶子结点均为索引,只需要扫一遍叶子结点即可得到所有数据信息,但是B树因为其非叶子结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

相关推荐

我承认之前说话大声了点,没开摄像头也不算KPI,虽然二面还是没开摄像头,但至少约面了嘛开始就简单自我介绍,针对项目进行阐述,对答还算流畅,但是有的实际高并发场景细节并没有答上。八股部分就问了常见的redis八股,比如击穿、穿透、雪崩以及应对策略,最后雪崩的应对策略没答全,但也差不多了。算法题有点难第一个是,循环输出启动3个线程,分别循环打印1、2、3,并且要求输出顺序严格为"12312312.3."。让三个线程交替输出自己的内容,我准备的不大充分,之前遇到过,但看答案有接近一百行,写不出来。第二个是,对于一个含有n个元素的数组,可以划分为m个小数组使他们和相同,比如数组为{1,3,4,2,2}时,n=5,可以划分为m=1,{1,2,3,4,2}; 当m=2时 {1,2,3}和{2,4}各自和为6;当 m=3时{1,3}、{2,2}、{4}各自和为4;当m=4时不可划分,所以m最大为3。请你设计一个算法,对于任意输入的数组,求m最大值。类似leetcode40题组合2,但比那个复杂的多,因为target要自己一个个去尝试,并且元素不能重复使用,我事后花了一个晚上才写出来,幸好面试时没有死磕。第三题是,统计一个字符串中出现最多的字符,我直接用128位的int数组计数,面试官问我冗余空间,我说使用map会引入更多内存,且效率没数组高。最后还有一个开放性智力题,问我如何估算一个地区的奶茶店总数目。我本来想着直接美团上看附近的店家数据,但是这只能限定距离范围,无法覆盖全市。所以想着通过各个商家自己的微信小程序,计算前10个品牌(比如蜜雪、霸王、茶百道、瑞幸……)在该地区的总数目n,再在某个商圈进行抽样,找到这10家品牌占总共奶茶店的数目(比如占比70%),那么全地区的数目可以用n/70%来粗略估算。
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务