1 树状数组介绍
功能
提供动态区间查询,即区间查询,单点修改,时间复杂度均为O(log n)
原理
核心知识说明
-
lowbit计算
lowbit(x) 表示x 将最右边为1的二进制所表示的数字(最低有效位),比如:6(110)的lowbit(6) = 2(10),计算方法如下
-
假设tr为一个数组,长度要比实际元素个数大1,第一位不用,tr[x] 表示 nums[x - lowbit(x) + 1] + … nums[x]之和,即:
-
根据x如何计算其左兄弟位置(左兄弟表示同一个父节点下其左边的一个兄弟,用于计算前缀和)即:
-
根据x如何计算父节点,(单点更新的时候需要,往上更新所有的父节点)
-
根据父节点 x 计算其下面所有的直系子节点(不包括nums[i])
-
tr[x]的值实际上是其所有的直系子节点以及nums[i]上的值汇聚而来的
代码实现
class BinaryIndexTree:
def __init__(self, nums):
self.tree = [0] *<