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

Python 树状数组

树状数组(Binary Indexed Tree, BIT),又称为斐波那契堆,是一种数据结构,用于高效地解决以下问题:

  1. 单点更新:在数组的某个位置增加或减少一个值。
  2. 区间查询:查询数组中一段连续区间的元素之和。

树状数组的核心思想是使用一个数组来存储原数组的累积和,然后利用数组的偏移来快速计算区间和。这种数据结构在时间复杂度上具有优势,对于单点更新和区间查询,它们的时间复杂度都是 (O(\log n))。

以下是 Python 中实现树状数组的基本操作的示例代码:

class BinaryIndexedTree:def __init__(self, size):self.size = sizeself.tree = [0] * (size + 1)def _parent(self, index):while index > 1:index -= index & -indexreturn indexdef update(self, index, delta):while index <= self.size:self.tree[index] += deltaindex += self._parent(index)def query(self, index):result = 0while index > 0:result += self.tree[index]index -= self._parent(index)return result# 使用示例
bit = BinaryIndexedTree(10)
bit.update(1, 5)  # 将索引1的值增加5
bit.update(3, 7)  # 将索引3的值增加7print(bit.query(4))  # 查询索引1到4的和,应为12

在这个例子中,BinaryIndexedTree 类有三个方法:

  • __init__:初始化树状数组。
  • update:在数组的指定索引位置增加一个值。
  • query:查询从1到指定索引位置的累积和。

请注意,树状数组通常从索引1开始,而不是0,这与 Python 中列表的索引方式不同。如果你需要从0开始,可以在调用 updatequery 方法时,将索引减1。

相关文章:

  • Elasticsearch 认证模拟题 - 8
  • 正则限制字符串的长度必须是n的倍数
  • c++替换字符或字符串函数
  • 【爬虫】使用Python爬取百度学术页面的标题、作者、摘要和关键词
  • 详解大模型微调数据集构建方法(持续更新)
  • ant design form表单动态增减表单项Form.List选中Select值后更新相关联Select选项
  • 你使用过哪些性能分析工具来优化Java程序?
  • spring 事务隔离级别
  • [手游] 口袋妖怪肉鸽宝可梦肉鸽
  • 烧写uboot、linux镜像、根文件系统到开发板
  • 数据挖掘--引论
  • 基于zyyo主页与無名の主页合并二改,一款适合新手的个人主页
  • c++ 简单的日志类 CCLog
  • SpringMVC:拦截器(Interceptor)
  • Python | 排队取奶茶
  • 【RocksDB】TransactionDB源码分析
  • C# 免费离线人脸识别 2.0 Demo
  • express.js的介绍及使用
  • javascript面向对象之创建对象
  • Magento 1.x 中文订单打印乱码
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • yii2权限控制rbac之rule详细讲解
  • 关于for循环的简单归纳
  • 我的面试准备过程--容器(更新中)
  • 一个SAP顾问在美国的这些年
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 转载:[译] 内容加速黑科技趣谈
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (zt)最盛行的警世狂言(爆笑)
  • (二十六)Java 数据结构
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)setTimeout 和 setInterval 的区别
  • (转)shell调试方法
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)一些感悟
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net 4.0并行库实用性演练
  • .net core 6 集成和使用 mongodb
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .net 发送邮件
  • .net和jar包windows服务部署
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [《百万宝贝》观后]To be or not to be?
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [4]CUDA中的向量计算与并行通信模式