B树-查找

B树系列文章

1. B树-介绍

2. B树-查找

3. B树-插入

4. B树-删除

查找

假设有一棵3阶B树,如下图所示。

B树-查找

下面说明在该B树中查找 52的过程

首先,从根结点出发,根结点有两个键40和70,52在40和70之间,因此查找根结点的第二个儿子结点

B树-查找

接着,查找根结点的第二个儿子结点,该结点的第一个键值为55,52小于55,因此查找52可能在该结点的第一个儿子结点上

B树-查找

此时到达叶子结点,遍历该结点的键值列表,发现52在该键值列表上,说明该B树上有目标键值,搜索结束

到达叶子结点时,如果叶子结点上没有目标键值,说明B树上没有目标键值,搜索结束。

B树-查找

可以看出来,上述都给经历过的每个结点的 第一个不小于52的键值 标红处理了

这个 键值在键值数组的 下标 刚好是 要访问的儿子结点 在儿子结点列表里 的 下标。

这里是查找的代码

/**
* 查找key, 返回key所在结点及下标
* 采用递归的方法
**/
func (bTreeNode *BTreeNode) search(key int) (*BTreeNode, int) {
    if bTreeNode.isLeaf || bTreeNode.keyNum == 0 {
        return nil, -1
    }

    // 找到第一个不比key小的,注意leaf的数量比key数量多1
    idx := 0
    for idx < bTreeNode.keyNum && key > bTreeNode.keyList[idx] { // 这里可以采用二分查找提高效率
        idx++
    }

    // 在当前节点找到了key
    if idx < bTreeNode.keyNum && bTreeNode.keyList[idx] == key {
        return bTreeNode, idx
    }

    // 是叶子结点 则找不到了
    if bTreeNode.leafList[idx].isLeaf {
        return nil, -1
    }

    return bTreeNode.leafList[idx].search(key)
}

/** 查找key, 返回key所在结点及下标
* 时间复杂度为O(logn)
**/
func (bTree *BTree) Search(key int) (*BTreeNode, int) {
    return bTree.root.search(key)
}

Original: https://www.cnblogs.com/amos01/p/16492292.html
Author: Amos01
Title: B树-查找

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611206/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • windows环境下nacos集群启动报错-无法启动内嵌的tomcat

    解决办法:使用64位jdk切记不要使用32位。切记不要使用32位。切记不要使用32位。 Original: https://www.cnblogs.com/journeyhch/p…

    数据库 2023年6月11日
    075
  • MySQL8自增主键变化

    MySQL8自增主键变化 醉后不知天在水,满船清梦压星河。 一、简述 MySQL版本从5直接大跃进到8,相信MySQL8一定会有很多令人意想不到的改进,如果不想只会CRUD可以看看…

    数据库 2023年5月24日
    066
  • Burpsuite安装SQLmap操作

    Burpsuite安装SQLmap插件步骤: 安装准备: Burpsuite工具、SQLmap工具、python解释器 1.打开burpsuite插件; 2.找到CO2插件; 3….

    数据库 2023年6月9日
    085
  • [spring]spring静态代理和aop

    10.代理模式 代理模式的分类: 静态代理 动态代理 关系分析 抽象角色:一般会使用接口或者抽象类 真实角色:被代理的角色 代理角色:代理真实的角色,做一些附属的操作 客户:访问代…

    数据库 2023年6月16日
    084
  • 实现线程的两种方式

    实现Runnable接口如果当前类 不仅要继承其他类( 非Thread类), 还要实现多线程,那么 只能通过当前类实现 Runnable接口来 创建Thread类对象。 实现Run…

    数据库 2023年6月16日
    0104
  • 手写spring的ioc的流程截图(笔记-1)

    spring ioc是什么? IoC 容器是 Spring 的核心,也可以称为 Spring 容器。Spring 通过 IoC 容器来管理对象的实例化和初始化,以及对象从创建到销毁…

    数据库 2023年6月6日
    064
  • VS code 每次退出都要重新下载解决方案

    VS code 每次退出都要重新下载解决方案 打开文件-首选项-设置 在搜索栏输入Extensions: Auto Update 然后把所有打钩的取消 ,退出vs code 的时候…

    数据库 2023年6月16日
    089
  • MySQL45讲之InnoDB加锁规则

    前言 本文介绍 MySQL InnoDB 的加锁规则,以及一些需要注意的点。 总结 可重复读隔离级别下,两个原则,两个优化,一个 bug: 原则1:加锁的基本单位是 next-ke…

    数据库 2023年5月24日
    072
  • Java学习-第一部分-第二阶段-第五节:集合

    集合 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 前面我们保存多个数据使用的是数组,那么数组有不足的地方,我…

    数据库 2023年6月11日
    086
  • Linux远程终端连接工具:SecureCRT

    SecureCRT SecureCRT是一款支持 SSH2、SSH1、Telnet、Telnet/SSH、Relogin、Serial、TAPI、RAW 等协议的终端仿真程序 Se…

    数据库 2023年6月11日
    094
  • 详细记录一次stampstime字段引起pxc集群脑裂

    事故回顾 运维执行导入sql,导入后收到master2和master3节点宕机的报警;检查集群状态发现master1进入初始化模式,无法读写;master2和master3已经下线…

    数据库 2023年5月24日
    066
  • 实现一个简单的Database2(译文)

    前文回顾:实现一个简单的Database1(译文) 译注:cstsck在github维护了一个简单的、类似sqlite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运…

    数据库 2023年6月11日
    095
  • Linux–>文件目录作用查询

    在Linux中他的根目录都是决定好的无法改名,并且每一个目录他的作用都是决定好的 在Linux中一切都是文件!,Linux会把所有的硬件都映射成文件 代表根目录 /bin /bin…

    数据库 2023年6月14日
    096
  • Linux下安装MySQL问题及报错解决

    前言: 在Linux环境下,安装MySQL服务 环境: 虚拟机CentOS7———————&#8…

    数据库 2023年5月24日
    075
  • 2_JDBC

    使用客户端工具访问数据库, 需要手工建立连接, 输入用户名和密码登陆, 编写SQL语句, 点击执行, 查看操作结果(结果集或受行数影响) 在实际开发中, 当用户的数据发生改变时, …

    数据库 2023年6月11日
    055
  • 边缘计算 | 在移动设备上部署深度学习模型的思路与注意点 ⛵

    💡 作者:韩信子@ShowMeAI📘 深度学习◉技能提升系列:https://www.showmeai.tech/tutorials/35📘 深度学习实战系列:https://ww…

    数据库 2023年6月14日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球