对B-树的理解

news2024/9/24 1:24:36

目录

  • 前言-为什么要使用B-树?
  • B-树概念

前言-为什么要使用B-树?

首先,我们正常的搜索都有一下方式:

  1. 搜索二叉树,极端场景下会退化,类似于单支,此时的效率变成了O(N);
  2. 为了解决1的问题,提出了平衡树的概念,左右子树的高度差不大于1,AVL树,红黑树。该效率为O(logN),其中map/set就是由此构建的;
  3. 更好的搜索结构则有哈希/散列表,该效率为O(1),–unordered_map/unordered_set
  4. 跳表、字典树

上面的结构都是完成内存中数据的搜索查找问题
但假设此时的数据量很多,在内存中存放不下,数据要存到磁盘中,上面的数据结构就不好了,虽然可以把内存在磁盘的地址使用AVL树来存储,查找的时间复杂度为O(logN),但是该复杂度在内存中访问非常快,在磁盘中,logN次磁盘IO访问会非常慢。 如果换成哈希表,变成O(1),在极端情况下,哈希表冲突十分厉害,一个桶中数据太多,会影响效率,并且哈希表中存在很多附带数据(表结构、节点中的指针等),数据量很大时,内存占用很多。B树则能解决这些问题。

B-树概念

B树是一种平衡的多叉树,一颗M阶(M>2)的B树,为平衡的M路平衡搜索树,可以是空树或者满足以下性质:

  1. 根节点至少有两个孩子
  2. 每个非根节点至少有M/2(向上取整)个孩子,至多有M个孩子
  3. 每个非根节点至少有M/2-1(向上取整)个关键字,至多有M-1个关键字,并且以升序排列
  4. key(1)和key(i+1)之间的孩子节点的值介于key[i]、key[i+1]之间
  5. 所有的叶子节点都在同一层

对上述性质进行总结来说:

根节点:关键字数量[1,M-1],孩子数量[2,M]
非根节点:关键字数量[M/2-1, M-1],孩子数量[M/2,M]
每个节点中,孩子的数量比关键字的数量永远要多一个

那么为什么会有这样的性质呢?结合例子来进行理解
针对根节点的数量范围分析
首先,一个关键字会有两个孩子(左孩子和右孩子),其中和相邻的关键字会共有一个孩子,即关键字1的右孩子也是关键字2的左孩子,那么孩子的数量就会比关键字的数量多一个。
在这里插入图片描述
针对非根节点的数量范围分析
假设M等于3,那么根节点的关键字数量最多只能放2个,如果放到了3个,则违反了规则,根节点最多存M-1个关键字,那么就会进行分裂,创建一个兄弟节点,右边M/2的值拷贝到兄弟节点中,中间值插入到父亲,如果没有父亲,则创建新的父亲,该值作为新的根。也就是上图右下角的节点,关键字70超出范围,则进行分裂,将70分裂为兄弟节点,50插入到父亲节点。
那么为什么分裂的时候要提中位数插入到父亲呢?
因为分裂新增一个兄弟节点,对于父亲而言,多了一个孩子,还得多一个关键字,这样才能保持孩子的数量比关键字数量多一个。
结合分裂的思想:
如果M是奇数,分裂时两边数量为M/2,中间值插入到父亲。(比如M=9,左右各为4,剩余的一个节点插入到父亲,如果没有父亲则创建)
如果M是偶数,因为两边要有一个需要插入到父亲,因此总有一边要少一个,一边是M/2,一边是M/2-1。(比如M=10,左右为5和4或者4和5,剩余一个插入到父亲,如果没有父亲则创建)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于微信小程序的音乐播放平台

基于微信小程序的音乐播放平台 音乐播放小程序项目简介技术栈功能模块项目流程系统E-R图项目页面 音乐播放小程序 项目简介 微信音乐小程序旨在提供一个简洁高效的音乐播放平台,用户可以方便地搜索、播放和收藏自己喜欢的音乐。整个项目采用前后端分离的架构&…

Rust 测试的组织结构

测试的组织结构 本章一开始就提到,测试是一个复杂的概念,而且不同的开发者也采用不同的技术和组织。Rust 社区倾向于根据测试的两个主要分类来考虑问题:单元测试(unit tests)与 集成测试(integration test…

基于3D感知的端到端具身操作论文导读

DexIL:面向双臂灵巧手柔性操作的端到端具身执行模型 模型架构 输入:   观测Ot: RGB点云,使用PointNet进行编码;   状态St: 双臂末端7x2Dof位姿16x2灵巧手关节位置,只进行归一化,无编码&am…

在word中删除endnote参考文献之间的空行

如图,在References中,每个文献之间都有空行。不建议手动删除。打开Endnote。 打开style manager 删除layout中的换行符。保存,在word中更新参考文献即可。

InjectFix 热更新解决方案

简介 今天来谈一谈,项目种的客户端热更新解决方案。InjectFix是腾讯xlua团队出品的一种用于Unity中C#代码热更新热修复的解决方案。支持Unity全系列,全平台。与xlua的思路类似,InjectFix解决的痛点主要在于Unity中C#代码写的逻辑在发包之后无…

复杂设备操作流程3D数字化全景展示好处多

传统的纸质说明书,尽管承载着产品的使用指南,但其图文平面的表现形式往往限制了表现力和说明力。对于简单产品,用户或许能摸索使用;但对于复杂产品,即使拥有详实的说明书,也可能因理解困难而导致使用障碍。现在&#x…

【工具使用】adb下载和配置

【工具使用】adb下载和配置 一,简介二,操作步骤2.1 Bing搜索adb2.2 下载adb工具2.3 添加路径到环境变量 三,效果验证 一,简介 本文主要介绍如何下载adb并安装使用,供参考。 此时打开cmd,输入adb 会提示&am…

<数据集>猫狗识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:3686张 标注数量(xml文件个数):3686 标注数量(txt文件个数):3686 标注类别数:2 标注类别名称:[cat, dog] 序号类别名称图片数框数1cat118811892dog24982498 使用标…

计算机网络复习笔记【面向考纲整理】

计算机网络复习笔记 一、计算机网络体系结构(一)计算机网络的概念、分类、组成与功能1.计算机网络的概念、组成与功能1.1计算机网络的概念1.2计算机网络的组成1.3计算机网络的功能 2.计算机网络的分类3.计算机网络的标准化工作及相关知识 (二…

主机安全-进程、命令攻击与检测

目录 概述反弹shell原理nc/dev/xxx反弹shell下载不落地反弹Shell各种语言反弹shell linux提权sudosuid提权mysql提权 Dnslog参考 概述 本文更新通过在主机(不含容器)上直接执行命令或启动进程来攻击的场景。检测方面以字节跳动的开源HIDS elkeid举例。每…

E9.【C语言】练习:模拟用户登录界面,最多输入三次密码以及strcmp函数的讲解

思路&#xff1a;分两个环节 1.输入密码&#xff0c;存储在数组里 2.密码验证&#xff08;尝试次数不超过3次&#xff09; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() {char password[20] { 0 };int i 0;for ( i …

整洁架构SOLID-接口隔离原则(ISP)

文章目录 定义ISP与编程语言ISP与软件架构小结 定义 在上图中有多个用户需要操作OPS类。现在&#xff0c;我们假设这里的User1只需要使用op1,User2只需要使用op2,User3只需要使用op3。 在这种情况下&#xff0c;如果OPS类是用Java编程语言编写的&#xff0c;那么很明显&#x…

使用Gitee仓库镜像管理功能实现Gitee与Github 双向同步

进入你所需要同步的仓库&#xff0c;点击「管理」->「镜像仓库管理」&#xff0c;点击「添加镜像」选项&#xff1b; 如果你的Gitee账号还没有绑定过 GitHub 帐号&#xff0c;先根据弹窗的提示绑定 GitHub 帐号&#xff1b; 添加镜像时候&#xff0c;在「镜像方向」中选择…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(三)-机上无线电接入节点无人机

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

【微信小程序知识点】getApp()全局数据共享,页面间通信,组件间通信

getApp()-全局数据共享 在小程序中&#xff0c;可以通过getApp()方法获取到小程序全局唯一的App实例。因此在App()方法中添加全局共享的数据&#xff0c;方法&#xff0c;从而实现页面&#xff0c;组件的数据传值。 // app.js App({//全局共享的数据globalData: {token: &qu…

C语言——流程控制:if...else、switch...case

控制类语句&#xff1a; 逻辑运算符&#xff1a; 选择语句&#xff1a; if...else&#xff1a; if&#xff08;&#xff09;括号内的内容终究会被转换成0,1&#xff0c;满足的话即为1&#xff0c;不满足的话为0。因此要注意&#xff0c;&#xff08;&#xff09;括号内因为条件…

【数智化CIO展】沃太能源CIO陈丽:AI 浪潮下的中国企业数智化转型机遇与挑战...

陈丽 本文由沃太能源CIO陈丽投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级优秀CIO》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 在当今飞速发展的数字时代&#xff0c;中国企业正面临着前所未有的变革机遇和挑战。“中国企业数…

机器学习筑基篇,Jupyter Notebook 精简指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 Jupyter Notebook 简明指南 描述&#xff1a;前面我们已经在机器学习工作站&#xff08;Ubuntu 24.04 Desktop Geforce RTX 4070Ti SUPER&#xff09;中安装 Anaconda 工具包&#xff0c;其…

Spark底层原理:案例解析(第34天)

系列文章目录 一、Spark架构设计概述 二、Spark核心组件 三、Spark架构设计举例分析 四、Job调度流程详解 五、Spark交互流程详解 文章目录 系列文章目录前言一、Spark架构设计概述1. 集群资源管理器&#xff08;Cluster Manager&#xff09;2. 工作节点&#xff08;Worker No…

Unity基础调色

叭叭叭 最近&#xff08;*这两天&#xff09;因为想做一些Unity的调色问题&#xff0c;尝试原文翻译一下&#xff0c;其实直接原文更好&#xff01;&#xff01; Color Grading 参考了&#xff0c;某大牛的翻译&#xff0c;实在忍不住了&#xff0c;我是不知道为什么能翻译成…