当前位置: 首页 > news >正文

【数据结构】B树

B树(B-Tree)是一种自平衡的多叉搜索树,广泛应用于数据库系统和文件系统中,以便高效地进行数据存储和检索。它的设计目标是减少磁盘I/O操作,使得在大量数据的情况下依然能够进行快速的查找、插入和删除操作。

B树的特点

  1. 节点存储多个元素:每个节点可以存储多个元素,而不是像二叉搜索树那样每个节点只能存储一个元素。
  2. 多叉结构:每个节点有多个子节点,称为多叉树,而不是二叉树。
  3. 所有叶子节点在同一层:B树的所有叶子节点都在同一层,保证了树的平衡性,从而避免退化成线性结构。
  4. 节点元素有序:在一个节点内部,元素按顺序排列,并且节点内部的元素遵循左小右大的性质。
  5. 高效的查找、插入和删除操作:B树的高度较低,查找、插入和删除操作可以在 O(log n) 的时间复杂度内完成。

B树的定义

B树通常定义为一棵平衡的多路搜索树,并用一个整数 m 表示其阶数,即每个节点最多有 m 个子节点。B树的定义包括以下几条规则:

  1. 每个节点最多包含 m - 1 个关键字和 m 个子节点。
  2. 每个非根节点至少包含 ⌈m/2⌉−1 个关键字和 ⌈m/2⌉ 个子节点。
  3. 根节点至少包含 1 个关键字,特殊情况除外(当树为空时,根节点没有关键字)。
  4. 所有叶子节点都在同一层,即 B 树的高度是均匀的。
  5. 每个节点的关键字从小到大排序,并且遵循左小右大的原则。每个关键字 k 的左子树的所有关键字都小于 k,右子树的所有关键字都大于 k。

B树的操作

1. 查找

在 B 树中查找一个元素时,从根节点开始,逐层向下进行查找,直到找到元素或到达叶子节点。查找过程类似于多路查找树,利用节点内的有序性,通过比较关键字大小确定子树的方向。

2. 插入

插入时,首先找到元素应该插入的叶子节点,然后在该节点中插入。如果该节点的关键字数量超过上限(即 m - 1),则需要进行“分裂”操作,将中间的关键字上移至父节点,并将当前节点分裂成两个节点。如果父节点也超出限制,则继续向上分裂,直到根节点。如果根节点分裂,则树的高度增加一层。

插入操作可以总结为以下步骤:

  1. 找到要插入的位置,将新元素插入该节点。
  2. 如果节点超出容量限制,分裂该节点,将中间关键字上移。
  3. 如果父节点也超出容量限制,递归向上分裂,直到根节点。
3. 删除

删除操作较为复杂,主要分为以下几种情况:

  1. 删除的元素在叶子节点中:直接删除该元素。如果删除后节点元素少于下限(即 ⌈m/2⌉−1 个元素),则需要进行合并或借用操作。
  2. 删除的元素在非叶子节点中:找到删除元素的前驱或后继,用前驱或后继替代要删除的元素,然后从叶子节点删除前驱或后继元素,最后处理该叶子节点的合并或借用问题。
  3. 合并或借用:如果删除导致节点元素少于下限,尝试向兄弟节点借用一个元素。如果兄弟节点没有多余元素,则将当前节点与兄弟节点合并,递归处理父节点的合并或借用问题。

B树的应用场景

B树主要用于存储在磁盘上的大数据集合,它能够将查找、插入和删除操作的磁盘访问次数控制在 O(log n) 级别,这使得 B 树在数据库和文件系统中得到了广泛应用。具体应用场景包括:

  1. 数据库索引:B树结构适合于实现数据库的多级索引,可以高效地进行范围查询、查找、插入和删除操作。
  2. 文件系统:文件系统的目录管理、文件分配表等都使用 B 树结构来存储文件信息,以实现快速存取。
  3. 其他持久化存储系统:需要高效的读取和写入操作的系统中(例如键值存储、NoSQL 数据库),B 树及其变种(如 B+树)也是常用的数据结构。

B树的变种:B+树

B+树是 B 树的一种改进版本,具有以下特点:

  1. 所有关键字都存储在叶子节点中:非叶子节点只存储索引信息,不存储数据本身。
  2. 叶子节点形成一个链表:B+树的叶子节点按照关键字的顺序形成一个链表,支持高效的范围查询。
  3. 查询效率更高:在 B+树中,所有的查询操作最终都会落到叶子节点,从而使得查询效率更高。

B+树更适合文件系统和数据库索引,因为它支持高效的范围查询和顺序访问。

相关文章:

【数据结构】B树

B树(B-Tree)是一种自平衡的多叉搜索树,广泛应用于数据库系统和文件系统中,以便高效地进行数据存储和检索。它的设计目标是减少磁盘I/O操作,使得在大量数据的情况下依然能够进行快速的查找、插入和删除操作。 B树的特点…...

Docker 容器网络模式详解

Docker 容器网络模式详解 1.1 引言 1.1.1 Docker 网络简介 Docker 是一个开源的应用容器引擎,它允许开发者将应用和依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器采用沙箱机制,彼此…...

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.11

目录 第四门课 卷积神经网络(Convolutional Neural Networks)第四周 特殊应用:人脸识别和神经风格转换(Special applications: Face recognition &Neural style transfer)4.11 一维到三维推广(1D and 3…...

小游戏开发,出现了降本增效的技术?

中国经济下行大周期下,要说受影响程度较小的,非游戏行业莫属了。 小游戏的快速增长主要得益于其便捷的使用方式和轻量化的特点。小游戏通常无需下载,即点即玩,适合在碎片时间内进行娱乐,这种特性吸引了大量用户。此外…...

(4)Java 编程基础概览:Java中的输入输出操作与代码注释详解

目录 1. 控制台输出操作2. 控制台输入操作代码解释:3. 代码注释3.1 单行注释3.2 多行注释3.3 文档注释3.4 注释的重要性3.5 注意事项在Java编程语言中,输入与输出(I/O)操作扮演着举足轻重的角色。它们允许程序与外界环境进行数据的交互,无论是从用户处获取信息,还是向用户…...

Git使用指南

目录 工作机制基本框架:流程图 基本命令分支操作远程仓库本地仓库关联远程仓库 参考 工作机制 基本框架: Workspace:开发者工作区,也就是你当前写代码的目录,它一般保持的是最新仓库代码。Index / Stage:暂存区,最早…...

【linux】再谈网络基础(一)

1. 再谈 "协议" 协议是一种 "约定",在读写数据时, 都是按 "字符串" 的方式来发送接收的. 但是这里我们会遇到一些问题: 如何确保从网上读取的数据是否是完整的,区分缓冲区中的由不同客户端发来的数据 2. 网…...

Unknown at rule @tailwindscss(unknownAtRules)

一、前言 整合 tailwindcss 后,发现指令提示警告 Unknown at rule tailwindscss(unknownAtRules),其实是 vscode 无法识别 tailwindscss 指令,不影响使用,但是对于我这种有编程洁癖的人来说,有点膈应。 二、解决方案…...

IDEA - 快速去除 mapper.xml 黄色警告线和背景色----简化版

1.打开设置 2.去掉黄色警告线设置 3.去掉背景色设置 4.示范图...

高级 SQL 技巧详解

文章目录 高级 SQL 技巧详解一、引言二、窗口函数1、窗口函数的使用1.1、RANK() 函数示例1.2、常用窗口函数 三、公共表表达式(CTE)2、CTE 的使用2.1、CTE 示例 四、索引优化3、索引的创建与优化3.1、创建索引3.2、索引类型与注意事项 五、事务管理4、事…...

移除元素(java)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改…...

【Linux】shell脚本:检测文件是否存在,如存在则删除

通常&#xff0c;可以使用[ -f <file> ]来检查文件是否存在&#xff0c;使用rm <file>来删除文件。 以下是一个示例脚本&#xff0c;用于检测一个文件是否存在&#xff0c;并在存在时删除它&#xff1a; #!/bin/bash # 定义要检查的文件路径 file_path"/…...

Git代码托管(三)可视化工具操作(1)

常见的可视化操作工具有 一、官方网页 如码云、gitlab&#xff0c;自带了常见的git操作。 以码云为例&#xff1a; 1、创建分支&#xff1a; 进入分支目录&#xff0c;点击 新建分支 按钮&#xff0c; 在弹出框中输入新分支名称&#xff0c;点击确定即可一键创建分支&…...

How to use ffmpeg to convert video format from .webm to .mp4

The .mp4 container format doesn’t support the VP8 codec, which is commonly used in .webm files. MP4 containers typically use the H.264 codec for video and AAC for audio. You’ll need to re-encode the video using the H.264 codec and re-encode the audio us…...

Halcon 从XML中读取配置参数

1、XML示例 以下是一个XML配置文件的示例,该文件包含了AOI(自动光学检测)算法的环境参数和相机逻辑参数: <AOI><!--AOI算法参数 20241106--><Env><!--环境参数--><Param name="GPUName" value="NVIDIA GeForce RTX 405…...

hive表内外表之间切换

你想把内表和外表在元数据上达到切换的目的&#xff0c;这个操作有个前提&#xff0c;在apache版本源码上来讲是支持的&#xff01;&#xff01;&#xff01;&#xff01;但是&#xff01;&#xff01;&#xff01;&#xff01;注意哦&#xff01;默认情况下apache版本的源码中…...

电子邮件营销软件哪个好?

在数字化时代&#xff0c;电子邮件营销仍然是企业与客户沟通的核心策略之一。无论是推广新产品、发送新闻简报&#xff0c;还是进行客户关系管理&#xff0c;选择合适的电子邮件营销软件至关重要。面对市场上众多的选择&#xff0c;企业如何才能找到最适合自己的工具呢&#xf…...

OpenAI大事记;GPT到ChatGPT参数量进化

目录 OpenAI大事记 GPT到ChatGPT参数量进化 OpenAI大事记 GPT到ChatGPT参数量进化 ChatGPT是从初代 GPT逐渐演变而来的。在进化的过程中,GPT系列模型的参数数量呈指数级增长,从初代GPT的1.17亿个参数,到GPT-2的15 亿个参数,再到 GPT-3的1750 亿个参数。模型越来越大,训练…...

springboot020基于Java的免税商品优选购物商城设计与实现

&#x1f345;点赞收藏关注 → 文档最下方联系方式领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 一 、设计说明 1…...

代码随想录之字符串刷题总结

目录 1.反转字符串 2.反转字符串II 3.替换数字 4.翻转字符串里面的单词 5.右旋&&左旋字符串 1.反转字符串 题目描述&#xff1a; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...