b树(一篇文章带你 理解 )
目录
一、引言
二、B树的基本定义
三、B树的性质与操作
1 查找操作
2 插入操作
3 删除操作
四、B树的应用场景
1 数据库索引
2 文件系统
3 网络路由表
五、哪些数据库系统不使用B树进行索引
1 列式数据库
2 图形数据库
3 内存数据库
4 NoSQL数据库
5 分布式数据库
六、总结
一、引言
在计算机科学中,B树是一种自平衡的树,它能够保持数据有序,其插入与删除操作都能在对数时间内完成。
B树在数据库和文件系统的实现中尤为关键,因为它们能高效地保持数据有序,同时允许对数级别的插入、删除和查找操作。
B树相对于二叉搜索树的优势在于,它可以有效地利用存储空间,特别是在磁盘或类似的直接存取辅助设备中。
二、B树的基本定义
B树是一种平衡的多路搜索树,它满足以下条件:
- 所有叶子节点位于同一层。
- 每个非叶子节点包含n个关键字(k1, k2, ..., kn),其中n满足ceil(m/2) <= n <= m-1。对于每个关键字ki,ki < ki+1。
- 非叶子节点的子树指针p1, p2, ..., pn。其中所有关键字ki,i的子树指针pi指向的子树中所有关键字的值均大于ki且小于ki+1。
- 非叶子节点的子树个数=关键字个数+1。
- 所有关键字都出现在叶子节点的链表中(稠密索引),且链表中的节点是依次有序的。
其中,m是B树的阶数,它决定了树的最大和最小度数。一个m阶的B树,一个节点最多有m个子节点。
三、B树的性质与操作
B树作为一种自平衡树,其关键性质在于保持树的平衡,以保证查找、插入和删除操作的高效性。
1 查找操作
从根节点开始,根据键值比较进行路径选择,直到找到目标节点或到达叶子节点。B树的查找效率与树的高度相关,由于B树能够降低树的高度,因此查找效率较高。
- 从根节点开始搜索,找到合适的叶子节点进行插入。
- 如果插入后叶子节点关键字数不超过最大度数,则插入完成。
- 否则,需要分裂该叶子节点,并将中间关键字提升到父节点。
- 如果父节点也满了,则需要继续分裂并向上提升关键字,直到根节点或某个非满节点为止。
- 如果根节点也分裂了,则需要创建一个新的根节点,并将两个子树的根节点作为新根节点的子节点。
2 插入操作
当插入一个新元素时,首先找到合适的位置,如果节点未满,则直接插入;如果节点已满,则需要进行分裂操作,将节点中的部分元素移动到新的节点中,并更新父节点。
分裂操作可能导致父节点也满,此时需要递归地进行分裂和更新操作,直到根节点或某个非满节点为止。
- 从根节点开始搜索,找到包含要删除关键字的叶子节点。
- 如果该叶子节点的关键字数大于最小度数,则直接删除该关键字。
- 否则,需要从兄弟节点“借”一个关键字过来,或者与兄弟节点及父节点合并。
- 删除操作可能触发一系列的合并和调整操作,直到满足B树的性质为止
以下是B树插入操作的Python伪代码:
def insert(node, key):if node is None:return create_new_node(key)i = node.find_position(key)if key == node.keys[i]:return node # Key already exists, no insertionif node.is_leaf():node.insert_non_full(i, key)if node.is_full():return split_node(node)else:return nodeelse:child = node.children[i]child = insert(child, key)node.update_keys(i, child)if child is not None:return split_node(node) if node.is_full() else nodedef split_node(node):t = node.degree # Assume degree is set for the treemid = t - 1new_node = create_new_node()new_node.keys = node.keys[mid:]new_node.children = node.children[mid+1:]node.keys = node.keys[:mid]node.children = node.children[:mid+1]new_node.children[-1] = None if node.is_leaf() else split_node(node.children[mid+1])node.parent = create_new_node() if node.parent is None else node.parentnode.parent.keys.append(node.keys[mid])node.parent.children.append(new_node)return node.parent
3 删除操作
删除操作相对复杂,因为需要保持B树的平衡性。当删除一个元素时,首先需要找到该元素所在的节点。
如果删除后节点不满,且兄弟节点有富余元素,则可以从兄弟节点借元素;如果兄弟节点也无富余元素,则需要进行合并操作,将当前节点与兄弟节点合并为一个新的节点,并更新父节点。合并操作可能导致父节点也不满,此时需要递归地进行合并和更新操作。
- 从根节点开始,根据关键字比较结果选择子节点进行搜索。
- 一直搜索到叶子节点,如果叶子节点包含要搜索的关键字,则搜索成功;否则搜索失败。
四、B树的应用场景
B树在计算机科学中有广泛的应用,特别是在处理大量数据时需要高效查找的场景中。以下是一些典型的应用场景:
1 数据库索引
在关系型数据库中,B树常被用作索引结构,以加快数据的查找速度。通过将数据按照键值排序并存储在B树中,数据库系统可以快速地定位到目标数据的位置。
2 文件系统
在文件系统中,B树也被用于目录结构的组织和查找。通过将目录项按照名称排序并存储在B树中,文件系统可以高效地定位到目标文件或目录。
3 网络路由表
在网络路由中,B树可以用于存储和查找路由信息。通过将IP地址或域名作为键值存储在B树中,路由器可以快速地找到目标地址的下一跳信息。
五、哪些数据库系统不使用B树进行索引
虽然B树及其变种(如B+树、B*树)是许多数据库系统实现索引的首选数据结构,但并非所有数据库系统都使用B树进行索引。以下是一些不使用B树进行索引的数据库系统的例子:
1 列式数据库
列式数据库,如Google的BigTable或Apache的Cassandra,它们的数据存储和索引方式与传统的行式数据库有所不同。这些系统通常基于键值对或列族进行数据存储和检索,因此可能不会使用传统的B树索引。
2 图形数据库
图形数据库,如Neo4j,专注于表示和查询图形结构的数据。它们通常使用专门的图算法和索引结构来加速查询,而不是传统的B树索引。
3 内存数据库
一些内存数据库,如Redis或Memcached,它们的数据主要存储在RAM中,以提供极快的读写速度。这些系统通常使用哈希表或其他内存友好的数据结构来支持快速查找,而不是B树。
4 NoSQL数据库
许多NoSQL数据库,如MongoDB(在某些情况下)和Cassandra,不依赖于传统的B树索引。MongoDB支持多种索引类型,包括哈希索引和地理空间索引,这些索引类型可能不使用B树结构。
5 分布式数据库
分布式数据库系统,如Spanner或CockroachDB,需要处理跨多个物理节点的数据。这些系统通常使用更复杂的索引和分区策略,可能不完全依赖于B树。
需要注意的是,即使某些数据库系统不使用B树进行索引,它们仍然可能使用其他类型的数据结构或算法来实现高效的查询性能。
此外,随着数据库技术的不断发展,新的索引结构和算法也在不断涌现,因此不能一概而论所有数据库系统都不使用B树进行索引。
在选择数据库系统时,了解其索引机制以及它如何支持特定的查询模式和数据访问需求是非常重要的。不同的数据库系统适用于不同的应用场景和工作负载,因此需要根据实际情况进行选择。
六、总结
B树作为一种高效的数据结构,在处理大量数据时具有显著的优势。通过了解其基本概念、性质、操作以及应用场景,我们可以更好地理解和应用B树算法。随着计算机技术的不断发展,B树将在更多领域发挥重要作用。
相关文章:
b树(一篇文章带你 理解 )
目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据…...
OD_2024_C卷_200分_7、5G网络建设【JAVA】【最小生成树】
package odjava;import java.util.Scanner;public class 七_5G网络建设 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 基站数量(节点数)int m sc.nextInt(); // 基站对数量(边数&…...
面试题:分布式锁用了 Redis 的什么数据结构
在使用 Redis 实现分布式锁时,通常使用 Redis 的字符串(String)。Redis 的字符串是最基本的数据类型,一个键对应一个值,它能够存储任何形式的字符串,包括二进制数据。字符串类型的值最多可以是 512MB。 Re…...
【学习心得】websocket协议简介并与http协议对比
一、轮询和长轮询 在websocket协议出现之前,要想实现服务器和客户端的双向持久通信采取的是Ajax轮询。它的原理是每隔一段时间客户端就给服务器发送请求找服务器要数据。 让我们通过一个生活化的比喻来解释轮询和长轮询假设你正在与一位不怎么主动说话的老大爷&…...
基于Token的身份验证:安全与效率的结合
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
Electron程序如何在MacOS下获取相册访问权限
1.通过entitiment.plist,在electron-builder签名打包时,给app包打上签名。最后可以通过codesign命令进行验证。 TestPhotos.plist electron-builder配置文件中加上刚刚的plist文件。 通过codesign命令验证,若出现这个,则说明成…...
uniapp让输入框保持聚焦状态,不会失去焦点
使用场景:当输入框还有发送按钮的时候,点击发送希望软键盘不消失,还可以继续输入,或者避免因输入图片标签造成的屏闪问题 多次尝试后发现一个很实用的方法,适用input输入框和editor输入框 解决办法:把cli…...
面试中如何介绍mysql的B+树
B树是B树的变体,也是一颗多路搜索树。在MySQL中,B树是为磁盘或者其他直接辅助存储设备所设计的一种平衡的查找树结构。其具有以下特点: 每个节点最多有m个子女,m阶的B树深度最多为m。非根节点关键值个数范围是⌈m/2⌉-1<k<m…...
【Linux C | 网络编程】多播的概念、多播地址、UDP实现多播的C语言例子
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
AIGC实战——GPT(Generative Pre-trained Transformer)
AIGC实战——GPT 0. 前言1. GPT 简介2. 葡萄酒评论数据集3. 注意力机制3.1 查询、键和值3.2 多头注意力3.3 因果掩码 4. Transformer4.1 Transformer 块4.2 位置编码 5. 训练GPT6. GPT 分析6.1 生成文本6.2 注意力分数 小结系列链接 0. 前言 注意力机制能够用于构建先进的文本…...
微信小程序-入门
一.通过 Npm方式下载构建 1.下载和安装Npm:Npm https://docs.npmjs.com/downloading-and-installing-node-js-and-npm 或者 https://nodejs.org/en/download/ 未安装npm 提示 以下以安装node安装包为例 按任意键继续 安装完成后 2. 下载和安装小程序开…...
0102全排列和对换-行列式-线性代数
把n个不同的数排成一列,叫做这n个数的全排列(排列)。 一般情况, 1 , 2 , ⋯ , n 1,2,\cdots,n 1,2,⋯,n是n个数排列的标准次序。 当n个数的任一排列中两个数的先后次序与标准次序不同时,有说有一个逆序。 一个排列中所…...
面向对象的编程语言是什么意思?——跟老吕学Python编程
面向对象的编程语言是什么意思?——跟老吕学Python编程 面向对象是什么意思?面向对象的定义面向对象的早期发展面向对象的背景1.审视问题域的视角2.抽象级别3.封装体4.可重用性 面向对象的特征面向对象的开发方法面向对象程序设计基本思想实现 面向对象的…...
Spring Boot整合MyBatis Plus配置多数据源
Spring Boot 专栏:https://blog.csdn.net/dkbnull/category_9278145.html Spring Cloud 专栏:https://blog.csdn.net/dkbnull/category_9287932.html GitHub:https://github.com/dkbnull/SpringBootDemo Gitee:https://gitee.com/…...
Unix Network Programming Episode 88
‘inetd’ Daemon On a typical Unix system, there could be many servers in existence, just waiting for a client request to arrive. Examples are FTP, Telnet, Rlogin, TFTP, and so on. With systems before 4.3BSD, each of these services had a process associate…...
Java面试题之11MySQL
你对MySQL执行计划怎么看 执行计划就是SQL的执行查询的顺序,以及如何使用索引查询,返回的结果集的行数 在MySQL中,我们可以通过explain命令来查看执行计划。其语法如下: EXPLAIN SELECT * FROM table_name WHERE conditions;在…...
R语言:多值提取到点
ArcGIS中有相关工具实现多值提取到点的功能,在这里,我将使用R语言进行操作: library(dplyr) library(readxl) library(sf) library(raster)setwd("D:/Datasets") Bio <- stack(paste0("D:/Datasets/Data/worldclim2_1km/…...
八股文打卡day27——数据库(4)
面试题:讲一下事务的隔离级别? 我的回答: 因为事务之间的隔离性,造成了一些问题,比如说:脏读、不可重复读和幻读(虚读)。 1.什么叫脏读? 就是一个事务读取到了另一个事…...
Java桥接模式源码剖析及使用场景
目录 一、介绍二、项目管理系统中使用桥接模式三、权限管理中使用桥接模式四、Java JDBC中使用桥接模式 一、介绍 它的主要目的是将抽象化与实现化分离,使得二者可以独立变化,就像一个桥,将两个变化维度连接起来。各个维度都可以独立的变化。…...
【异常处理】verilator安装时出现异常 make: *** [Makefile:195: verilator_gantt.1] Error 13
在ubuntu中安装verilator工具时执行make出现该报错。 当我出现这个报错的时候我一脸懵逼,因为网上找不到相关解决办法。 后来想到我的verilator是从github上下载zip,然后解压后传到ubuntu上的,windows上解压我记得会把-替换成_,这…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
