【数据结构】B树

1 B树介绍

B树(英语:B-tree),是一种在计算机科学自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉搜索树(binary search tree)一个节点可以拥有2个以上的子节点。与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。B树减少定位记录时所经历的中间过程,从而加快访问速度。B树这种数据结构可以用来描述外部存储。这种数据结构常被应用在数据库和文件系统的实现上。

那为什么要使用 B-树呢(或者说为啥要有 B-树呢)?

要解释清楚这一点,我们假设我们的数据量达到了亿级别,主存当中根本存储不下,我们只能以块的形式从磁盘读取数据,与主存的访问时间相比,磁盘的 I/O 操作相当耗时,而提出 B-树的主要目的就是减少磁盘的 I/O 操作。大多数平衡树的操作(查找、插入、删除,最大值、最小值等等)需要 O(ℎ) 次磁盘访问操作,其中 ℎ 是树的高度。但是对于 B-树而言,树的高度将不再是logn(其中 n是树中的结点个数),而是一个我们可控的高度 ℎ (通过调整 B-树中结点所包含的键【你也可以叫做数据库中的索引,本质上就是在磁盘上的一个位置信息】的数目,使得 B-树的高度保持一个较小的值)。一般而言,B-树的结点所包含的键的数目和磁盘块大小一样,从数个到数千个不等。由于B-树的高度 h 可控(一般远小于logn ),所以与 AVL 树和红黑树相比,B-树的磁盘访问时间将极大地降低。

平衡二叉排序树是利用插入的成本缓解查找效率---------->红黑树来解决(最长子树不超过最短子树的2倍。数据量大的时候,树会很深,查找次数变多)----------->B树(多叉,多路查找树)

动画显示树调整的网站:Data Structure Visualization

2 B树特点

B树是一种平衡的多叉树,通常我们说m阶的B树,它必须满足如下条件:

  • 每个节点最多有m个子节点。
  • 每一个非叶子节点(除根节点)最少有[m/2]个子节点。
  • 如果根节点不是叶子节点,那么它至少有两个子节点。
  • 有k个子节点的非叶子节点拥有k-1个键,且升序排列,满足k[i] < k[i + 1]
  • 每个节点至多包含2*k-1个键。
  • 所有的叶子节点都在同一层。
  • 每个节点的结构是

其中:

n记录这个节点关键字的个数;

P0存储的是第一个孩子的地址,P1存储的是第二个孩子的地址,以此类推。。。。。。

K1是第一个关键字,K2是第二个关键字,以此类推。。。。。。

B树中一个节点的子节点数目的最大值,用m表示,假如最大值为4,则为4阶,如下图

性质:

  • 每个节点最多有m个子节点。
  • 每一个非叶子节点(除根节点)最少有[m/2]个子节点。
  • 如果根节点不是叶子节点,那么它至少有两个子节点。
  • 有k个子节点的非叶子节点拥有k-1个键,且升序排列,满足k[i] < k[i + 1]
  • 每个节点至多包含2*k-1个键。
  • 所有的叶子节点都在同一层。
  • 满足n叉排序树

3 B树的增删改查

磁盘预读

内存跟磁盘发生数据交互的时候,一般情况下有一个最小的逻辑单元,称之为页,datapage

页一般由操作系统决定是多大,一般是4k或者8k,我们在数据交互时,可以取页的整数倍来进行读取。

电脑的文件都是datapage的整数倍

每个节点放在磁盘块里,用B树做索引,这个磁盘大小是16k

三层数据。

对比B树和B+树

有一个很重要的不同是:B+树的数据都存在叶子节点上。

参考:

[1] https://zh.wikipedia.org/zh-hans/B%E6%A0%91

[2] 图解:什么是B树?(心中有 B 树,做人要虚心)一文读懂B-树 - 知乎 (zhihu.com)

[3] B 树 - OI Wiki (oi-wiki.org)

[4] 终于把B树搞明白了(四)_B树的删除操作_哔哩哔哩_bilibili

[5] notes/docs/B树和B+树详解.md at master · wardseptember/notes · GitHub

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

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

相关文章

MySQL高可用性攻略:快速搭建MySQL主从复制集群 !

MySQL高可用性攻略&#xff1a;快速搭建MySQL主从复制集群 &#xff01; MySQL基础知识&#xff1a;介绍MySQL数据库的基本概念和常用命令&#xff0c;如何创建数据库、表、用户和权限管理等。 MySQL安装教程&#xff1a;Centos7 安装MySQL5.7.29详细安装手册 MySQL数据类型&…

【大厂AI课学习笔记NO.63】模型的维护

说是模型的维护&#xff0c;其实这堂课都是在讲“在工业环境中开发和部署机器学习模型的流程”。 上图来自于我的笔记思维脑图&#xff0c;已经上传&#xff0c;要链接的访问的主页查看资源。 一路走来&#xff0c;我们学习了数据管理、模型学习、模型验证、模型部署等重要的步…

arm板运行程序时寻找动态库的路径设置

问题&#xff1a;error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file&#xff1f; 第一种方法---- 解决&#xff1a; ①复制需要用到的arm库到板子上。 ②pwd指令获取该库的绝对路径&#xff0c;把路径复制到/etc/ld.so.conf文件 ③输…

Leetcoder Day37| 动态规划part04 背包问题

01背包理论基础 面试掌握01背包&#xff0c;完全背包和重背包就够用了。 背包问题的理论基础重中之重是01背包&#xff0c;一定要理解透&#xff01; 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

隐式马尔科夫算法

隐式马尔科夫算法 隐式马尔科夫算法概述算法使用HMM 模型参数设置HMM 模型分类1. Gaussian HMM2. Multinomial HMM3. GMM HMM 其他机器学习算法&#xff1a;机器学习实战工具安装和使用 隐式马尔科夫算法概述 隐式马尔科夫算法是一种用于处理时序数据的强大工具&#xff0c;其…

css通过calc动态计算宽度

max-width: calc(100% - 40px) .m-mj-status-drawing-info-data{ display: inline-block; margin: 10px; min-width: 200px; padding: 10px;border-radius: 10px; background: #ddd;max-width: calc(100% - 40px);word-wrap: break-word;white-space: pre-line;}我开发的chatg…

计算机二级(Python)真题讲解每日一题:《字典字符查找》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ 在右侧的答题模板中&#xf…

Crash 实例

1.spinlock原理 为了解决这个spinlock的不公平问题&#xff0c;linux 2.6.25内核以后&#xff0c;spinlock采用了一种"FIFO ticket-based"算法的spinlock机制&#xff0c;可以很好的实现先来先抢占的思想。具体的做法如下&#xff1a; (1)、spinlock的核心字段有ow…

C语言-柔性数组成员的使用

文章目录 摘要柔性数组成员基本使用细节探究 零长度数组-定长数组-变长数组 摘要 本文先介绍柔性数组成员(flexible array member)的基本使用&#xff0c;然后介绍其内存结构。最后&#xff0c;补充了一些数组相关的其他概念。 柔性数组成员 基本使用 参考: 【C语言内功修炼…

[项目设计] 从零实现的高并发内存池(一)

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[高并发内存池] ❤️ 前置学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 ​ 目录 前言 项目介绍 1.内存池 1.1 什么是内存池 池化技术 内存池 1.2 为什…

word使用bib添加参考文献

文章目录 安装TexLive安装bibtex4word使用在word中添加参考文献使用bibtex4word在word中添加参考文献设置参考文献格式为毕业论文格式 参考 安装TexLive 从下载地址下载镜像iso文件texlive2023.iso双击打开iso镜像文件运行 install-tl-windows.bat点击安装非常非常非常耐心地安…

Shell学习 - 2.20 Shell exit命令:退出当前进程

exit 是一个 Shell 内置命令&#xff0c;用来退出当前 Shell 进程&#xff0c;并返回一个退出状态&#xff1b;使用$?可以接收这个退出状态&#xff0c;这一点已在《Shell $?》中进行了讲解。 exit 命令可以接受一个整数值作为参数&#xff0c;代表退出状态。如果不指定&…

Linux命令-clock命令(用于调整 RTC 时间)

说明 clock命令用于调整 RTC 时间。 RTC 是电脑内建的硬件时间&#xff0c;执行这项指令可以显示现在时刻&#xff0c;调整硬件时钟的时间&#xff0c;将系统时间设成与硬件时钟之时间一致&#xff0c;或是把系统时间回存到硬件时钟。 语法 clock [--adjust][--debug][--dir…

客户端/服务器协议是啥意思?

客户端/服务器协议是指在网络通信中&#xff0c;客户端和服务器之间进行数据传输时所使用的规定。简单来说&#xff0c;客户端是用户使用的设备&#xff0c;如电脑或手机&#xff0c;而服务器则是提供数据或服务的远程计算机。当客户端需要获取数据或服务时&#xff0c;它会向服…

【RT-DETR有效改进】结合SOTA思想利用双主干网络改进RT-DETR(全网独家创新,重磅更新)

一、本文介绍 本文给大家带来的改进机制是结合目前SOTAYOLOv9的思想利用双主干网络来改进RT-DETR&#xff08;本专栏目前发布以来改进最大的内容&#xff0c;同时本文内容为我个人一手整理全网独家首发 | 就连V9官方不支持的模型宽度和深度修改我都均已提供&#xff0c;本文内…

【活动】金三银四,前端工程师如何把握求职黄金期

随着春意盎然的气息弥漫大地&#xff0c;程序员群体中也迎来了一年一度的“金三银四”求职热潮。这个时间段对于广大前端工程师而言&#xff0c;不仅象征着生机勃发的新起点&#xff0c;更是他们职业生涯中至关重要的转折点。众多知名公司在这一时期大规模开启招聘通道&#xf…

ChatGPT 4.0使用之论文阅读

文章目录 阅读环境准备打开AskYourPDF进入主站 粗读论文直接通过右侧边框进行提问选中文章内容翻译或概括插图的理解 总结 拥有了GPT4.0之后&#xff0c;最重要的就是学会如何充分发挥它的强大功能&#xff0c;不然一个月20美元的费用花费的可太心疼了&#xff08;家境贫寒&…

WP外贸营销型网站模板

WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题&#xff0c;适合时尚服装行业搭建wordpress企业官网使用。 零件配件WordPress外贸建站模板 汽车行业零配件WordPress外贸建站模板&#xff0c;卖配件、零件的外贸公司可以使用的WordPress主题。 https://www.jia…

RocketMQ—消费者的两种消费模式

RocketMQ—消费者的两种消费模式 RocketMQ消息消费的模式分为两种&#xff1a;负载均衡模式和广播模式&#xff0c;负载均衡模式表示多个消费者交替消费同一个主题里面的消息&#xff1b;广播模式表示每个每个消费者都消费一遍订阅的主题的消息。 负载均衡模式 CLUSTERING 集…

vue2 element 实现表格点击详情,返回时保留查询参数

先直观一点&#xff0c;上图 列表共5条数据&#xff0c;准备输入Author过滤条件进行查询 进入查看详情页&#xff0c;就随便搞了个按钮 啥都没调啦 点击返回后 一开始准备用vuex做这个功能&#xff0c;后来放弃了&#xff0c;想到直接用路由去做可能也不错。有时间再整一套…