[C++][数据结构][B-树][上]详细讲解

目录

  • 0.常见的搜索结构
  • 1.B树概念
  • 2.B-树的插入分析
    • 1.流程分析
    • 2.插入过程总结


0.常见的搜索结构

种类数据格式时间复杂度
顺序查找无要求 O ( N ) O(N) O(N)
二分查找有序 O ( l o g 2 N ) O(log_2 N) O(log2N)
二叉搜索树无要求 O ( N ) O(N) O(N)
二叉平衡树无要求 O ( l o g 2 N ) O(log_2 N) O(log2N)
哈希无要求 O ( 1 ) O(1) O(1)
  • 以上结构适合用于数据量相对不是很大,能够一次性存放在内存中,进行数据查找的场景

    • 如果数据量很大,比如有100G数据,无法一次放进内存中,那就只能放在磁盘上了
  • 如果放在磁盘上,又需要搜索某些数据,那么如何处理呢?

    • 可以考虑将存放关键字及其映射的数据的地址放到一个内存中的搜索树的节点中

    • 要访问数据时,先取这个地址去磁盘访问数据

      请添加图片描述

  • 使用平衡二叉树的缺陷:

    • 平衡二叉树搜索树的高度是 l o g 2 N log_2N log2N,这个查找次数在内存中是很快的
    • 但是当数据都在磁盘中时,访问磁盘速度很慢
      • 在数据量很大时, l o g 2 N log_2N log2N次的磁盘访问,是一个难以接受的结果
  • 使用哈希表的缺陷:

    • 哈希表的效率很高是 O ( 1 ) O(1) O(1)
    • 但是一些极端场景下某个位置冲突很多,导致访问次数剧增,也是难以接受的
      • 极端场景下冲突非常严重,效率下降很多
  • 那如何加速对数据的访问呢?

    1. 提高IO的速度(SSD相比传统机械硬盘快了不少,但是还是没有得到本质性的提升)
    2. 降低树的高度 – 多叉树平衡树
  • 为什么硬盘IO慢?
    请添加图片描述


1.B树概念

  • B树是一种适合外查找的树,它是一种平衡的多叉树
    • 后面有一个改进版本B+树
  • 一棵m阶(m>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足以下性质:
    • 根节点至少有两个孩子
    • 每个分支结点都包含k-1个关键字和k个孩子,其中 c e i l ( m / 2 ) < = k < = m ceil(m/2) <= k <= m ceil(m/2)<=k<=m
      • 孩子比关键字保持多一个的关系
      • TIPS:ceil()是向上取整函数
    • 每个叶子结点都包含k-1个关键字,其中 c e i l ( m / 2 ) < = k < = m ceil(m/2) <= k <= m ceil(m/2)<=k<=m
    • 所有的叶子结点都在同一层
    • 每个结点中的关键字从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分
    • 每个结点的结构为: ( n , A 0 , K 1 , A 1 , K 2 , A 2 , … , K n , A n ) (n,A_0,K_1,A_1,K_2,A_2,… ,K_n,A_n) (nA0K1A1K2A2KnAn)
      • K i ( 1 ≤ i ≤ n ) K_i(1≤i≤n) Ki(1in)关键字,且 K i < K i + 1 ( 1 ≤ i ≤ n − 1 ) K_i<K_{i+1}(1≤i≤n-1) Ki<Ki+1(1in1)
      • A i ( 0 ≤ i ≤ n ) A_i(0≤i≤n) Ai(0in)为**指向子树根结点的指针**,且 A i A_i Ai所指子树所有结点中的关键字均小于 K i + 1 K_{i+1} Ki+1
      • n为结点中关键字的个数,满足 c e i l ( m / 2 ) − 1 ≤ n ≤ m − 1 ceil(m/2)-1≤n≤m-1 ceil(m/2)1nm1
  • B树的性质保证了B树是天然平衡的
    • 只会向右和向上生长
      • 只有在根结点分裂时,才会增加一层
    • 新插入的结点,一定是在叶子插入
      • 叶子没有孩子,不影响关键字和孩子的关系
    • 叶子节点满了,分裂出一个兄弟,提取中位数,向父亲插入一个值和一个孩子

2.B-树的插入分析

1.流程分析

  • 为了简单起见,假设 M = 3 M = 3 M=3,即三叉树,每个节点中存储两个数据,两个数据可以将区间分割成三个部分,因此节点应该有三个孩子,为了后续实现简单起见,节点的结构如下

    • 注意:孩子永远比数据多一个

      请添加图片描述

  • 用序列{53, 139, 75, 49, 145, 36, 101}构建B树的过程如下:

  • 插入75的过程如下

    1. 按照插入排序思想,将75插入到序列中

    2. 插入后该结点不满足情况,需要对该结点进行分裂

      请添加图片描述

  • 分裂结点:关键字的数量等于M,则满了,满了就分裂出一个兄弟结点,分裂一半的值和孩子给兄弟

    1. 找到结点数据域的中间位置
    2. 给一个新结点,将中间位置的右边数据搬移到新结点中
    3. 将中间位置数据搬移到父结点中
    4. 将结点连接好
      请添加图片描述
  • 插入49,145的过程如下

    1. 找到该元素的插入位置(索要插入结点pCur)
    2. 按照插入排序思想将结点插入到该结点(pcur)的合适位置
    3. 检测该结点是否满足B树的性质
      • 满足:插入结束
      • 不满足:对该结点进行分裂
        请添加图片描述
  • 插入36的过程如下

    • 插入完成后,该结点违反B-树性质,需要对pCur进行分裂
      1. 找到中间位置

      2. 将中间位置右侧元素搬移到新结点中

      3. 将中间位置数据49以及新生成的结点往parent中继续插入

        请添加图片描述

  • 插入101的过程如下:

    1. 先在B-树种找到该结点的插入位置
    2. 按照插入排序思想将该结点插入到pCur结点中
    3. 检测该结点是否满足B树的性质,该结点中存放元素个数是否小于M
      • 小于M:插入完成
      • 等于M:需要对该结点进行分裂
        • 找中间位置,将中间位置右侧数据搬移到新结点中

        • 将中间位置数据以及新结点往pCur双亲中继续插入

          请添加图片描述

2.插入过程总结

  1. 如果树为空,直接插入新节点中,该节点为树的根节点
  2. 树非空,找待插入元素在树中的插入位置
    • 注意:找到的插入节点位置一定在叶子节点中
  3. 检测是否找到插入位置
    • 假设树中的key唯一,即该元素已经存在时则不插入
  4. 按照插入排序的思想将该元素插入到找到的节点中
  5. 检测该节点是否满足B-树的性质
    • 即:该节点中的元素个数是否等于M,如果小于则满足
  6. 如果插入后节点不满足B树的性质,需要对该节点进行分裂:
    • 申请新节点
    • 找到该节点的中间位置
    • 将该节点中间位置右侧的元素以及其孩子搬移到新节点中
    • 将中间位置元素以及新节点往该节点的双亲节点中插入,即继续(4)
  7. 如果向上已经分裂到根节点的位置,插入结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/728621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20212416 2023-2024-2 《移动平台开发与实践》综合实践

移动平台开放综合实践 1.实验内容2.实验过程2.1 确定基础功能2.2 设计UI界面2.3 编写程序运行代码2.4 在基本功能的基础上丰富功能 3. 代码分析3.1设置按钮的点击事件监听器3.2 比分更新模块3.3 比分存储模块 4. 运行结果5.实践中遇到的问题及解决6.学习感悟与思考参考资料 1.实…

k8s中 docker和containerd 镜像相互导入导出

containerd镜像导出并导入docker 1 查看containerd 本地镜像列表 crictl images 2 containerd 导出本地镜像到当前目录下&#xff08;注意&#xff1a; 导出导入需要指定镜像平台类型 --platform&#xff09; ctr -n k8s.io images export nacos-server-24-06-30-13-02-…

【windows|007】DHCP服务详解

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 ​ &#x1f3c5;阿里云ACE认证高级工程师 ​ &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社…

在阿里云服务器Linux系统上从头到尾实现Webapp的部署(安装卸载JDK、安装Tomcat、安装配置MySQL)

输入yum list | grep jdk 选择 devel是软件包中的典型命名格式 devel表示这个包是开发工具相关的 里面包含内容是最完整的 x86表示cpu架构是x86_64 还有openjdk表示开源版本 输入yum install java-1.8.0-openjdk-devel.x86_64 开始下载 遇到问你 is this ok? 输入y表示ok 输…

计算机网络期末复习——简明扼要介绍考点及相关知识

期末复习的方法论&#xff1a;一般来说&#xff0c;期末复习都是“理论”结合“实践”。 理论&#xff0c;在于要对期末考点有基本的把握。可以询问老师或者师兄&#xff0c;总之要知道考试的重点在哪里。对照教材&#xff0c;勾画考试重点&#xff0c;删去不重要的琐碎知识点。…

【机器学习】深度学习赋能:基于 LSTM 的智能日志异常检测

目录 1. LSTM 简介 2. 日志序列异常检测概述 3. 数据预处理 3.1 日志解析 3.2 数据清洗 3.3 序列化 3.4 特征提取 示例代码 4. 构建 LSTM 模型 4.1 模型结构 4.2 模型构建示例 5. 训练 LSTM 模型 5.1 数据准备 5.2 模型训练 示例代码 6. 异常检测 6.1 异常分数…

QT截图程序三-截取自定义多边形

上一篇文章QT截图程序&#xff0c;可多屏幕截图二&#xff0c;增加调整截图区域功能-CSDN博客描述了如何截取&#xff0c;具备调整边缘功能后已经方便使用了&#xff0c;但是与系统自带的程序相比&#xff0c;似乎没有什么特别&#xff0c;只能截取矩形区域。 如果可以按照自己…

中欧科学家论坛暨第六届人工智能与先进制造国际会议(AIAM2024)

会议日期&#xff1a;2024年10月20-21日 会议地点&#xff1a;德国-法兰克福 会议官网&#xff1a;https://www.iaast.cn/meet/home/Bx130JiM 出版检索&#xff1a;EI、Scopus等数据库收录 【会议简介】 “中欧科学家论坛”由德国、法国、荷兰、瑞士、丹麦、意大利、西班牙…

python爬虫之selenium自动化操作

python爬虫之selenium自动化操作 需求&#xff1a;操作淘宝去掉弹窗广告搜索物品后进入百度回退又前进 selenium模块的基本使用 问题&#xff1a;selenium模块和爬虫之间具有怎样的关联? 1、便捷的获取网站中动态加载的数据 2、便捷实现模拟登录 什么是selenium模块&#x…

java连接kerberos用户认证

文章目录 一、背景二、代码2.1目录2.2配置文件application.properties2.3pom依赖2.4代码AuthProviderConfig配置类CustomConfigurationByKeytab配置类CustomConfigurationByPassword配置类TestControllerMyCallbackHandlerDummyUserDetailsService实现类LdapTest2Application启…

数据结构经典面试之数组——C#和C++篇

文章目录 1. 数组的基本概念与功能2. C#数组创建数组访问数组元素修改数组元素数组排序 3. C数组创建数组访问数组元素修改数组元素数组排序 4. 数组的实际应用与性能优化5. C#数组示例6. C数组示例总结 数组是编程中常用的数据结构之一&#xff0c;它用于存储一系列相同类型的…

算法训练营day15--110.平衡二叉树+ 257. 二叉树的所有路径+ 404.左叶子之和+222.完全二叉树的节点个数

一、110.平衡二叉树 题目链接&#xff1a;https://leetcode.cn/problems/balanced-binary-tree/ 文章讲解&#xff1a;https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1Ug411S7m…

React中的JSX应该怎么用

什么是JSX JSX Javascript XML&#xff0c;JSX是一个 JavaScript 的语法扩展。 JSX可以很好地描述 UI 应该呈现出它应有交互的本质形式并且其完全可以和JavaScript融合在一起使用。而且具有 JavaScript 的全部功能。JSX 可以生成 React “元素”。 JSX代码示例&#xff1a; …

编译原理:语法分析(语法制导翻译)、语义分析(类型检查、中间代码生成)

编译器在做语法分析的过程中&#xff0c;除了回答程序代码的语法是否合法&#xff08;LL,LR能否接收&#xff09;外&#xff0c;还需要完成后续的工作&#xff08;包括构建语法树、类型检查、中间代码生成、目标代码生成&#xff09;&#xff0c;这些后续工作一般都可以通过语法…

板凳--------第60章 SOCKET:服务器设计

60.1 迭代型和并发型服务器 1016 1.迭代型&#xff1a; 服务器每次只处理一个客户端&#xff0c;只有当完全处理完一个客户端的请求后才会去处理下一个客户端。只适用于快速处理客户端请求的场景&#xff0c;因为每个客户端都必须等待&#xff0c;直到前面所有的客户端都处理完…

10年265倍!动态展示全球第一股英伟达10年股价走势

英伟达在过去十年的股价走势展示了其在市场上的强劲表现和显著增长。自1999年上市以来&#xff0c;英伟达的股价经历了多次显著的涨幅&#xff0c;并在2024年达到了历史新高。 从2023年6月的数据来看&#xff0c;英伟达的股价为386.54美元/股&#xff0c;市值为9548亿美元。然…

redis以后台的方式启动

文章目录 1、查看redis安装的目录2、Redis以后台的方式启动3、通过客户端连接redis4、连接后&#xff0c;测试与redis的连通性 1、查看redis安装的目录 [rootlocalhost ~]# cd /usr/local/redis/ [rootlocalhost redis]# ll 总用量 112 drwxr-xr-x. 2 root root 150 12月 6…

Excel中插入的图片在不同电脑上消失的问题及解决方法

在使用Excel时插入图片&#xff0c;然后在不同电脑上打开却发现图片消失并被替换为链接地址&#xff0c;这个问题通常出现于文件中的图片路径没有正确保存或者电脑上缺少相关的图片文件。下面让我们来详细解释这个问题以及可能的解决方法。 ### 问题原因分析1. **相对路径问题…

数据结构—排序、查找、图论和字符串算法之Java实例

一&#xff1a;引言 在编程的海洋中&#xff0c;算法是程序员的灵魂之光。它们不仅指引着代码的前进方向&#xff0c;更能解决难题&#xff0c;提升效率。虽然各式各样的算法琳琅满目&#xff0c;但其中有一些却是每位程序员必定会遇到且应当深刻掌握的。本文将带您走进这些至…

从零开始学WEB前端——HTML理论讲解

有同学可能就会问&#xff1a;为什么我的创建的记事本文件名字叫“新建文本文档”而不是“新建文本文档.txt”呢&#xff1f; 这是因为.txt是后缀名&#xff0c;表示的是打开方式&#xff0c;就比如.docx后缀的都是默认用word打开&#xff0c;.xlsx的都是默认用excel打开。 常…