Skip to content

Fenwick 树

Fenwick tree · Binary indexed tree

用二进制最低位分解维护动态前缀聚合,支持单点更新与前缀查询的对数时间数据结构。

条目类型
模型

形式陈述

a1,,an 取值于阿贝尔群 (G,,0)。Fenwick 树用数组 t[i] 保存长度

lowbit(i)=i&(i)

的后缀块

t[i]=ailowbit(i)+1ai.

前缀查询从 i 开始反复执行 iilowbit(i),按访问到的互不重叠块聚合;点增量 ajajΔ 则反复执行 jj+lowbit(j),把 Δ 合入所有包含该位置的块。两者访问 O(logn) 个槽,空间为 O(n)

由两个前缀可恢复区间聚合。加法记号下是 PrPl1;抽象群记号下是 Pl11Pr。标准点增量实现依赖交换性:Δ 在块内位于何处不再重要。

直觉

二进制最低位把每个前缀唯一拆成少量对齐块。查询向左删除当前最低位,恰好取出最后一个完整块;更新向右增加最低位,恰好枚举所有把该位置包含在其后缀块中的节点。它是一棵隐式树,父子关系编码在索引位模式中。

与线段树不同,Fenwick 树没有为每个区间保存显式左右孩子。紧凑布局换来更窄的操作接口:标准版本擅长可交换的点增量与前缀聚合,不自动支持任意非交换更新或复杂区间标签。

Fenwick 树的隐式区间与操作路径
例子与边界

长度 8 时,节点 6=(110)2 保存区间 [5,6],节点 8 保存 [1,8]。查询前缀 7 访问 7,6,4,对应 [7,7],[5,6],[1,4];这些块互不重叠且并为 [1,7]。更新位置 3 访问 3,4,8

若要把位置 j 赋成新值 v,可在阿贝尔群中先求 Δ=aj1v,再执行点增量;实现还需知道旧值或通过查询恢复。只有交换幺半群而无逆元时,前缀查询可能仍有受限变体,但任意赋值与区间相减不再由标准接口保证。

对非交换群,块聚合有固定数组顺序,而把同一 Δ 直接合到块摘要的一端通常不能表示“在块中间修改一个元素”。存在针对特定操作的改造,并不使普通 BIT 成为任意群数据结构。区间最小值只在单调更新等受限场景有专门版本。

推论与应用

Fenwick 树实现动态前缀聚合、频数表、逆序对计数和顺序统计。利用一个或两个树配合差分,可支持区间加与点查询、区间加与区间和;这些公式都依赖相应阿贝尔群与索引边界。

线段树只需幺半群即可维护有序区间聚合,并能通过更丰富节点摘要处理非交换操作;代价是更大的常数与显式树形分解。二者的 O(logn) 不代表代数前提和支持操作相同。

参考资料
  • Peter M. Fenwick, “A New Data Structure for Cumulative Frequency Tables,” Software: Practice and Experience 24(3), 1994, pp. 327–336.
  • Thomas H. Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, discussion of cumulative frequency structures.
  • OI-Wiki contributors, “Fenwick Tree,” 2026.
关系图谱9 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

实现的抽象

并列辨析