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树的节点分裂操作类似,但是需要额外维护叶子节点之间的连接关系。

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

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

相关文章

传统开发读写优化与HBase

目录: 一、传统开发数据读写性能优化 1. Mysql 分表、主从复制与读写分离 2. Redis(缓存型数据库)主从复制与读写分离 二、HBase 一、传统开发数据读写性能优化 1、Mysql 分表、主从复制与读写分离 mysql分库分表方案 一种分表方案&#xff1a;设置表A 表B 表A 自增列从1开始…

C语言中的UTF-8编码转换处理

C语言UTF-8编码的转换 1.C语言简介2.什么是UTF-8编码&#xff1f;2.1 UTF-8编码特点&#xff1a; 3.C语言中的UTF-8编码转换处理步骤1&#xff1a;获取UTF-8编码的字节流步骤2&#xff1a;解析UTF-8编码步骤3&#xff1a;Unicode码点转换为汉字 4.总结 1.C语言简介 C语言是一门…

js进阶-es6-作用域-垃圾回收机制-闭包-变量提升

1.作用域 作用域&#xff08;scope&#xff09;规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问。 作用域分为&#xff1a;局部作用域 全局作用域 1.1 局部作用域 局部作用域分为函数作用域和块作用域 1.函数作用域 &#xff1a; 在函数内部…

【面试精讲】Java线程6种状态和工作原理详解,Java创建线程的4种方式

Java线程6种状态和工作原理详解&#xff0c;Java创建线程的4种方式 目录 一、Java线程的六种状态 二、Java线程是如何工作的&#xff1f; 三、BLOCKED 和 WAITING 的区别 四、start() 和 run() 源码分析 五、Java创建线程的所有方式和代码详解 1. 继承Thread类 2. 实现…

【jvm】java对象占用内存问题深入解析

一个Java对象占用多大内存-CSDN博客 关于Object o new Object()追魂九连问&#xff08;个人学习笔记&#xff09; - 知乎JVM&#xff08;Java虚拟机&#xff09;-史上最全、最详细JVM笔记-CSDN博客

Node-RED在Linux二次开发网关中能源数据实时采集与优化

智能电网与分布式能源系统已成为推动绿色能源转型的重要载体。为了更好地应对多样化的能源供给与需求挑战&#xff0c;以及实现更高效的能源管理&#xff0c;Linux二次开发网关与Node-RED这一创新组合应运而生。 Linux二次开发网关作为高度定制化的硬件平台&#xff0c;其开源特…

【深入理解LRU Cache】:缓存算法的经典之作

目录 一、什么是LRU Cache&#xff1f; 二、LRU Cache的实现 1.JDK中类似LRUCahe的数据结构LinkedHashMap 2.自己实现双向链表 三、LRU Cache的OJ 一、什么是LRU Cache&#xff1f; LRU Cache&#xff08;Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0…

7-17 2个数由小到大

输入两个整数a、b&#xff0c;按照从小到大的顺序输出这两个数。 输入格式: 在一行中输入两个整数&#xff0c;之间用一个空格间隔&#xff0c;没有其它任何附加字符。 输出格式: 在一行中按照“a小的数,b大的数”的顺序输出&#xff0c;两个数原样输出&#xff0c;没有其它…

跨平台是什么意思?——跟老吕学Python编程

跨平台是什么意思&#xff1f;——跟老吕学Python编程 跨平台跨平台释义跨平台软件数据库管理系统(DBMS)&#xff1a;网站服务器、应用程序服务器&#xff1a;网络浏览器&#xff1a; 跨平台编程语言跨平台详细解说跨平台应用前景 跨平台 计算机领域术语 跨平台概念是软件开发中…

Zookeeper详解

1.Zookeeper概述 1.Zookeeper概念 Zookeeper是 Apache Hadoop 项目下的一个子项目&#xff0c;是一个树形目录服务 Zookeeper 翻译过来就是动物园管理员&#xff0c;他是用来管 Hadoop&#xff08;大象&#xff09;、Hive(蜜蜂)、Pig(小猪)的管理员。简称zk Hadoop: 存储海…

canvas实现水印逻辑分析

目录 效果图一、相关文档二、分析三、实现1、将水印文字转为水印图片2、给刚生成的水印图片加入旋转以及间隔&#xff08;1&#xff09;旋转位移&#xff08;2&#xff09;间隔位移&#xff08;3&#xff09;最后使用toDataURL导出为png图片 3、将生成的水印图片依次排布在需要…

C语言简单题(3)对输入数排序输出、斐波那契数组求和、求最小公倍数和最大公约数、数组行列对换、求矩阵最大值并输出最大值的行号和列号、杨辉三角形

/* 输入3个数&#xff0c;要求按从小到大输出 #include <stdio.h> int main(){ int a,b,c,temp; printf("请输入3个数&#xff08;以空格隔开&#xff09;&#xff1a;\n"); scanf("%d %d %d",&a,&b,&c); if(a>…

【Python数据结构与判断2/7】数据和判断小结

目录 序言 print() 变量 赋值 四种数据类型 字符串 格式化输出 四则运算 取整与取模 比较运算 逻辑运算 判断 if语句 if-else语句 if-elif-else语句 Tips 空值、0、非0非空值 实战案例 输入密码 短信模板 总结 序言 今天将对前面学过的内容进行一个复习小结…

python中的错误和异常

错误和异常 至此&#xff0c;本教程还未深入介绍错误信息&#xff0c;但如果您尝试过本教程前文中的例子&#xff0c;应该已经看到过一些错误信息。错误可&#xff08;至少&#xff09;被分为两种&#xff1a;语法错误 和 异常。 8.1. 语法错误 语法错误又称解析错误&#x…

科技引领品质:飞利浦智能锁“12年免费换新机”重塑行业新标杆

随着智能锁行业的竞争愈发火热&#xff0c;各大品牌在技术创新和服务升级方面不断推陈出新。售后服务的形态正发生深刻变化&#xff0c;从传统的保修维修到如今的技术支持、24小时在线客服等&#xff0c;各大品牌都在不断地提升售后服务水平&#xff0c;以创新的服务理念和先进…

配置与管理DNS服务器

配置与管理DNS服务器 **1&#xff0c;什么是DNS&#xff1f;**负责将域名转换成实际想对应的ip地址&#xff0c;这个过程交域名解析。 **2&#xff0c;域名解析的方法&#xff1a;**分布式&#xff0c;层次结构的数据库系统。根域&#xff0c;顶级域&#xff0c;二级域&#…

sql注入基础学习

1.常用SQL语句 01、显示数据库 show databases&#xff1b; 02、打开数据库 use db name&#xff1b; 03、显示数据表 show tables&#xff1b; 04、显示表结构 describe table_name&#xff1b; 05、显示表中各字段信息&#xff0c;即表结构 show columns from table_nam…

面向对象的编程语言是什么意思?——跟老吕学Python编程

面向对象的编程语言是什么意思&#xff1f;——跟老吕学Python编程 面向对象是什么意思&#xff1f;面向对象的定义面向对象的早期发展面向对象的背景1.审视问题域的视角2.抽象级别3.封装体4.可重用性 面向对象的特征面向对象的开发方法面向对象程序设计基本思想实现 面向对象的…

数据结构-稀疏数组

文章目录 1、什么是稀疏数组&#xff1f;2、稀疏数组的存储流程3、代码实现4、运行结果 1、什么是稀疏数组&#xff1f; 当一个数组中大部分元素为0&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 2、稀疏数组的存储流程 记录数组一共有几行…

活体检测(点头,摇头,张嘴等动态识别)

活体检测&#xff08;点头&#xff0c;摇头&#xff0c;张嘴等动态识别&#xff09; 某本书里有一句话&#xff0c;等我去读、去拍案。 田间的野老&#xff0c;等我去了解、去惊识。 山风与发&#xff0c;冷泉与舌&#xff0c; 流云与眼&#xff0c;松涛与耳&#xff0c; 他们等…