B-树介绍

news2024/11/18 3:26:18

B - 树是一种自平衡的多路搜索树,能够有效地存储和检索数据,被广泛应用于文件系统、数据库等领域。以下是 B - 树的实现原理:

定义及性质:

  • 定义:B - 树是一种平衡的多路查找树,它在查找、插入和删除操作上具有较高的效率。
  • 性质
  • 每个节点最多有 m 个子节点,最少有「[m/2]个子节点,其中 m 称为 B-树的阶。
  • 除根节点外,每个节点至少有[m/2]-1 个关键字,根节点至少有1个关键字。
    C
  • 节点内的关键字是有序排列的,对于任意非叶子节点,其关键字 k; 满足 k < k₂ <・·< kn-1,n 为节点内关键字的个数。
  • 每个关键字 k; 对应一个子节点指针 p,且指针 " 所指向的子节点中的所有关键字都小于 ki+1。

数据结构:

  • 通常使用数组或链表来实现 B - 树的节点。每个节点包含以下信息:
    • 一个关键字数组,用于存储节点中的关键字。
    • 一个子节点指针数组,用于指向该节点的子节点。
    • 一个记录当前节点中关键字个数的变量。

查找操作:

  • 从根节点开始,将待查找的关键字与当前节点中的关键字进行比较。
  • 如果待查找的关键字等于当前节点中的某个关键字,则查找成功。
  • 如果待查找的关键字小于当前节点中的某个关键字,则沿着该关键字对应的子节点指针继续查找。
  • 如果待查找的关键字大于当前节点中的所有关键字,则沿着最后一个子节点指针继续查找。
  • 重复上述步骤,直到找到关键字或到达叶子节点。如果到达叶子节点仍未找到关键字,则查找失败。

插入操作:

首先通过查找操作确定待插入关键字的位置

说明该关键字已存在,插入操作失败。
如果香找成功,
如果查找失败,根据查找路径确定要插入的叶子节点。
如果插入后叶子节点的关键字个数未超过 m-1,则直接将关键字插入到叶子节点的适当位置,并保持关
键字的有序性。
如果插入后叶子节点的关键字个数超过了 m - 1,则需要对该节点进行分裂操作。将节点中间的关键字提
升到父节点,左右两部分关键字分别作为两个新的子节点,并调整父节点及更高层节点的指针和关键字

删除操作:

首先通过查找操作找到要删除的关键字所在的节点。
如果该关键字所在节点为叶子节点,且删除后节点的关键字个数不小于m/2]-1,则直接删除该关键

如果该关键字所在节点为叶子节点,且删除后节点的关键字个数小于[m/2]- 1,则需要进行调整操作
如向兄弟节点借关键字或与兄弟节点合并等,以保证节点的关键字个数满足 B-树的性质。
如果要删除的关键字所在节点为非叶子节点,则用该节点的前驱或后继关键字替换要删除的关键字,然后
在相应的叶子节点中删除替换后的关键字,后续的处理与删除叶子节点中的关键字类似。

示例:

下面以一个简单的 3 阶 B - 树为例,展示 B - 树的操作过程。

初始的 B - 树为空,插入关键字10 ,此时 B - 树只有一个节点,如下:

10

继续插入关键字 20、30,插入后的 B - 树为:

    20
  /    \
10      30

 插入关键字 40,此时根节点已满,需要进行分裂操作,将 20 提升到新的根节点,左右两部分分   别为 10 和
 30,40,得到的 B-树如下:

    20
  /    \
10      30
        /
      40

插入关键字 50,插入后的 B-树为:

    20
  /    \
10      30
        /    \
      40      50

删除关键字 30,由于 30 所在节点为非叶子节点,用其前驱关键字 20 替换 30,然后在叶子节点中删除 20
得到的 B-树如下:

    20
  /    \
10      40
        /
      50

B - 树通过其特殊的结构和相应的操作算法,能够在动态变化的数据集合中保持较好的平衡性,从而保证了查找、插入和删除操作的高效性。

与其他数据结构的比较

  • 与二叉查找树比较:二叉查找树每个节点只有两个子节点,而 B - 树是多路分支,在相同数量的关键字情况下,B - 树的高度相对较低,查找、插入和删除操作的平均时间复杂度更优,尤其是在数据量较大时,B - 树的优势更加明显。
  • 与哈希表比较:哈希表的查找操作在理想情况下时间复杂度为 ,但哈希表不支持范围查询,且在处理动态数据时可能会出现哈希冲突等问题。而 B - 树支持范围查询,且在数据动态变化时能够较好地保持平衡,性能相对稳定。

B - 树通过其独特的结构和高效的操作算法,在数据存储和检索方面具有显著优势,是许多系统中用于优化数据访问性能的重要数据结构之一 。

应用场景

  • 数据库系统:B - 树常用于数据库的索引结构,如 MySQL 中的 InnoDB 存储引擎就使用了 B + 树(B - 树的一种变体)来实现索引,能够快速定位和访问数据,提高查询效率。
  • 文件系统:在文件系统中,B - 树可用于管理文件和目录的索引,加快文件查找和访问速度。
  • 操作系统:操作系统中的虚拟内存管理也可能会用到 B - 树,用于管理内存页的索引等。

 

 

 

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

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

相关文章

DataWorks on EMR StarRocks,打造标准湖仓新范式

在大数据领域&#xff0c;数据仓库和实时分析系统扮演着至关重要的角色。DataWorks 基于大数据引擎&#xff0c;为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台&#xff0c;为用户带来智能化的数据开发和分析体验。而阿里云提供的 EMR Serverless St…

Redis系列之底层数据结构ZipList

Redis系列之底层数据结构ZipList 实验环境 Redis 6.0 什么是Ziplist&#xff1f; Ziplist&#xff0c;压缩列表&#xff0c;这种数据结构会根据存入数据的类型和大小&#xff0c;分配大小不同的空间&#xff0c;所以是为了节省内存而采用的。因为这种数据结构是一种完整连续…

【FPGA开发】AXI-Stream总线协议解读

文章目录 AXI-Stream概述协议中一些定义字节定义流的定义 数据流类别字节流连续对齐流连续不对齐流稀疏流 协议的信号信号列表 文章为个人理解整理&#xff0c;如有错误&#xff0c;欢迎指正&#xff01; 参考文献 ARM官方手册 《IHI0051B》 AXI-Stream概述 协议中一些定义 A…

c# 调用c++ 的dll 出现找不到函数入口点

今天在调用一个设备的dll文件时遇到了一点波折&#xff0c;因为多c 不熟悉&#xff0c;调用过程张出现了找不到函数入口点&#xff0c;一般我们使用c# 调用c 文件&#xff0c;还是比较简单。 [DllImport("AtnDll2.dll",CharSet CharSet.Ansi)]public static extern …

L11.【LeetCode笔记】有效的括号

目录 1.题目 2.分析 理解题意 解决方法 草稿代码 ​编辑 逐一排错 1.当字符串为"["时,分析代码 2.当字符串为"()]"时,分析代码 正确代码(isValid函数部分) 提交结果 3.代码优化 1.题目 https://leetcode.cn/problems/valid-parentheses/descri…

Unity类银河战士恶魔城学习总结(P129 Craft UI 合成面板UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了合成面板的UI设置 UI_CraftWindow.cs 字段作用&#xff1a; UI 组件&#xff1a; itemName / itemDescription / icon&#…

Python酷库之旅-第三方库Pandas(221)

目录 一、用法精讲 1036、pandas.DatetimeIndex.to_pydatetime方法 1036-1、语法 1036-2、参数 1036-3、功能 1036-4、返回值 1036-5、说明 1036-6、用法 1036-6-1、数据准备 1036-6-2、代码示例 1036-6-3、结果输出 1037、pandas.DatetimeIndex.to_series方法 10…

通过JS实现下载图片到本地教程分享

今天分享的这个方法我之前自己试了一下&#xff0c;感觉还行&#xff0c;原理就是通过<a>标签的新增属性实现的&#xff0c;然后可以强制触发下载功能&#xff0c;废话不多说&#xff0c;直接上教程。 首先在HTML写下面的代码: <a href"img.jpg" download…

二、神经网络基础与搭建

神经网络基础 前言一、神经网络1.1 基本概念1.2 工作原理 二、激活函数2.1 sigmoid激活函数2.1.1 公式2.1.2 注意事项 2.2 tanh激活函数2.2.1 公式2.2.2 注意事项 2.3 ReLU激活函数2.3.1 公式2.3.2 注意事项 2.4 SoftMax激活函数2.4.1 公式2.4.2 Softmax的性质2.4.3 Softmax的应…

Unreal engine5实现类似鬼泣5维吉尔二段跳

系列文章目录 文章目录 系列文章目录前言一、实现思路二、具体使用蓝图状态机蓝图接口三、中间遇到的问题 前言 先看下使用Unreal engine5实现二段跳的效果 一、实现思路 在Unreal Engine 5 (UE5) 中使用蓝图系统实现类似于《鬼泣5》中维吉尔的二段跳效果&#xff0c;可以通…

RAG经验论文《FACTS About Building Retrieval Augmented Generation-based Chatbots》笔记

《FACTS About Building Retrieval Augmented Generation-based Chatbots》是2024年7月英伟达的团队发表的基于RAG的聊天机器人构建的文章。 这篇论文在待读列表很长时间了&#xff0c;一直没有读&#xff0c;看题目以为FACTS是总结的一些事实经验&#xff0c;阅读过才发现FAC…

Java 简单家居开关系统

1.需求&#xff1a; 面向对象编程实现智能家居控制系统&#xff08;简单的开关&#xff09; 2.实现思路 1.定义设备类&#xff1a;创建设备对象代表家里的设备 JD类&#xff1a; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;D…

任务调度工具Spring Test

Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 作用&#xff1a;定时自动执行某段Java代码 应用场景&#xff1a; 信用卡每月还款提醒 银行贷款每月还款提醒 火车票售票系统处理未支付订单 入职纪念日为用户发送通知 一.…

SAFETY LAYERS IN ALIGNED LARGE LANGUAGEMODELS: THE KEY TO LLM SECURITY

目录 概要 背景 大语言模型对齐 对齐大语言模型中的过度拒绝 微调攻击 研究设置 问题定义 对齐的大语言模型 大语言模型的提示模板 安全层的存在和定位 安全层的存在性 1.从余弦相似度说明 2.从向量之间角度差异说明 3.与预训练LLM对比说明 安全层的定位 1.推理…

netcore Kafka

一、新建项目KafakDemo <ItemGroup><PackageReference Include"Confluent.Kafka" Version"2.6.0" /></ItemGroup> 二、Program.cs using Confluent.Kafka; using System; using System.Threading; using System.Threading.Tasks;names…

在k8s上部署Crunchy Postgres for Kubernetes

目录 一、前言二、安装Crunchy Postgres for Kubernetes三、部署一个简单的postgres集群四、增加pgbouncer五、数据备份六、备份恢复七、postgres配置参数八、数据导入九、权限管理 一、前言 Crunchy Postgres可以帮助我们在k8s上快速部署一个高可用、具有自动备份和恢复功能的…

函数指针示例

目录&#xff1a; 代码&#xff1a; main.c #include <stdio.h> #include <stdlib.h>int Max(int x, int y); int Min(int x, int y);int main(int argc, char**argv) {int x,y;scanf("%d",&x);scanf("%d",&y);int select;printf(&q…

计算机网络:运输层 —— 运输层端口号

文章目录 运输层端口号的分类端口号与应用程序的关联应用举例发送方的复用和接收方的分用 运输层端口号的分类 端口号只具有本地意义&#xff0c;即端口号只是为了标识本计算机网络协议栈应用层中的各应用进程。在因特网中不同计算机中的相同端口号是没有关系的&#xff0c;即…

牛客挑战赛77

#include <iostream>// 函数 kXOR&#xff1a;计算两个数在 k 进制下的异或和 // 参数&#xff1a; // a: 第一个正整数 // b: 第二个正整数 // k: 进制基数 // 返回值&#xff1a; // 两数在 k 进制下的异或和&#xff08;十进制表示&#xff09; long long kXO…

大数据-225 离线数仓 - 目前需求分析 指标口径 日志数据采集 taildir source HDFS Sink Agent Flume 优化配置

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…