树状数组/差分数组/线段树/莫队算法介绍

1 树状数组介绍

功能

提供动态区间查询,即区间查询,单点修改,时间复杂度均为O(log n)

原理

树状数组

核心知识说明

  • lowbit计算
    lowbit(x) 表示x 将最右边为1的二进制所表示的数字(最低有效位),比如:6(110)的lowbit(6) = 2(10),计算方法如下
    lowbit(x) = x & (- x)

  • 假设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] *<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东皇太星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值