代码与动画 FENWICK TREE · BIT
树状数组.
利用 lowbit 管理累计区间,实现单点增量与前缀查询。
更新 / 查询 O(log n)空间 O(n)下标从 1 开始
原理与执行逻辑
树状数组用 lowbit 决定每个累计块覆盖的区间。更新时访问所有包含该位置的块,查询时把前缀拆成互不重叠的块相加。
执行步骤
- 使用从 1 开始的下标,计算 lowbit(i) = i & -i。
- 单点增加 delta 时更新 bit[i],再令 i += lowbit(i) 继续向上。
- 查询前缀时累加 bit[i],再令 i -= lowbit(i) 向前跳。
- 查询闭区间 [l, r] 可使用 sum(r) - sum(l - 1)。
关键理解
bit[i] 保存 [i - lowbit(i) + 1, i] 的和。更新方向寻找覆盖当前点的更大块,查询方向移除已计入的块;下标 0 不参与更新。
简短示例
bit[6] 覆盖 [5,6],bit[4] 覆盖 [1,4],因此 sum(6) = bit[6] + bit[4];更新位置 5 会依次影响 5、6、8。
代码与执行动画
STEP 0 / 0function build(values) { const bit = Array(values.length + 1).fill(0); for (let i = 1; i <= values.length; i++) { for (let j = i; j < bit.length; j += j & -j) bit[j] += values[i - 1]; } return bit;}上行 a · 下行 BITlowbit(i) = i & -i
当前数据正在操作已访问 / 命中标记 / 指针
0
当前结构
选择操作,观察对应代码和状态变化。
操作当前结构
操作结果会用于下一次操作;重置结构恢复初始数据。
树状数组的操作规则
上行是原数组,下行是 BIT;bit[i] 覆盖 [i - lowbit(i) + 1, i]。更新跳到 i + lowbit(i),查询跳到 i - lowbit(i)。
对应题目与扩展练习
观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。
题目为赋值更新;先计算新旧值之差,再执行 BIT 单点增量。