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)

大家都在看

  • OpenStack-iaas之“先点”云平台安装

    1.认识OpenStack 1.云计算的起源 早在2006年3月,亚马逊公司首先提出弹性计算云服务。2006年8月9日,谷歌公司首席执行官埃里克·施密特(Eric Schmidt)…

    数据库 2023年6月14日
    089
  • Linux 守护进程

    1. 守护进程是什么 2. 怎么用守护进程 2.1 有趣小例子 2.2 man daemon 3. 源码解析 3.1 GUN C daemon.c 3.2 daemon.c 解析 …

    数据库 2023年6月9日
    078
  • FastDFS安装和简介详细总结

    1、fastDFS简介 1 FastDFS是用c语言编写的一款开源的分布式文件系统。 2 FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用…

    数据库 2023年6月14日
    0113
  • Python–Event

    事件Event: 同进程的一样,线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变…

    数据库 2023年6月9日
    077
  • English words1004

    本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/16754120.html Or…

    数据库 2023年6月11日
    084
  • idea启动 org.springframework.boot.web.server.PortInUseException: Port XXX is already in use

    win+r,输入cmd,进入命令行窗口查询占用端口号所在进程:netstat -ano|findstr 8001杀死进程:taskkill -f -pid 进程号 作者:crazy…

    数据库 2023年6月16日
    080
  • MySQL连接的建立与使用

    在 MYSQL的启动过程中,可以看到在 mysqld_main() 函数的最后调用了 mysqld_socket_acceptor->connection_event_loo…

    数据库 2023年6月9日
    081
  • Java学习-第一部分-第二阶段-第七节:泛型

    线程 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 程序(program) 是为完成特定任务、用某种语言编写的…

    数据库 2023年6月11日
    0111
  • SSM配置文件的连接

    使用ssm框架配置数据库连接时的问题 如果MySQL数据库版本是8.0.11, url配置成了MySql5.0以上版本需要的驱动类名(com.mysql. cj.jdbc.Driv…

    数据库 2023年6月14日
    079
  • MSQL–>存储引擎

    概述 MySQL体系结构图 Innodb引擎是在mysql的5.5版本之后的默认存储引擎。 Index是在引擎层次的,不同的存储引擎index的用法不同。 存储引擎就是存储数据,建…

    数据库 2023年6月14日
    089
  • 分布式全局唯一ID

    方案一、UUID UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片…

    数据库 2023年6月9日
    097
  • 数据结构与算法-农夫过河问题

    农夫过河问题——最短路径算法 问题描述:农夫用小木筏将狼、羊、菜从起始岸运到目标岸,小木筏每次只能带一种物品,也可以什么都不带,因为食物链的关系,人不在的时候,狼会吃羊,羊会吃菜,…

    数据库 2023年6月14日
    0114
  • Nginx基础入门篇(1)—优势及安装

    一、Nginx 的优势 1.1发展趋势: 2016年: 1.2、简介 Nginx (engine x) 是一个高性能的HTTP(解决C10k的问题)和反向代理服务器,也是一个IMA…

    数据库 2023年6月14日
    080
  • 两表关联更新、删除-七星海棠

    两表关联更新 通用方法 update test1 set name=(select name from test2 where test2.id=test1.id), age=(s…

    数据库 2023年6月11日
    090
  • [LeetCode]20. 有效的括号

    给定一个只包括 ‘(‘,’)’,'{‘,’}’,'[‘,’]&#8217…

    数据库 2023年6月9日
    0130
  • 启用Hyper-v后,重启后界面提示 无法完成功能配置,正在撤销更改

    安装docker后,提示需要启用hyper-v,在控制面板中勾选Hyper-v,然后重启,更新快完成就提示无法完成功能配置,正在撤销更改 解决方法 方法1 控制面板一个一个选 方法…

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