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

python实现B/B+树

python实现–顺序查找
python实现–折半查找
python实现–分块查找
python实现B/B+树

B树和B+树都是一种多路搜索树,用于对大量数据进行排序和查找。它们在数据库系统中被广泛应用,特别是用于构建索引结构。

B树(B-Tree)

B树,又称多路平衡查找树,B树中所有结点的孩子结点数的最大值称为B树的阶,通常用m表示。一棵m阶B树或为空树,或为满足如下特性的m叉树:
1)树中每个结点至多有m棵子树(即至多含有m-1个关键字)。
2)若根结点不是终端结点,则至少有两棵子树。
3)除根结点外的所有非叶结点至少有[m/2]棵子树(即至少含有[m/2]-1个关键字)
4)所有叶子节点都在同一层。
5)每个节点中的关键字按照升序排列。

B树的优点包括:
减少访问磁盘的次数:B树的每个节点可以存储更多的关键字,因此树的高度相对较低,从而减少了访问磁盘的次数。
适应不同的数据规模:B树可以根据数据规模动态调整节点大小,适应不同的数据规模。

B+树(B-Plus Tree)

B+树是在B树的基础上进行改进的一种树结构,它与B树的区别在于:

所有关键字都出现在叶子节点中,而非内部节点。
内部节点仅用于索引,不存储数据,叶子节点包含了所有数据项。

B+树的特点包括:
叶子节点形成了有序链表,可以支持范围查找和范围查询。
内部节点不存储数据,只存储索引,因此可以存储更多的关键字。
由于关键字只出现在叶子节点中,因此B+树的查找性能更加稳定。

B树和B+树的比较:
查询性能:B+树的查询性能通常优于B树,因为B+树的叶子节点形成了有序链表,可以支持范围查询操作。
范围查询:B+树更适合范围查询操作,而B树的查询效率相对较低。
数据存储:B+树的数据仅存储在叶子节点中,而B树的数据可能分布在所有节点中,因此B+树更适合磁盘存储,减少了节点的访问次数。
内部节点:B树的内部节点可能包含数据,而B+树的内部节点仅用于索引,不存储数据。

总结:
B树和B+树都是常用的多路搜索树结构,在数据库系统中广泛应用。它们都具有平衡性和多路性的特点,但在一些方面有所不同,因此在实际应用中需要根据具体需求选择合适的树结构。

算法实现

B树的实现思路
定义B树节点类:B树的节点需要存储关键字和子节点的信息。我们可以定义一个节点类,其中包含关键字列表和子节点列表。
插入操作:B树的插入操作需要保持树的平衡性。当插入一个关键字时,需要根据B树的特性将关键字插入到合适的位置,并可能进行节点的分裂和合并操作,以维持B树的平衡性。
删除操作:B树的删除操作也需要保持树的平衡性。当删除一个关键字时,需要根据B树的特性对节点进行合并和移动操作,以维持B树的平衡性。

class BTreeNode:def __init__(self, leaf=False):self.keys = []self.children = []self.leaf = leafclass BTree:def __init__(self, t):self.root = BTreeNode()self.t = tdef insert(self, key):if len(self.root.keys) == (2 * self.t) - 1:new_root = BTreeNode()new_root.children.append(self.root)self.split_child(new_root, 0)self.root = new_rootself._insert(self.root, key)def _insert(self, node, key):if node.leaf:i = 0while i < len(node.keys) and key > node.keys[i]:i += 1node.keys.insert(i, key)else:i = 0while i < len(node.keys) and key > node.keys[i]:i += 1if len(node.children[i].keys) == (2 * self.t) - 1:self.split_child(node, i)if key > node.keys[i]:i += 1self._insert(node.children[i], key)def split_child(self, parent, index):t = self.tchild = parent.children[index]new_child = BTreeNode(leaf=child.leaf)parent.keys.insert(index, child.keys[t - 1])parent.children.insert(index + 1, new_child)new_child.keys = child.keys[t:]child.keys = child.keys[:t - 1]if not child.leaf:new_child.children = child.children[t:]child.children = child.children[:t]def __str__(self):return self.print_tree(self.root)def print_tree(self, node, level=0):ret = ""if node:ret += self.print_tree(node.children[-1], level + 1)for i in range(len(node.keys) - 1, -1, -1):ret += "\n" + ("    " * level) + str(node.keys[i])ret += self.print_tree(node.children[i], level + 1)return ret# 测试
btree = BTree(2)
keys = [3, 7, 1, 4, 9, 2, 6, 5, 8]
for key in keys:btree.insert(key)
print(btree)

B树实现讲解:
BTreeNode类:定义了B树的节点类,包含关键字列表 keys 和子节点列表 children,以及一个标志位 leaf 表示是否为叶子节点。
BTree类:定义了B树类,包含了B树的插入操作 insert、节点分裂操作 split_child,以及辅助方法 _insert 和打印方法 print_tree。
insert方法:首先判断根节点是否已满,如果是则分裂根节点;然后调用辅助方法 _insert 插入关键字。
_insert方法:递归地在合适的位置插入关键字,并在需要时进行节点分裂。
split_child方法:分裂节点,将中间的关键字提升到父节点,并将节点分裂成两个节点。

B+树的实现思路
定义B+树节点类:B+树的节点需要存储索引信息和叶子节点指针。我们可以定义一个节点类,其中包含关键字列表、子节点列表和叶子节点指针。
插入操作:B+树的插入操作与B树类似,但是需要额外处理叶子节点之间的连接关系,以保持叶子节点形成的有序链表。
删除操作:B+树的删除操作也与B树类似,但是同样需要额外处理叶子节点之间的连接关系。

class BPlusTreeNode:def __init__(self, leaf=False):self.keys = []self.children = []self.next_leaf = None  # 指向下一个叶子节点self.leaf = leafclass BPlusTree:def __init__(self, t):self.root = BPlusTreeNode(leaf=True)self.t = tdef insert(self, key):if len(self.root.keys) == (2 * self.t) - 1:new_root = BPlusTreeNode()new_root.children.append(self.root)self.split_child(new_root, 0)self.root = new_rootself._insert(self.root, key)def _insert(self, node, key):if node.leaf:i = 0while i < len(node.keys) and key > node.keys[i]:i += 1node.keys.insert(i, key)else:i = 0while i < len(node.keys) and key > node.keys[i]:i += 1if len(node.children[i].keys) == (2 * self.t) - 1:self.split_child(node, i)if key > node.keys[i]:i += 1self._insert(node.children[i], key)def split_child(self, parent, index):t = self.tchild = parent.children[index]new_child = BPlusTreeNode(leaf=child.leaf)parent.keys.insert(index, child.keys[t - 1])parent.children.insert(index + 1, new_child)new_child.keys = child.keys[t:]child.keys = child.keys[:t - 1]if not child.leaf:new_child.children = child.children[t:]child.children = child.children[:t]def __str__(self):return self.print_tree(self.root)def print_tree(self, node, level=0):ret = ""if node:ret += self.print_tree(node.children[0], level + 1)for i in range(len(node.keys)):ret += "\n" + ("    " * level) + str(node.keys[i])ret += self.print_tree(node.children[i + 1], level + 1)return ret# 测试
bplustree = BPlusTree(2)
keys = [3, 7, 1, 4, 9, 2, 6, 5, 8]
for key in keys:bplustree.insert(key)
print(bplustree)

B+树实现讲解:
BPlusTreeNode类:定义了B+树的节点类,与B树节点类相似,但是多了一个指向下一个叶子节点的指针 next_leaf。
BPlusTree类:定义了B+树类,与B树类相似,但是插入和分裂操作需要额外处理叶子节点之间的连接关系。
insert方法:与B树的插入操作类似,但是需要在插入关键字时维护叶子节点之间的连接关系。
split_child方法:与B树的节点分裂操作类似,但是需要额外维护叶子节点之间的连接关系。

相关文章:

python实现B/B+树

python实现–顺序查找 python实现–折半查找 python实现–分块查找 python实现B/B树 B树和B树都是一种多路搜索树&#xff0c;用于对大量数据进行排序和查找。它们在数据库系统中被广泛应用&#xff0c;特别是用于构建索引结构。 B树&#xff08;B-Tree&#xff09; B树&…...

感觉捡到宝了!这究竟是哪位大神出的神器?

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…...

Vue教学17:Element UI基础组件上手,打造美观实用的Vue应用

大家好&#xff0c;欢迎回到我们的Vue教学系列博客&#xff01;在前十六篇博客中&#xff0c;我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定&#xff08;单向与双向&#xff09;、计算属性与侦听器、条件渲染和列…...

从政府工作报告探计算机行业发展(在医疗健康领域)

从政府工作报告探计算机行业发展 政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&…...

ElasticSearch学习篇10_Lucene数据存储之BKD动态磁盘树

前言 基础的数据结构如二叉树衍生的的平衡二叉搜索树通过左旋右旋调整树的平衡维护数据&#xff0c;靠着二分算法能满足一维度数据的logN时间复杂度的近似搜索。对于大规模多维度数据近似搜索&#xff0c;Lucene采用一种BKD结构&#xff0c;该结构能很好的空间利用率和性能。 …...

运维实习生 - 面经 - 游族网络

2024.3.5 Boss投递 2024.3.6 回复 2024.3.8过初筛 2024.3.13面试 确认候选人姓名 自我介绍 我看你更多是做数据分析的&#xff1f; 你是实习的时候才接触Linux&#xff1f; 软件工程不应该是往开发方面发展的吗&#xff1f; 你最近有做运维方面的工作吗&#xff0c;技术…...

SpringBoot接口添加IP白名单限制

实现流程&#xff1a; 自定义拦截器——注入拦截器——获取请求IP——对比IP是否一致——请求返回 文章背景&#xff1a; 接口添加IP白名单限制&#xff0c;只有规定的IP可以访问项目。 实现思路&#xff1a; 添加拦截器&#xff0c;拦截项目所有的请求&#xff0c;获取请求的…...

用postman进行web端自动化测试

前言 概括说一下&#xff0c;web接口自动化测试就是模拟人的操作来进行功能自动化&#xff0c;主要用来跑通业务流程。 主要有两种请求方式&#xff1a;post和get&#xff0c;get请求一般用来查看网页信息&#xff1b;post请求一般用来更改请求参数&#xff0c;查看结果是否正…...

基于Java+SpringBoot+vue+element疫情物资捐赠分配系统设计和实现

基于JavaSpringBootvueelement疫情物资捐赠分配系统设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringBootvueelement疫情物资捐赠…...

(差分)胡桃爱原石

琴团长带领着一群胡桃准备出征&#xff0c;进攻丘丘人&#xff0c;出征前&#xff0c;琴团长根据不同胡桃的战力&#xff0c;发放原石作为军饷&#xff0c;琴团长分批次发放&#xff0c;每批次会给连续的几个胡桃发放相同的原石&#xff0c;琴团长最后想知道给每个胡桃发放了多…...

二级Java程序题--01基础操作:源码大全(all)

目录 1.基本操作&#xff08;源代码&#xff09;&#xff1a; 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.30 1.31 1.32 1.33 1.34 1.…...

伪分布HBase的安装与部署

1.实训目标 &#xff08;1&#xff09;熟悉掌握使用在Linux下安装伪分布式HBase。 &#xff08;2&#xff09;熟悉掌握使用在HBase伪分布式下使用自带Zookeeper。 2.实训环境 环境 版本 说明 Windows 10系统 64位 操作电脑配置 VMware 15 用于搭建所需虚拟机Linux系统 …...

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习&#xff1a;计时和文件处理-给算法计时-上机代码 上机代码&#xff1a; # 基本扩展模块训练 给算法计时 def factorial(number): # 自定义一个计算阶乘的函数i 1result 1 # 变量 result 用来存储每个数的阶…...

Sqllab第一关通关笔记

知识点&#xff1a; 明白数值注入和字符注入的区别 数值注入&#xff1a;通过数字运算判断&#xff0c;1/0 1/1 字符注入&#xff1a;通过引号进行判断&#xff0c;奇数个和偶数个单引号进行识别 联合查询&#xff1a;union 或者 union all 需要满足字段数一致&…...

【Golang星辰图】图像和多媒体处理的创新之路:Go语言的无限潜能

图像处理、音视频编辑&#xff0c;Go语言不再局限&#xff1a;揭秘opencv和goav的威力 前言: 在当今的数字时代&#xff0c;图像处理和多媒体技术在各个领域中的应用越来越广泛。无论是计算机视觉、图像处理还是音视频处理&#xff0c;选择合适的库和工具至关重要。本文将介绍…...

MES管理系统中电子看板都有哪些类型?

随着工业信息化和智能制造的不断发展&#xff0c;MES管理系统已经成为现代制造业不可或缺的重要工具。MES管理系统通过集成和优化生产过程中的各个环节&#xff0c;实现对生产过程的实时监控、调度和管理&#xff0c;提高生产效率和质量。 在生产制造过程中&#xff0c;看板管…...

【Flutter 面试题】await for 如何使用?

【Flutter 面试题】await for 如何使用&#xff1f; 文章目录 写在前面解答补充说明完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&#xff0c;51…...

MongoDB聚合运算符:$dayOfWeek

$dayOfWeek返回日期中“星期”的部分&#xff0c;值的范围1-7&#xff0c;即Sunday~Saturday。 语法 { $dayOfWeek: <dateExpression> }参数说明&#xff1a; <dateExpression>为可被解析为Date、Timestamp或ObjectID的表达式<dateExpression>也可以是一个…...

Visual Studio单步调试中监视窗口变灰的问题

在vs调试中&#xff0c;写了这样一条语句 while((nfread(buf, sizeof(float), N, pf))>0) 然而&#xff0c;在调试中&#xff0c;只要一执行while这条语句&#xff0c;监视窗口中的变量全部变为灰色&#xff0c;不能查看&#xff0c;是程序本身并没有报错&#xff0c;能够继…...

【Selenium】selenium介绍及工作原理

一、Selenium介绍 用于Web应用程序测试的工具&#xff0c;Selenium是开源并且免费的&#xff0c;覆盖IE、Chrome、FireFox、Safari等主流浏览器&#xff0c;通过在不同浏览器中运行自动化测试。支持Java、Python、Net、Perl等编程语言进行自动化测试脚本编写。 官网地址&…...

深度学习结合CT图像预测岩石渗透率:从孔隙网络到升尺度计算

1. 项目概述&#xff1a;当深度学习遇见岩石CT图像 在油气勘探、地热开发乃至二氧化碳地质封存这些领域&#xff0c;我们这些从业者最头疼的问题之一&#xff0c;就是如何准确知道一块岩石的“透水能力”&#xff0c;也就是渗透率。传统上&#xff0c;我们依赖实验室岩心驱替实…...

全球首个通用智能人“通通“走向现实——具身智能落地的工程师视角

全球首个通用智能人"通通"走向现实——具身智能落地的工程师视角 工程师视角深度剖析 | 2026年5月24日 一、什么是"通通"&#xff1f;——先把这个概念说清楚 2026年初&#xff0c;北京通用人工智能研究院&#xff08;简称"通研院"&#xff09;…...

10分钟上手asc-tools:昇腾NPU算子开发工具集

前言 要做昇腾NPU算子开发&#xff0c;但不知道从哪入手&#xff1f;Ascend C代码写完了&#xff0c;不知道怎么编译、怎么调试、怎么验证&#xff1f;asc-tools就是为这个场景准备的。 asc-tools是昇腾官方提供的算子开发工具集&#xff0c;包含了编译工具&#xff08;ascen…...

StableSR vs 传统放大算法:为什么AI超分辨率效果更好?

StableSR vs 传统放大算法&#xff1a;为什么AI超分辨率效果更好&#xff1f; 【免费下载链接】sd-webui-stablesr StableSR for Stable Diffusion WebUI - Ultra High-quality Image Upscaler 项目地址: https://gitcode.com/gh_mirrors/sd/sd-webui-stablesr StableSR…...

AI Agent Harness Engineering 生态系统:基础设施、工具与应用层

AI Agent Harness Engineering 生态系统全解:基础设施、工具链与生产级应用落地 一、引言 钩子 你有没有过这样的经历:花了3天时间调好了一个支持多工具调用的AI Agent Demo,演示的时候能自动查订单、退运费、生成工单,效果惊艳到老板当场拍板要上线。结果真到生产环境跑…...

如何快速获取全网无损音乐:洛雪音乐音源完整使用指南

如何快速获取全网无损音乐&#xff1a;洛雪音乐音源完整使用指南 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 你是否经常遇到这样的困境&#xff1a;深夜想听一首歌&#xff0c;却发现版权分散…...

GCN vs MLP:在Cora数据集上,图神经网络到底强在哪?(附可视化对比)

GCN与MLP在Cora数据集上的本质差异&#xff1a;从特征聚合到空间重构的认知升级当我们面对学术文献分类任务时&#xff0c;传统机器学习方法往往将每篇文献视为独立个体进行处理。这种处理方式在Cora数据集上通常只能获得约50%的分类准确率&#xff0c;而图卷积网络(GCN)却能轻…...

CentOS服务器上VNC连接总出问题?这份保姆级排错手册(含端口混乱、服务重启、密码修改)

CentOS服务器VNC连接全流程排错指南&#xff1a;从端口混乱到服务恢复当你正埋头调试一个关键的仿真任务&#xff0c;突然VNC连接断开&#xff0c;所有工作界面瞬间消失——这种场景对使用CentOS服务器的工程师和科研人员来说绝不陌生。VNC作为远程桌面的生命线&#xff0c;一旦…...

Veo视频生成引擎深度集成方案(官方未公开的Webhook级联协议与跨平台帧同步技术首次披露)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Veo与其他AI视频工具整合 Veo 作为 Google 推出的高保真视频生成模型&#xff0c;其核心价值不仅体现在单点生成能力上&#xff0c;更在于与现有 AI 视频工作流的深度协同。它不追求封闭生态&#xff0c;而是通…...

BetterGI:解放双手的5大自动化场景终极解决方案

BetterGI&#xff1a;解放双手的5大自动化场景终极解决方案 【免费下载链接】better-genshin-impact &#x1f4e6;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自动烹饪…...