Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用Python编写B+树的删除操作代码_创想鸟

使用Python编写B+树的删除操作代码

b+树删除操作需要先找到删除节点的位置,然后判断节点的键数。

如果节点中的键数量超过了最小数量,直接删除即可。

如下图,删除“40”:

Python代码实现B+树删除操作

如果节点中有确切的最小键数,删除就需要从兄弟节点那里借用,将兄弟节点的中间键添加到父节点。如下图,删除“5”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

删除内容节点,如果节点中的键数超过最小数量,只需从叶节点中删除该键,并从内部节点中删除该键。用中序后继填充内部节点中的空白区域。如下图,删除“45”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

删除内容节点,如果节点中有确切的最小键数,则删除该键并直接从兄弟节点借用一个键,用借来的键填充索引中的空白空间。如下图,删除“35”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

删除内容节点,在父节点上方生成空白空间。删除键后,将空白空间与其兄弟节点合并,用中序后继填充父节点中的空白空间。如下图,删除“25”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

导致树高度会缩小的删除操作,如下图,删除“55”:

立即学习“Python免费学习笔记(深入)”;

Python代码实现B+树删除操作

立即学习“Python免费学习笔记(深入)”;

Python实现B+树删除操作

import math# 创建节点class Node:    def __init__(self, order):        self.order = order        self.values = []        self.keys = []        self.nextKey = None        self.parent = None        self.check_leaf = False# 插入叶子    def insert_at_leaf(self, leaf, value, key):        if (self.values):            temp1 = self.values            for i in range(len(temp1)):                if (value == temp1[i]):                    self.keys[i].append(key)                    break                elif (value < temp1[i]):                    self.values = self.values[:i] + [value] + self.values[i:]                    self.keys = self.keys[:i] + [[key]] + self.keys[i:]                    break                elif (i + 1 == len(temp1)):                    self.values.append(value)                    self.keys.append([key])                    break        else:            self.values = [value]            self.keys = [[key]]# B+树class BplusTree:    def __init__(self, order):        self.root = Node(order)        self.root.check_leaf = True    # 插入节点    def insert(self, value, key):        value = str(value)        old_node = self.search(value)        old_node.insert_at_leaf(old_node, value, key)        if (len(old_node.values) == old_node.order):            node1 = Node(old_node.order)            node1.check_leaf = True            node1.parent = old_node.parent            mid = int(math.ceil(old_node.order / 2)) - 1            node1.values = old_node.values[mid + 1:]            node1.keys = old_node.keys[mid + 1:]            node1.nextKey = old_node.nextKey            old_node.values = old_node.values[:mid + 1]            old_node.keys = old_node.keys[:mid + 1]            old_node.nextKey = node1            self.insert_in_parent(old_node, node1.values[0], node1)    def search(self, value):        current_node = self.root        while(current_node.check_leaf == False):            temp2 = current_node.values            for i in range(len(temp2)):                if (value == temp2[i]):                    current_node = current_node.keys[i + 1]                    break                elif (value  parentNode.order):                    parentdash = Node(parentNode.order)                    parentdash.parent = parentNode.parent                    mid = int(math.ceil(parentNode.order / 2)) - 1                    parentdash.values = parentNode.values[mid + 1:]                    parentdash.keys = parentNode.keys[mid + 1:]                    value_ = parentNode.values[mid]                    if (mid == 0):                        parentNode.values = parentNode.values[:mid + 1]                    else:                        parentNode.values = parentNode.values[:mid]                    parentNode.keys = parentNode.keys[:mid + 1]                    for j in parentNode.keys:                        j.parent = parentNode                    for j in parentdash.keys:                        j.parent = parentdash                    self.insert_in_parent(parentNode, value_, parentdash)    # 删除节点    def delete(self, value, key):        node_ = self.search(value)        temp = 0        for i, item in enumerate(node_.values):            if item == value:                temp = 1                if key in node_.keys[i]:                    if len(node_.keys[i]) > 1:                        node_.keys[i].pop(node_.keys[i].index(key))                    elif node_ == self.root:                        node_.values.pop(i)                        node_.keys.pop(i)                    else:                        node_.keys[i].pop(node_.keys[i].index(key))                        del node_.keys[i]                        node_.values.pop(node_.values.index(value))                        self.deleteEntry(node_, value, key)                else:                    print("Value not in Key")                    return        if temp == 0:            print("Value not in Tree")            return    # 删除条目    def deleteEntry(self, node_, value, key):        if not node_.check_leaf:            for i, item in enumerate(node_.keys):                if item == key:                    node_.keys.pop(i)                    break            for i, item in enumerate(node_.values):                if item == value:                    node_.values.pop(i)                    break        if self.root == node_ and len(node_.keys) == 1:            self.root = node_.keys[0]            node_.keys[0].parent = None            del node_            return        elif (len(node_.keys) < int(math.ceil(node_.order / 2)) and node_.check_leaf == False) or (len(node_.values)  0:                        PrevNode = parentNode.keys[i - 1]                        PrevK = parentNode.values[i - 1]                    if i < len(parentNode.keys) - 1:                        NextNode = parentNode.keys[i + 1]                        PostK = parentNode.values[i]            if PrevNode == -1:                ndash = NextNode                value_ = PostK            elif NextNode == -1:                is_predecessor = 1                ndash = PrevNode                value_ = PrevK            else:                if len(node_.values) + len(NextNode.values) < node_.order:                    ndash = NextNode                    value_ = PostK                else:                    is_predecessor = 1                    ndash = PrevNode                    value_ = PrevK            if len(node_.values) + len(ndash.values) < node_.order:                if is_predecessor == 0:                    node_, ndash = ndash, node_                ndash.keys += node_.keys                if not node_.check_leaf:                    ndash.values.append(value_)                else:                    ndash.nextKey = node_.nextKey                ndash.values += node_.values                if not ndash.check_leaf:                    for j in ndash.keys:                        j.parent = ndash                self.deleteEntry(node_.parent, value_, node_)                del node_            else:                if is_predecessor == 1:                    if not node_.check_leaf:                        ndashpm = ndash.keys.pop(-1)                        ndashkm_1 = ndash.values.pop(-1)                        node_.keys = [ndashpm] + node_.keys                        node_.values = [value_] + node_.values                        parentNode = node_.parent                        for i, item in enumerate(parentNode.values):                            if item == value_:                                p.values[i] = ndashkm_1                                break                    else:                        ndashpm = ndash.keys.pop(-1)                        ndashkm = ndash.values.pop(-1)                        node_.keys = [ndashpm] + node_.keys                        node_.values = [ndashkm] + node_.values                        parentNode = node_.parent                        for i, item in enumerate(p.values):                            if item == value_:                                parentNode.values[i] = ndashkm                                break                else:                    if not node_.check_leaf:                        ndashp0 = ndash.keys.pop(0)                        ndashk0 = ndash.values.pop(0)                        node_.keys = node_.keys + [ndashp0]                        node_.values = node_.values + [value_]                        parentNode = node_.parent                        for i, item in enumerate(parentNode.values):                            if item == value_:                                parentNode.values[i] = ndashk0                                break                    else:                        ndashp0 = ndash.keys.pop(0)                        ndashk0 = ndash.values.pop(0)                        node_.keys = node_.keys + [ndashp0]                        node_.values = node_.values + [ndashk0]                        parentNode = node_.parent                        for i, item in enumerate(parentNode.values):                            if item == value_:                                parentNode.values[i] = ndash.values[0]                                break                if not ndash.check_leaf:                    for j in ndash.keys:                        j.parent = ndash                if not node_.check_leaf:                    for j in node_.keys:                        j.parent = node_                if not parentNode.check_leaf:                    for j in parentNode.keys:                        j.parent = parentNode# 输出B+树def printTree(tree):    lst = [tree.root]    level = [0]    leaf = None    flag = 0    lev_leaf = 0    node1 = Node(str(level[0]) + str(tree.root.values))    while (len(lst) != 0):        x = lst.pop(0)        lev = level.pop(0)        if (x.check_leaf == False):            for i, item in enumerate(x.keys):                print(item.values)        else:            for i, item in enumerate(x.keys):                print(item.values)            if (flag == 0):                lev_leaf = lev                leaf = x                flag = 1record_len = 3bplustree = BplusTree(record_len)bplustree.insert('5', '33')bplustree.insert('15', '21')bplustree.insert('25', '31')bplustree.insert('35', '41')bplustree.insert('45', '10')printTree(bplustree)if(bplustree.find('5', '34')):    print("Found")else:    print("Not found")

以上就是使用Python编写B+树的删除操作代码的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/88605.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
抖音直播间管理员可以拉黑人吗?主播把你设置为管理员什么意思
上一篇 2025年11月18日 00:17:22
海尔智能制造:先夺中国第一  又夺全球第一
下一篇 2025年11月18日 00:19:24

相关推荐

  • 大润发优鲜如何邀请新用户

    你可以通过生成个人专属的邀请链接来参与大润发优鲜的“邀请有礼”活动。在App内找到相关入口后,系统会为你生成唯一的邀请链接。将这个链接通过微信、QQ、短信或其他社交渠道分享给朋友或家人,一旦对方点击链接并完成大润发优鲜App的下载与注册,你就能获得平台发放的奖励,例如购物优惠券或积分,而新用户通常也…

    2026年9月21日
    000
  • WordPress插件定制:使用Filter Hook修改邮件通知接收者

    本教程将指导您如何在WordPress中利用Filter Hook定制插件行为,特别是修改第三方插件的邮件通知接收者。我们将详细讲解如何识别目标Filter、理解其参数,并正确编写回调函数来拦截或修改数据,以实现自定义的邮件发送逻辑,避免因参数不匹配导致的错误。 WordPress Hook机制概览…

    2026年9月21日
    100
  • JavaScript中的模块联邦如何实现微前端的代码共享?

    模块联邦通过运行时动态加载实现微前端代码共享,无需打包公共依赖。使用 ModuleFederationPlugin 配置 name、remotes、exposes 和 shared,使应用可暴露或引入远程模块,支持组件、工具函数及状态管理共享,提升复用性并减少冗余。 模块联邦通过在构建时让不同应用直…

    2026年9月21日
    200
  • 天眼查app怎么看一个公司的法院判决书_天眼查公司法院判决书查询

    通过天眼查App可查询公司法律纠纷详情。首先登录并搜索企业名称进入主页,再点击“法律诉讼”板块查看案件列表,最后筛选已结案案件并点击查看裁判文书获取判决书全文,部分敏感信息可能不予展示。 如果您想了解一家公司涉及的法律纠纷详情,查阅其法院判决书是重要的途径之一。天眼查App整合了公开的司法信息,可以…

    2026年9月21日
    000
  • Linux interfaces 虚拟网络类型了解01

    Linux interfaces 虚拟网络类型了解01Linux interfaces 虚拟网络类型了解01Linux interfaces 虚拟网络类型了解01Linux interfaces 虚拟网络类型了解01

    在osi模型的定义中,数据链路层和物理层,以及传输层和网络层执行的任务在概念上相似:它们都提供了数据传输的方式,即沿着特定路径将数据从源点传输到目的地的方法。然而,数据链路层和物理层负责跨物理路径的通信服务,而传输层和网络层则提供由多个数据链路组成的逻辑路径或虚拟路径的通信服务。 Bridge操作指…

    2026年9月21日 • 用户投稿
    100
  • iPhone声音小如何解决

    确认音量是否被调低 第一步,检查iPhone的音量是否被误调至最低。可以通过按压手机左侧的音量加减键,观察屏幕上的音量条是否处于合理范围。同时留意是否启用了静音模式——手机左侧的静音开关若拨到静音位置(显示橙色),声音会明显变小甚至无声,将其拨回非静音状态即可恢复正常。 清洁扬声器孔 扬声器出声孔被…

    2026年9月21日
    000
  • win10连接打印机错误0x00000709怎么办_win10打印机连接错误修复方法

    错误代码0x00000709通常因权限不足、系统更新冲突或服务异常导致共享打印机连接失败。可使用专业工具一键修复,或通过修改注册表权限、卸载KB5005569等特定更新、重启Print Spooler及相关服务,以及添加Windows凭据(如IP地址和guest账户)解决该问题。 当您在Window…

    2026年9月21日
    200
  • 升级X86架构性能大提升!极空间Z2 Ultra图赏

    升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏

    10月23日,极空间正式推出全新双盘位nas产品——极空间z2 ultra,官方售价为1899元,参与国家补贴后仅需1457元,性价比进一步提升。 此次发布的Z2 Ultra最大的亮点在于采用X86架构处理器,相较以往使用的ARM平台,性能实现飞跃式提升,运行速度显著加快。更重要的是,新架构对Doc…

    2026年9月21日 • 用户投稿
    300
  • 数据库分库分表(Sharding)策略

    在现代应用程序中,随着数据量的增长,单一数据库的性能和容量往往难以满足需求。这时,数据库分库分表(Sharding)策略就成了一个关键的解决方案。那么,如何设计和实现一个有效的分库分表策略呢?让我们深入探讨一下。 在我的职业生涯中,我曾多次参与大型项目的数据库优化,其中分库分表是常见的挑战之一。我记…

    2026年9月21日
    000
  • 如何备份VSCode的全部设置和扩展?

    备份VSCode全部设置和扩展需保存配置文件与扩展目录;2. 配置文件位于各系统指定路径的User文件夹内,包含settings.json和keybindings.json;3. 通过code –list-extensions导出扩展列表并用xargs批量重装可恢复扩展;4. 推荐直接复…

    2026年9月21日
    100
  • Laravel 8 登录后重定向到仪表盘的全面指南

    本文深入探讨了 Laravel 8 中用户登录后重定向到仪表盘的多种策略。我们将详细解析默认的重定向机制,包括 LoginController 和 RedirectIfAuthenticated 中间件,并重点介绍如何通过自定义登录逻辑实现精确的重定向控制,同时提供示例代码和常见问题排查建议,确保用…

    2026年9月21日
    100
  • iPhone 17如何设置隐私共享限制

    答案:通过设置隐私权限、关闭iCloud同步、退出家人共享及限制锁屏访问,可有效保护iPhone数据隐私。具体包括管理相机、麦克风、定位等权限,关闭不必要的iCloud数据同步,退出家庭共享群组,停用跨App内容共享,并在锁屏时禁用控制中心与通知预览,防止信息泄露。 虽然目前还没有iPhone 17…

    2026年9月21日
    500
  • Guava Multimap:高效获取并打印指定键的所有关联值

    guava multimap是处理一键多值映射关系的强大工具。要获取特定键的所有关联值,应直接使用其提供的`multimap#get(k)`方法。该方法会返回一个包含所有匹配值的`collection`,即使键不存在,也会返回一个空集合而非`null`,从而简化了值检索和空值处理逻辑,是比手动迭代键…

    2026年9月21日
    100
  • 控制台命令(Console Command)开发

    控制台命令是程序员日常工作中不可或缺的工具,它提高了开发效率并帮助理解和控制程序运行。1) 通过简单的文本输入,完成复杂任务,如文件管理和系统监控。2) 控制台命令可用于快速调试、测试代码和自动化重复工作。3) 开发控制台命令时需注意安全性和兼容性问题。4) 控制台命令可实现有趣功能,如监控服务器资…

    2026年9月21日
    200
  • 如何在抖音有赞中查询订单号?——详解操作步骤

    文章正文: 一、抖音有赞简介 抖音有赞是由抖音与有赞科技联合推出的电商服务工具,专为商家提供一站式的销售管理解决方案。通过这一平台,商家能够高效处理商品上架、订单管理等环节,消费者也能便捷地查看自己的购买记录和订单状态。 二、订单号查询方法 启动抖音应用,切换至底部导航中的“我”,然后选择“已购”入…

    2026年9月21日
    100
  • 怎样配置VSCode与Jest、Cypress等测试框架进行集成测试?

    首先安装Jest和Cypress插件及依赖,配置jest.config.js和.vscode/settings.json实现Jest自动运行,再通过launch.json添加Cypress调试配置,最后在package.json中定义统一脚本命令,使两者在VSCode中高效协同工作。 要在 VSCo…

    2026年9月21日
    000
  • 实测!Sora 2长视频优势大,Vidu Q2细节处理更胜一筹

    近日,AI视频工具领域的竞争愈发激烈。OpenAI推出的Sora 2刚刚登顶美区App Store榜单,国产新秀Vidu Q2便携重磅升级版本强势入局,引发广泛关注。不少从事自媒体创作与影视剪辑的朋友都在思考:这两款AI视频生成器,究竟谁更胜一筹?出于好奇,我亲自上手实测了一番,发现两者之间的差异更…

    用户投稿 2026年9月21日
    100
  • 自定义协议与主流框架(如ThinkPHP)结合

    在thinkphp中实现自定义协议可以通过中间件机制。具体步骤包括:1. 创建中间件类customprotocolmiddleware,解析和验证请求的json格式和字段。2. 在应用配置文件中添加该中间件,使所有请求经过处理。通过这种方式,可以满足特定业务需求并提升应用的灵活性和可扩展性。 在开发…

    2026年9月21日
    000
  • mac怎么阻止特定app访问网络_Mac阻止应用访问网络方法

    可通过系统防火墙、hosts文件、第三方工具或pf防火墙阻止应用联网。首先,macOS内置防火墙可阻断入站连接,需在“系统设置-网络-防火墙”中添加应用并启用阻止;其次,编辑/etc/hosts文件,将目标域名指向127.0.0.1可屏蔽其网络访问,需刷新DNS缓存生效;再者,使用Little Sn…

    2026年9月21日
    100
  • JSF应用中Markdown文档动态链接处理指南

    本教程旨在解决jsf web应用程序中集成markdown文档时,如何动态处理内部链接以实现页面局部更新的问题。通过结合服务器端markdown渲染和客户端javascript事件监听,我们可以拦截markdown生成的html链接点击事件,利用ajax异步加载并渲染目标markdown文件,从而在…

    2026年9月21日
    600

发表回复

登录后才能评论
关注微信