[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. 如果向上已经分裂到根节点的位置,插入结束

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nvidia Isaac Sim搭建仿真环境 入门教程 2024(4)

Nvidia Isaac Sim 入门教程 2024 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. …

怎么添加网页到桌面快捷方式?

推荐用过最棒的学习网站&#xff01;https://offernow.cn 添加网页到桌面快捷方式&#xff1f; 很简单&#xff0c;仅需要两步&#xff0c;接下来以chrome浏览器为例。 第一步 在想要保存的网页右上角点击设置。 第二步 保存并分享-创建快捷方式&#xff0c;保存到桌面即可…

【Unity】AssetBundle打包策略

【Unity】AssetBundle打包策略 在游戏开发过程中&#xff0c;AssetBundle(AB)打包策略的重要性不容忽视。游戏开发者往往手动设置游戏资源包名进行管理&#xff0c;难免会造成资源确实或导致冗余&#xff0c;因此对于AB包的打包流程来说&#xff0c;进行策略管理显得十分重要。…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] API集群访问频次统计(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

IOS逆向分析—终极详细(三)

IOS逆向分析—终极详细&#xff08;三&#xff09; 前言一、逆向分析是什么&#xff1f;二、IDA分析1.下载并安装IDA2.安装插件3.加载二进制4.代码分析5.其它 总结 前言 本文是个人完成对IOS上APP分析的整个过程&#xff0c;当然对于不同的机型还会遇到不同的情况&#xff0c;谨…

RabbitMQ 开发指南

连接RabbitMQ 连接方式一&#xff1a; 也可以选择使用URI的方式来实现 连接方式二&#xff1a; Connection接口被用来创建一个Channel&#xff0c;在创建之后&#xff0c;Channel可以用来发送或者接收消息。 Channel channel conn.createChannel();使用交换器和队列 声明…

android在线阅读代码网站

android在线阅读代码社区&#xff1a; Android 1.6 到 Android 10 的源码&#xff1a; Android OS 在线源代码 - https://www.androidos.net.cn10.0.0_r6 - Android社区 - https://www.androidos.net.cn/ AndroidXRef https://cs.android.com/ https://cs.android.com/android…

《梦醒蝶飞:释放Excel函数与公式的力量》4.1if函数

第4章&#xff1a;逻辑与条件函数 第一节4.1 if函数 在Excel中&#xff0c;逻辑函数用于处理基于特定条件的真假判断&#xff0c;它们是构建复杂公式和进行高级数据分析的基础。本章将深入探讨逻辑函数的使用方法&#xff0c;特别是IF函数&#xff0c;这是Excel中最为常用的条…

win10免安装配置MySQL8.4.0

注&#xff1a;此教程基于win10 22H2 版本 1、下载最新版本MySQL压缩包 下载链接&#xff1a;MySQL官网下载地址 点击第二行的 ZIP Archive 后面的Download&#xff08;当前时间2024-06-19最新版本是8.4.0&#xff09; 2、解压并添加配置文件 下载完毕后&#xff0c;解压缩…

修复 pprof ---node_exproter访问漏洞(go-pprof-leak)

前言&#xff1a; ** 在Go语言中&#xff0c;pprof和debug包是用来检测和避免goroutine泄漏&#xff0c;避免导致goroutine泄漏&#xff0c;进而消耗大量系统资源。不过对于安全而言确又存在一定风险&#xff0c;** 风险&#xff1a; 通过node_exporter web发现 190.168.46.1…

数据结构之“算法的时间复杂度和空间复杂度”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、算法效率 1.1算法的复杂度概念 1.2复杂度的重要性 二、时间复杂度 2.1时间复杂度的概念 2.2大O的渐进表示法 2.3常见的时间复杂度…

【人机交互 复习】第1章 人机交互概述

人机交互的知识点碎&#xff0c;而且都是文字&#xff0c;过一遍脑子里什么都留不下&#xff0c;但是背时间已经来不及了&#xff0c;最好还是找题要题感吧&#xff0c;加深印象才是做对文科的关键 一、概念 1.人机交互&#xff08;Human-Computer Interaction,HCI)&#xff1…

Blazor的SSR服务端渲染是不是交互式的

从.NET8开始&#xff0c;Blazor引入了SSR服务端渲染&#xff0c;归功于MVC和RazePage的沉淀&#xff0c;虽然来得晚&#xff0c;但一经发布&#xff0c;就将Blazor推向了新的高度。从今年开始&#xff0c;Youtube上关于Blazor的优质教学视频&#xff0c;以肉眼可见的速度在增加…

【机器学习】机器的登神长阶——AIGC

目录 什么是AIGC 普通用户接触AIGC网站推荐 通义千问 白马 普通用户如何用好AIGC 关键提示词的作用 AIGC的影响 就业市场&#xff1a; 教育领域&#xff1a; 创意产业&#xff1a; 经济活动&#xff1a; 社交媒体与信息传播&#xff1a; AIGC面临的挑战 什么是AIGC…

python离线安装第三方库、及其依赖库(单个安装,非批量移植)

文章目录 1.外网下载第三方库、依赖库2.内网安装第三方库3.补充附录内网中离线安装python第三方库,这时候只能去外网手动下载第三方库,再传回内网进行安装。 问题是python第三方库往往有其前置依赖包,你很难清楚某个第三方库依赖的是哪些依赖包,更难受的是依赖包可能还有其…

从零开始:使用ChatGPT快速创作引人入胜的博客内容

随着科技的飞速发展&#xff0c;人工智能逐渐渗透到我们生活的各个领域。无论是商业、教育还是娱乐&#xff0c;AI技术都在以惊人的速度改变着我们。特别是在内容创作领域&#xff0c;人工智能正发挥着越来越重要的作用。今天&#xff0c;我将和大家分享如何从零开始&#xff0…

【漏洞复现】极限OA video_file.php 任意文件读取漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

2024年快手短视频带货教程,操作简单易上手

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89389478 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 10-为什么做快手短视频带货 11-0粉丝开通小黄车 12-怎么挂小黄车&#xff0c;小黄车掉了怎么办 13-如何选品?好的选品成功率60% …

Github生成Personal access tokens及在git中使用

目录 生成Token 使用Token-手工修改 使用Token-自动 生成Token 登录GitHub&#xff0c;在GitHub右上角点击个人资料头像&#xff0c;点击Settings → Developer Settings → Personal access tokens (classic)。 在界面上选择点击【Generate new token】&#xff0c;填写如…

腾讯云API安全保障措施?有哪些调用限制?

腾讯云API的调用效率如何优化&#xff1f;怎么使用API接口发信&#xff1f; 腾讯云API作为腾讯云提供的核心服务之一&#xff0c;广泛应用于各行各业。然而&#xff0c;随着API应用的普及&#xff0c;API安全问题也日益突出。AokSend将详细探讨腾讯云API的安全保障措施&#x…