python 初始化数组_Python 树状数组(一)

给定一个数组,需要对数组的元素进行修改,并查询区间范围内的和。

乍一看,这是线段树嘛!

其实还有一种数据结构叫做树状数组,

树状数组这一数据结构能使得这两种操作的时间复杂度都是

关于树状数组,如果不够明白的话,可以看下面几篇文章:

树状数组(Binary Indexed Tree),看这一篇就够了​blog.csdn.net
9ab49c144183714a6e8ef594c22f5771.png
【数据结构】树状数组​www.jianshu.com
2c24ef014a8621e8e1809f71829d12e0.png

下面介绍树状数组的Python实现以及应用:

首先定义树状数组的 API:

  1. 初始化 传入一个长度为
    的初始数组,需要
    时间
  2. 函数 query(begin: int, end: int) -> int,查询数组
    的和
  3. 函数 update(idx: int, val: int),将初始数组的第
    位置更新为
    ,注意不是在第
    位置加上
class BinaryIndexTree:

    def __init__(self, array: list):
        '''初始化,总时间 O(n)'''
        self._array = [0] + array
        n = len(array)
        for i in range(1, n + 1):
            j = i + (i & -i)
            if j < n + 1:
                self._array[j] += self._array[i]

    def lowbit(self, x: int) -> int:
        return x & (-x)

    def update(self, idx: int, val: int):
        '''将原数组idx下标更新为val, 总时间O(log n)'''
        prev = self.query(idx, idx + 1)    # 计算出原来的值
        idx += 1
        val -= prev    # val 是要增加的值
        while idx < len(self._array):
            self._array[idx] += val
            idx += self.lowbit(idx)

    def query(self, begin: int, end: int) -> int:
        '''返回数组[begin, end) 的和'''
        return self._query(end) - self._query(begin)

    def _query(self, idx: int) -> int:
        '''计算数组[0, idx)的元素之和'''
        res = 0
        while idx > 0:
            res += self._array[idx]
            idx -= self.lowbit(idx)
        return res

在LeetCode中,有一道题就非常直接的考察了树状数组

力扣​leetcode-cn.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值