数据结构编程实践20讲(Python版)—12树状数组

embedded/2024/10/15 4:25:15/

本文目录

    • 12 树状数组(Binary Indexed Tree / Fenwick Tree)
      • S1 说明
      • S2 示例
      • S3 问题1:二维树状数组的单点更新和区域求和
      • S4 问题2:求解逆序数对
      • S5 问题3:动态求解第 K 小(大)数
      • S6 问题4:频率计数和排名查询
      • S7 问题5:求解最长递增子序列问题

往期链接

01 数组02 链表03 栈04 队列05 二叉树06 二叉搜索树07 AVL树08 红黑树09 B树10 B+树
11 线段树

12 树状数组(Binary Indexed Tree / Fenwick Tree)

S1 说明

树状数组是一种可以高效处理 动态数组前缀和 的数据结构。它支持在 O ( l o g n ) O(log n) O(logn)的时间复杂度内进行单点更新和区间前缀和查询。树状数组利用了数字的二进制表示,通过构建一个辅助数组,使得每个位置存储一段区间的累加信息。它通过巧妙地设计索引之间的关系,实现了高效的更新和查询操作。

树状数组的构建

树状数组以数组的形式实现,但逻辑上可以视为一棵树。对于数组 B I T [ 1... n ] : BIT[1...n]: BIT[1...n]

  • 索引 i i i 的父节点: i + l o w b i t ( i ) i + lowbit(i) i+lowbit(i)
  • 索引 i i i 的子节点: i − l o w b i t ( i ) i - lowbit(i) ilowbit(i)

其中, l o w b i t ( i ) lowbit(i) lowbit(i)表示 i i i 在二进制表示下最低位的1所代表的值,即 i & ( − i ) i \& (-i) i&(i)

复杂度

  • 时间复杂度:单点更新 O ( l o g n ) O(log n) O(logn);前缀和查询 O ( l o g n ) O(log n) O(logn)
  • 空间复杂度 O ( n ) O(n) O(n),需要一个额外的数组存储树状数组。

特点

  • 实现简单: 树状数组的实现相对简单,易于理解和编程。
  • 效率高: 在一些需要频繁更新和查询前缀和的场景下,表现出高效的性能。
  • 功能专一: 相较于线段树,树状数组功能较为专一,主要用于处理前缀和问题。

应用领域

  • 数组前缀和问题:快速计算数组的前缀和,支持动态更新。
  • 区间求和问题:通过前缀和的差,计算任意区间的和。
  • 逆序数计算:在求解数组中的逆序对数量时,利用树状数组可以高效计算。
  • 算法竞赛:在各种需要动态处理前缀和的竞赛题中,树状数组是常用的数据结构

S2 示例

python">class BinaryIndexedTree:def __init__(self, size):"""初始化树状数组:param size: 数组的大小"""self.size = sizeself.tree = [0] * (self.size + 1)  # 使用 1-based 索引def lowbit(self, x):"""计算 x 的最低位 1 所代表的值"""return x & (-x)def update(self, i, delta):"""在位置 i 增加 delta:param i: 更新的位置(1-based index):param delta: 增加的值"""while i <= self.size:self.tree[i] += deltai += self.

http://www.ppmy.cn/embedded/127688.html

相关文章

进程相关及守护进程

一、进程 1.1 wait / waitpid 函数的使用 #include <sys/types.h> #include <sys/wait.h>pid_t wait(int *wstatus); 功能&#xff1a;阻塞等待子进程结束&#xff0c;为子进程回收资源 参数&#xff1a;wstatus&#xff1a;子进程退出的状态--如果不关注&#x…

STT python

1. 安装所需库 我们需要安装这两个库&#xff0c;在命令行中运行以下命令&#xff1a; pip install SpeechRecognition pyaudio2. 使用 SpeechRecognition 库 SpeechRecognition 是一个 Python 库&#xff0c;用于将语音转换为文本&#xff0c;以下是一个简单的示例&#xf…

什么是联邦学习

想象一下&#xff0c;你有很多朋友&#xff0c;每个人手里都有一些自己的秘密&#xff08;数据&#xff09;&#xff0c;比如你的购物习惯、你的健身记录、你的阅读习惯等。这些秘密对你和你的朋友来说都很重要&#xff0c;你不想直接告诉其他人&#xff0c;但你又想从大家的信…

2024-10-14 商业分析-消费者权益维护和投诉相关-机械革命拒绝售后维修-记录

摘要: 考虑到商业环境基本都是各种坑蒙拐骗以次充好&#xff0c;在这个社会环境中&#xff0c;保护好自己的合法权益是重中之重。 拒不进行售后行为: 机械革命投诉电话通话录音记录资源-CSDN文库 3815862机械革命电脑检测报告(2).pdf资源-CSDN文库 消费者权益投诉平台: 一. 全…

vue中watch的用法

在 Vue.js 中&#xff0c;watch 是一个用于侦听和响应数据变化的选项。它常用于监听组件数据&#xff08;包括 props 和 data 中的值&#xff09;的变化&#xff0c;并在值发生变化时执行自定义逻辑。 基本用法 watch 选项接受一个对象&#xff0c;其中键是你想要侦听的变量&…

地图箭头方向检测系统源码分享

地图箭头方向检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Docker exec bash -c 使用详解与 Python 封装示例

简介&#xff1a;docker exec 是 Docker 的一个实用命令&#xff0c;允许在正在运行的容器中执行命令。通过 bash -c 选项&#xff0c;可以执行复杂的命令串。 历史攻略&#xff1a; go&#xff1a;远程执行系统命令 Python&#xff1a;subprocess模块 Python-subprocess激…

【docker】mysql8.0 的 docker 安装

安装 指定mysql 的安装版本8.0.18 拉取镜像 docker pull mysql:8.0。18创建目录 mkdir -p /opt/docker_volumn/mysql/conf mkdir -p /opt/docker_volumn/mysql/log mkdir -p /opt/docker_volumn/mysql/data mkdir -p /opt/docker_volumn/mysql/mysql-files此步骤是为了将容…