C++--数据结构--图解B树--B+树--B*树--0718 19

news2024/11/19 2:25:48

1、常见的搜索结构

种类      数据格式时间复杂度
顺序查找无要求O(N)
二分查找有序O(log_2 N)
二叉搜索树无要求O(log_2 N)
二叉平衡树无要求O(log_2 N)
哈希无要求O(1)

如果数据量很大,比如有100G数据,无法一次放进内存中,那就只能放在磁盘上了,上述搜索结构就不能发挥作用。如果放在磁盘上,如何处理数据?

在内存中只保存数据项需要查找的部分(key),以及指向该数据在磁盘中位置的指针。那么要访问数据时,先取这个地址去磁盘访问数据。


2、B树的概念

1970年,R.Bayer和E.mccreight提出了一种适合外查找的树,它是一种平衡的多叉树,称为B树。

一棵m阶(m>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树。

满足以下性质:

  1. 根节点至少有两个孩子
  2. 每个分支节点都包含k-1个关键字和k个孩子,其中  m/2 ≤ k ≤ m,(孩子永远比关键字多一个)
  3. 每个叶子节点都包含k-1个关键字,其中 ceil(m/2) ≤ k ≤ m
  4. 所有的叶子节点都在同一层
  5. 每个节点中的关键字从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分
  6. 每个结点的结构为:(n,A0,K1,A1,K2,A2,… ,Kn,An(n为结点中关键字的个数,满足ceil(m/2)-1≤n≤m-1)

3、B树的插入分析

以M=3为例,具体表现为

我们这里多存储一个只是为了当B树已经有两个数据(已满)时,先插入进数据,然后好进行分裂操作。

用序列{53, 139, 75, 49, 145, 36, 101}构建B树:

(1)插入 53 139

 (2)已满 再插入75(关键字数量等于M)开始分裂

分裂规则

分裂出一半(M/2)的值和孩子给兄弟

需要分裂的节点有M个关键字,找到中位数(75),右边M/2(139)给兄弟,中位数给父亲,没有父亲就创建一个父亲。

(3)插入49 145 36

 (4) 开始分裂

中位数(49) 右边M/2 (53)给分裂出来的兄弟节点 中位数给父亲节点

 (5)插入101

(6)开始分裂

(7) 父亲满了 继续分裂

 3.2插入过程的总结

1.如果树为空,直接插入新节点中,该节点为树的根节点

2.树非空,找待插入元素在树中的插入位置(注意:找到的插入节点位置一定在叶子节点中)

3.检测是否找到插入位置(假设树中的key唯一,即该元素已经存在时则不插入)

4.按照插入排序的思想将该元素插入到找到的节点中

4.检测该节点是否满足B树的性质:即该节点中的元素个数是否等于M,如果小于则满足

6.如果插入后节点不满足B树的性质,需要对该节点进行分裂。

        (a)申请新节点找到该节点的中间位置

        (b)将该节点中间位置右侧的元素以及其孩子搬移到新节点中
        (c)将中间位置元素以及新节点往该节点的双亲节点中插入,即继续4

7. 如果向上已经分裂到根节点的位置,插入结束。

由于该插入规则,B树天然平衡向右和向上增长。


4.B树的性能分析

如果M=1024,B树共有四层,那么:

在620亿个元素中,如果这棵树的度为1024,则需要小于4次即可定位到该节点,然后利用
二分查找可以快速定位到该元素,大大减少了读取磁盘的次数。


5.B+树和B*树

B+树是B树的变形,B+树的规则跟B树基本类似。

几点改进优化:

  1. 分支节点的子树指针与关键字个数相同
  2. 分支节点的子树指针p[i]指向关键字值大小在[k[i],k[i+1])区间之间。(相当于取消了最左边的那个子树)
  3. 所有叶子节点增加一个链接指针链接在一起
  4. 所有关键字及其映射数据都在叶子节点出现(分支节点和叶子节点有重复的值,分支节点存的是叶子节点的索引。父亲中存的是孩子节点中最小的值做索引)

 总结:

简化B树孩子比关键字多一个的规则,变成相等。

所有关键字都出现在叶子节点的链表中,且链表中的节点都是有序的,方便遍历查找所有值。

不可能在分支节点中命中,叶子节点才是存储数据的数据层。

5.2 图解B+树的插入

M等于3的B+树分裂过程 {53,139,75,49,145,36,101,150,155}

B+树的插入过程和跟B树基本是类似的,区别在于,第一次插入两层节点,一层做分支,一层做根。

B+树的分裂:

当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增
加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向
兄弟的指针。

 5.3 B*树

B*树是B+树的变形,在B+树的非根和非叶子结点再增加指向兄弟节点的指针

 B*树的分裂

当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结
点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如
果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父
结点增加新结点的指针。
B*树分配新结点的概率比B+树要低,空间使用率更高;

5.4 总结

B树:有序数组+平衡多叉树;
B+树:有序数组链表+平衡多叉树;
B*树:一棵更丰满的,空间利用率更高的B+树。
 

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

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

相关文章

互联网+时代的到来,让一站式婚庆管理系统成为潮流

自20世纪90年代初中国第一家婚庆公司成立至今,婚庆市场是越做越大。作为新兴产业的婚庆行业蕴藏着巨大的商机,婚庆市场空间日趋扩大,婚庆产业逐渐成为前景看好的朝阳产业。因此,市面上的婚庆企业也越来越多。但是想要在众多同行中…

Codeforces Round #841 (Div. 2) and Divide by Zero 2022 A-D

等System test的时候顺便水一篇吧233&#xff0c;感觉题目挺好的&#xff0c;但是我C、D都快要调完了&#xff0c;还是难受。 应该是我参加的今年最后一场比赛了。 Codeforces Round #841 (Div. 2) and Divide by Zero 2022 A. Joey Takes Money #include<bits/stdc.h&g…

数字射线检测图像质量

对比度 物体对比度 ΔI/I−μΔT/(1n)\Delta I/I -\mu \Delta T /(1n)ΔI/I−μΔT/(1n) 屏幕亮度 LkILkILkI 人眼感觉到的亮度 BKlnLBKln LBKlnL 人眼感觉到的亮度对比度 ΔBKln((LΔL)/L)\Delta B K ln((L\Delta L)/L)ΔBKln((LΔL)/L) 其中&#xff0c;III为射线强度 ΔB…

杭州市 智慧城市物联网支撑平台 功能规范 附下载地址

智慧城市物联网介绍 智慧城市是一个有机结合的大系统&#xff0c;涵盖了更透切的感知、更全面的互连&#xff0c;更深入的智能。物联网是智慧城市中非常重要的元素&#xff0c;它侧重于底层感知信息的采集与传输&#xff0c;城市范围内泛在网方面的建设。 通过智慧城市物联网支…

curl升级到7.87(centos7和TencentOS2.4 tk)

centos7升级curl到7.8.7,按照之前写过的一篇文章,大致按描述操作即可。只不过需要做一点点修正... CentOS 7升级curl_乐大师的博客-CSDN博客_centos7 curl升级 更新操作中会报错安装失败,提示如下: 针对这个问题只需要增加一个参数即可解决。 yum -y update curl --ena…

Linux系统安装Redis(实现远程登录)

目录 &#xff08;一&#xff09;下载和安装 &#xff08;二&#xff09;配置redis.con配置文件 1&#xff0c;开启远程连接有以下三步&#xff1a; 2&#xff0c;配置登录密码 ​&#xff08;三&#xff09;开放端口 1&#xff0c;开放Linux系统上的3306端口 2&#xff0…

记录一次Tomcat靶机渗透

Apache Tomcat&#xff0c;是世界上最广泛使用的Java Web服务器之一。带有默认配置的Tomcat服务器非常容易发现。发现暴露Web应用管理器的服务器也非常容易&#xff0c;它是一个应用&#xff0c;允许管理员启动、停止、添加和删除服务器中的应用。 信息搜集 第一步&#xff1a…

频谱分析误差主要表现在三个方面

频谱分析仪是研究电信号频谱结构的仪器&#xff0c;用于信号失真度、调制度、谱纯度、频率稳定度和交调失真等信号参数的测量&#xff0c;可用以测量放大器和滤波器等电路系统的某些参数&#xff0c;是一种多用途的电子测量仪器。它又可称为频域示波器、跟踪示波器、分析示波器…

基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法

普通数码相机记录了红、绿、蓝三种波长的光&#xff0c;多光谱成像技术除了记录这三种波长光之外&#xff0c;还可以记录其他波长&#xff08;例如&#xff1a;近红外、热红外等&#xff09;光的信息。与昂贵、不易获取的高光谱、高空间分辨率卫星数据相比&#xff0c;中等分辨…

【蚂蚁】Alluxio在蚂蚁集团大规模训练中的应用

本期内容我们邀请到了来自蚂蚁集团的开发工程师陈传迎老师&#xff0c;给大家分享Alluxio在蚂蚁集团是如何支持大规模模型训练的。 首先是关于引入Alluxio的背景&#xff1a; 为什么要引入Alluxio&#xff1f;Alluxio到底解决了什么问题&#xff1f; 带着这些问题&#xff0…

USDP使用笔记(八)Flink配置及简单测试

Flink配置Flink配置及简单测试 上一篇&#xff1a;https://lizhiyong.blog.csdn.net/article/details/123560865 将USDP2.0自带的Flink更换为Flink1.14后&#xff0c;还没有来得及改配置。不改配置用起来是有问题的&#xff0c;所以。。。本文主要就是改配置及简单测试效果。 …

基于ssm框架实现的Java web在线考试系统

一、项目简介 本项目是一套基于ssm框架实现的Java web在线考试系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&…

HITCON2022--ctf驱动逆向题

作者&#xff1a;selph HITCON CTF 2022 Writeup-checker 挺有意思的一道题&#xff0c;这里的关键函数是使用的动态生成执行操作&#xff0c;按照特定参数序列进行解密才能正常执行&#xff0c;否则一定会报错异常 checker 一共给了两个文件&#xff1a;checker.exe和chec…

VR数字政务:多功能一体化,政务服务更便民

越来越多的政务单位都是通过网络等线上信息化渠道&#xff0c;进行政务的推进以及落实、查询等功能的实施&#xff0c;在实际的政务应用中&#xff0c;VR技术可以打造集实景导航、窗口查询、在线申报等多功能为一体&#xff0c;实现数据多跑腿、群众少跑腿&#xff0c;有效提高…

Nginx 01篇——Nginx详细安装步骤以及Nginx各种启动方式

Nginx 01篇——Nginx详细安装步骤以及Nginx各种启动方式1. 前言2. 下载安装2.1 下载安装包2.2 安装2.2.1 离线安装2.2.1.1 安装步骤2.2.1.2 安装问题2.2.2 先安装所需依赖2.2.3 直接 yum 安装2.2.4 指定安装目录安装3. nginx 启动4. 启动后访问5. Nginx 启动等简单命令5.1 启动…

SVN,Git与Helix Core,谁的数据管理基础设施更安全?

2022年2月底&#xff0c;全球知名的半导体芯片公司英伟达被爆遭到勒索软件攻击&#xff0c;不久后&#xff0c;英伟达公司官方证实遭到入侵&#xff0c;攻击者已开始在线泄露员工凭据和私密信息。勒索软件组织表示&#xff0c;如果英伟达拒绝支付高达100万美元的赎金&#xff0…

写在2022年的末尾

今年是我人生的第24个年头。 最近了解稚晖君&#xff0c;xinglu师兄&#xff0c;以及很多优秀的同辈人的事迹之后&#xff0c;感觉到自己还差了很远。 读研已经过半&#xff0c;研二已经到了第二个学期&#xff0c;而自己还什么成果都没有。甚至开题的事情到现在都还没有头绪。…

C++简介

C是一种计算机高级程序设计语言&#xff0c;由C语言扩展升级而产生 &#xff0c;最早于1979年由本贾尼斯特劳斯特卢普在AT&T贝尔工作室研发。 C既可以进行C语言的过程化程序设计&#xff0c;又可以进行以抽象数据类型为特点的基于对象的程序设计&#xff0c;还可以进行以…

计算机英文论文怎么做降重? - 易智编译EaseEditing

人工降重一定要找靠谱的机构做。 降重是很耗费精力和时间的学术服务。 而那些没有口碑且不专业的商家&#xff0c;真的会花费那么多心思来仔细琢磨你的论文吗&#xff1f; 那些没有声誉的非专业商家给论文降重会产生很多弊端&#xff1a; &#xff08;1&#xff09;他们为了…

内网穿透你真的了解吗?

前言 内网穿透作为程序员常用的调试手段之一&#xff0c;我们可以通过在个人电脑上运行花生壳或者 frp 等方式&#xff0c;让他人访问我们本地启动的服务&#xff0c;而且这种访问可以不受局域网的限制&#xff0c;当我们使用ngrok,frp等开源框架时&#xff0c;你是否有好奇过…