树状数组的索引设计:lowbit 不是魔法,是二进制规律的直接推论

发布时间:2026/7/13 14:19:05
树状数组的索引设计:lowbit 不是魔法,是二进制规律的直接推论 树状数组的索引设计lowbit 不是魔法是二进制规律的直接推论一、lowbit 的魔法公式你只会背吗初学树状数组Fenwick Tree时最先要背的就是lowbit(x) x -x。这个公式看起来像黑魔法为啥 x 和 -x 做按位与就能得到最低位的 1 所代表的数值大多数题解到此为止——记住就行用就完了。但如果面试时被追问一句为什么这样设计能保证前缀和查询是 O(log n) 的只靠背公式是不够的。这篇文章会从二进制补码和索引规律出发推导出 lowbit 的数学来源进而解释为什么树状数组的单点更新和区间查询都是 O(log n)。flowchart TB A[树状数组 BIT] -- B[核心操作1: lowbit x] B -- C[x -x x 的最低位 1 代表的数] C -- D[索引规律] D -- E[BIT1 管理 a1] D -- F[BIT2 管理 a1,a2] D -- G[BIT4 管理 a1..a4] D -- H[BIT8 管理 a1..a8] E -- I[前缀和: 不断减 lowbit] F -- I G -- I H -- I I -- J[sum(7) BIT7 BIT6 BIT4] K[单点更新: 不断加 lowbit] -- L[update(3) → BIT3, BIT4, BIT8]二、lowbit 的二进制本质计算机使用补码表示负数。-x 的计算方式是将 x 按位取反后加 1-x ~x 1。例如 x 12二进制 1100。x 按位取反0011。加 10100。x -x 1100 0100 0100 4。lowbit(12) 4确实等于最低位 1 代表的数值二进制的 100。为什么这个按位与恰好能取到最低位的 1因为取反操作让低位全部变为 1加 1 后低位产生进位——这个进位会一直传播到第一个 0这个 0 恰好就是原来最低位 1 的位置。结果是x和-x只有这一位是公共的 1所以按位与后只保留这一位。树状数组的索引结构。BIT[i] 管理的区间长度 lowbit(i)。具体来说BIT[i] a[i - lowbit(i) 1] ... a[i]。例如 BIT[6] a[5] a[6]lowbit(6) 2BIT[4] a[1] a[2] a[3] a[4]lowbit(4) 4。前缀和查询不断减 lowbit。sum(7) BIT[7] BIT[6] BIT[4]。分解过程7 → lowbit(7)1 → 66 → lowbit(6)2 → 44 → lowbit(4)4 → 0。每次减掉 lowest bit 1最多 O(log n) 步。单点更新不断加 lowbit。更新 a[3] 需要更新 BIT[3]、BIT[4]、BIT[8]... 因为 lowbit(3)1 → 314lowbit(4)4 → 448。每一步都将最低位 1 进位到更高位。三、树状数组的完整实现与使用场景 树状数组Fenwick Tree——完整实现 功能单点更新 区间查询 应用场景逆序对计数、动态维护前缀和、离线二维偏序 from typing import List class FenwickTree: 树状数组 所有索引从 1 开始内部自动处理 为什么索引从 1 开始lowbit(0) 0会导致死循环。 def __init__(self, n: int): n: 数组长度 为什么数组大小是 n1索引 0 不使用 避免 lowbit(0) 0 导致的无限循环。 self.n n self.tree [0] * (n 1) staticmethod def lowbit(x: int) - int: 计算 x 的 lowbit 为什么用 x -x在补码表示下 -x ~x 1。x 与 ~x1 的按位与 恰好等于 x 中最低位 1 代表的数值。 lowbit(6) 2: 6 110₂, -6 ...1010₂, 110 010 010 2 lowbit(4) 4: 4 100₂, -4 ...1100₂, 100 100 100 4 return x -x def add(self, idx: int, delta: int): 单点更新在位置 idx 增加 delta 更新所有覆盖 idx 的 BIT 节点。 为什么不断加 lowbit BIT[idx] 同时被 BIT[idx lowbit(idx)] 覆盖 BIT[idx lowbit(idx)] 又进一步被更上级覆盖。 这个链就是更新路径。 时间复杂度O(log n) while idx self.n: self.tree[idx] delta idx self.lowbit(idx) def prefix_sum(self, idx: int) - int: 前缀和a[1] a[2] ... a[idx] 为什么不断减 lowbit BIT[idx] 覆盖 [idx - lowbit(idx) 1, idx] 区间。 sum(idx) BIT[idx] sum(idx - lowbit(idx)) 时间复杂度O(log n) result 0 while idx 0: result self.tree[idx] idx - self.lowbit(idx) return result def range_sum(self, left: int, right: int) - int: 区间和a[left] ... a[right] 利用前缀和相减sum(right) - sum(left - 1) return self.prefix_sum(right) - self.prefix_sum(left - 1) # 应用 1逆序对计数 def count_inversions(arr: List[int]) - int: 用树状数组统计逆序对 时间复杂度O(n log n) 空间复杂度O(n) —— 需要离散化 为什么适合用树状数组 从左到右遍历每个元素查询已出现的比它大的元素数 这个查询本质上是区间和BIT 可以 O(log n) 完成。 # 离散化将元素值映射到 [1, n] 范围 # 为什么需要离散化BIT 的索引需要是连续的 # 而原数组的值范围可能很大 sorted_unique sorted(set(arr)) rank {val: i 1 for i, val in enumerate(sorted_unique)} n len(sorted_unique) bit FenwickTree(n) inversions 0 # 从右到左遍历统计比当前元素小的已遍历元素数 # 另一种等价写法从左到右统计已遍历的比当前元素大的 for val in reversed(arr): r rank[val] # 查询 [1, r-1] 的和比 val 小的元素数 inversions bit.prefix_sum(r - 1) # 将当前元素加入 BIT bit.add(r, 1) return inversions # 应用 2利用 BIT 实现动态第 k 小查询 class FenwickTreeWithKth(FenwickTree): 支持查询第 k 小元素的树状数组 场景动态维护有序序列支持插入、删除和查询中位数 def kth(self, k: int) - int: 查询第 k 小的元素k 从 1 开始 为什么可以用倍增法 BIT 天然支持前缀和查询。 通过二分 BInary lifting 技术 可以 O(log n) 找到第 k 个 1 的位置。 idx 0 # 找到最大的 2 的幂次≤ n bit_mask 1 (self.n.bit_length() - 1) while bit_mask 0: next_idx idx bit_mask if next_idx self.n and self.tree[next_idx] k: # 跳过这块区间 k - self.tree[next_idx] idx next_idx bit_mask 1 # idx 指向第 k 个元素的前一个位置 return idx 1 # 测试 if __name__ __main__: # 基本测试 arr [3, 1, 4, 1, 5, 9, 2, 6] bit FenwickTree(len(arr)) for i, val in enumerate(arr, 1): bit.add(i, val) print(f原数组: {arr}) print(f[1,3] 区间和: {bit.range_sum(1, 3)}) # 314 8 print(f[4,6] 区间和: {bit.range_sum(4, 6)}) # 159 15 # 逆序对测试 test_arr [5, 2, 6, 1] print(f\n数组 {test_arr} 的逆序对数: {count_inversions(test_arr)}) # (5,2), (5,1), (2,1), (6,1) 4四、树状数组 vs 线段树的选型边界选择树状数组的场景只需要单点更新 前缀和/区间和查询代码行数有严格限制BIT 的实现通常不到 20 行内存有压力BIT 的空间是 O(n)线段树是 O(4n)必须选线段树的场景需要区间更新 区间查询BIT 可以通过差分做但代码变复杂需要维护区间最值BIT 不支持求最值因为减 lowbit 会丢失信息需要多种操作的组合如区间加 区间求和 区间最大常数因子的差异。BIT 在相同复杂度下的常数因子远小于线段树。BIT 的更新和查询都是简单的 while 循环和位运算而线段树需要递归或手动维护栈。在 10^6 级别的数据上这个差异可能是十几毫秒和几百毫秒的区别。五、总结lowbit 不是魔法它是二进制补码和进位规则的直接推论。理解了x -x为什么恰好等于最低位 1 的值树状数组的整个索引体系就自然揭示了BIT[i] 覆盖 [i-lowbit(i)1, i]前缀和就是不断减 lowbit更新就是不断加 lowbit。树状数组是精巧的工程实现的典范。它只用了数组和位运算就实现了 O(log n) 的前缀和与更新操作。它的简洁背后是对二进制规律的深刻理解——理解了这个规律你不仅能写出树状数组还能在面试中解释它为什么正确。

相关新闻

嵌入式系统电源管理:MAX77654与PIC32MX795F512L实战

嵌入式系统电源管理:MAX77654与PIC32MX795F512L实战

1. 项目背景与核心需求 在嵌入式系统设计中,电源管理一直是决定产品可靠性和能效表现的关键环节。随着物联网设备的普及和便携式电子产品对续航要求的不断提高,开发人员面临着三大核心挑战:如何在有限空间内实现多电压域供电、如何优化动态功…

发布时间:2026/7/13 14:18:29
南阳河南网站建设价格到底多少?别被忽悠了,内行人才说的实话

南阳河南网站建设价格到底多少?别被忽悠了,内行人才说的实话

本文关键词:南阳河南网站建设价格很多老板一听到建站,第一反应就是问:多少钱?这问题真没法直接回。因为报价从几百到几万都有,差距太大了。你以为是同一样东西,其实完全是两码事。我在南阳做这行也有些年头了。见过太多客户被坑。花几千块买了个模板,结果后期想改个颜色…

发布时间:2026/7/13 14:17:52
马鞍山网站建设文:别被忽悠,本地老板做网站到底该花多少钱

马鞍山网站建设文:别被忽悠,本地老板做网站到底该花多少钱

找外包公司做网站,最怕遇到啥?怕你不懂行,怕对方把简单的事情复杂化,最后收你几万块,给你个全是模板的烂摊子。我前阵子帮一个在马鞍山开建材店的老哥看方案,对方报价八千,说包含SEO优化、响应式设计、后台管理啥都有。我打开一看,好家伙,整个站就是套了个现成的WordP…

发布时间:2026/7/13 14:17:57
教学成果展示网站 课程体系建设:别被那些光鲜亮丽的PPT骗了,真实数据才不撒谎

教学成果展示网站 课程体系建设:别被那些光鲜亮丽的PPT骗了,真实数据才不撒谎

说实话,刚接手这个烂摊子的时候,我整个人是崩溃的。之前那个所谓的“专家”团队做的课程体系建设方案,厚厚一沓,PPT做得比电影海报还精美,满篇都是“赋能”、“闭环”、“底层逻辑”。结果呢?落地执行的时候,老师们连教案都写不利索,学生上课睡觉率高达百分之四十。这哪…

发布时间:2026/7/13 15:25:26
别被忽悠了!付网站建设费如果做账?这3个坑我替你踩遍了

别被忽悠了!付网站建设费如果做账?这3个坑我替你踩遍了

很多老板花大几万建站,最后发现连个发票都开不出来,或者做账时根本没法抵扣。这篇直接告诉你建站费怎么入账、能抵多少税,以及怎么跟财务沟通才能不被坑。先说个真事。上个月有个做餐饮的朋友找我,说公司刚花8万块做了个官网,财务说这笔钱不能直接进成本,得摊销。他急得跳…

发布时间:2026/7/13 15:24:02
别瞎转悠了,辛集市住房和城乡建设局网站才是办事真神

别瞎转悠了,辛集市住房和城乡建设局网站才是办事真神

本文关键词:辛集市住房和城乡建设局网站说实话,以前办事儿,我是真烦那排队排到腿软的滋味。尤其是涉及到房子、装修、或者公司搞建筑资质这些事儿。跑断腿,问破嘴,最后还得回来重新补材料。那种感觉,就像是被耍猴一样,心里憋屈得慌。直到后来,我琢磨透了,发现有个地方…

发布时间:2026/7/13 15:23:17
网站建设注意哪些:别被忽悠,这5个坑我踩过才懂

网站建设注意哪些:别被忽悠,这5个坑我踩过才懂

网站建设注意哪些?说实话,这问题问得真挺扎心。我见过太多老板,拿着几万块的预算,最后拿到一个连手机都打不开的网页。更气人的是,对方还跟你说这是“高端定制”。高端?我看是高端忽悠吧。今天我不讲那些虚头巴脑的理论。我就用我这几年的血泪经验,跟你聊聊网站建设注意…

发布时间:2026/7/13 15:23:08
深度解析:企业建设营销网站的目的是什么,别再只把它当电子名片了

深度解析:企业建设营销网站的目的是什么,别再只把它当电子名片了

很多老板在刚接触官网建设时,第一反应往往是:“我就想要个能看的公司介绍,显得正规点就行。”这种想法很普遍,但也正是导致网站沦为“网络摆设”的根本原因。今天咱们不聊虚的,就实实在在聊聊,企业建设营销网站的目的是什么?它到底该怎么用,才能帮企业真正赚到钱或提升…

发布时间:2026/7/13 15:23:08
别教学生只会画页面!网站建设课程教学改革,让毕业即失业变毕业即上岗

别教学生只会画页面!网站建设课程教学改革,让毕业即失业变毕业即上岗

看着满屏的代码,学生眼神是空洞的。企业HR翻着简历,眉头是紧锁的。这中间的鸿沟,咋填?这篇文不整虚的,直接告诉你怎么把课堂变成工地。咱们说点大实话。现在的网站建设课程,太“干净”了。教室里有空调,屏幕里没bug。学生敲完代码,项目完美运行。然后呢?毕业。入职第一…

发布时间:2026/7/13 15:22:45
别瞎忙!贵州省住房和城乡建设厅网站报名网实操避坑指南

别瞎忙!贵州省住房和城乡建设厅网站报名网实操避坑指南

很多建筑人,一到报名季就慌。总觉得官网复杂,不敢点。其实,真没你想的那么难。只是细节太多,容易踩坑。我在这行干了八年。见过太多人因为一个小失误,白忙活一年。今天不整虚的。直接说点干货。先说最关键的:时间。很多人以为提前两天报名就行。大错特错。去年有个学员,…

发布时间:2026/7/13 0:00:05
北辰手机网站建设避坑指南:别被低价忽悠,这几点才是硬道理

北辰手机网站建设避坑指南:别被低价忽悠,这几点才是硬道理

说实话,刚入行那会儿,我也觉得做个手机网站跟玩似的。 找个模板,填填图,完事。 直到上个月,帮个北辰本地的老客户改网站,我才彻底醒过脑来。 那哥们儿之前为了省事儿,找了个几百块的“速成”网站。 结果呢?打开慢得像蜗牛,排版在手机上一塌糊涂。 客户投诉电话都快打爆…

发布时间:2026/7/13 0:00:37
网站建设怎么搭建服务器:新手避坑指南与真实成本拆解

网站建设怎么搭建服务器:新手避坑指南与真实成本拆解

这篇内容直接告诉你建站服务器怎么选、怎么配、怎么省钱,读完就能动手操作,不再被忽悠。别再去听那些云里雾里的技术术语,咱们只聊落地能用的干货。解决你从0到1搭建网站最头疼的硬件和配置问题。很多刚入行或者想自己折腾网站的朋友,一听到“搭建服务器”这几个字就头大。…

发布时间:2026/7/13 0:02:04
别装了,你的学院网站建设推进会就是场大型尴尬现场

别装了,你的学院网站建设推进会就是场大型尴尬现场

看着后台那点可怜的访问量,你急不急?方案改了八版,还是没人看。今天这文,只说怎么把会开成,把事做成。上周去隔壁职院蹭会,那场面,真叫一个窒息。会议室里坐满了人,领导在台上讲PPT,底下的人不是在玩手机,就是在发呆。投影仪闪了两下,灭了。没人去修,接着讲。这种会…

发布时间:2026/7/13 2:35:37
七彩建设集团官方网站怎么找?避坑指南与真实体验分享

七彩建设集团官方网站怎么找?避坑指南与真实体验分享

找官网找得头大?这篇直接告诉你怎么辨别真伪,别被假网站坑了钱。昨天半夜两点,我还在电脑前盯着屏幕,心里那个急啊。家里装修刚进场,工长突然说需要确认一份材料清单,说是七彩建设那边要求的。我手忙脚乱地打开浏览器,搜了一堆“七彩建设”,结果出来一堆广告,什么“七…

发布时间:2026/7/13 0:10:45
找可信赖的龙岗网站建设公司?别踩坑,看这几点就够

找可信赖的龙岗网站建设公司?别踩坑,看这几点就够

做企业,网站就是脸面。 在龙岗,想找个靠谱的网站公司,真不容易。 市面上广告满天飞。 承诺得天花乱坠。 最后交付的东西,却让人想砸电脑。 今天不聊虚的。 只聊怎么避坑。 怎么找到真正可信赖的龙岗网站建设团队。先说个大实话。 别信什么“三天上线”。 那是骗小白的。 正…

发布时间:2026/7/13 8:40:50
建站7年才悟出的网站建设思路,别再花冤枉钱了

建站7年才悟出的网站建设思路,别再花冤枉钱了

做建站这行整整7年了。 见过太多老板花几万块, 最后做出来的网站像个垃圾场。 今天不整那些虚头巴脑的术语。 就聊聊我踩过的坑, 和真正能落地的网站建设思路。很多老板一上来就问: “多少钱能做个高大上的?” 我通常直接劝退。 因为方向错了, 你给再多钱也是打水漂。 真正…

发布时间:2026/7/11 8:50:55
合肥的网站建设避坑指南:别被低价忽悠,这3个细节决定生死

合肥的网站建设避坑指南:别被低价忽悠,这3个细节决定生死

做企业官网最怕什么?不是技术难,是交钱后没人管,或者上线一个月连个访客都没有。这篇东西不扯虚的,直接告诉你怎么在合肥找个靠谱的团队,或者自己怎么避坑。先说个大实话,我在合肥混这行五年多,见过太多老板因为贪便宜吃大亏。你去百度搜“合肥的网站建设”,出来一堆报…

发布时间:2026/7/10 18:05:06
别被忽悠了!德州网站建设那些坑,我拿真金白银换来的教训

别被忽悠了!德州网站建设那些坑,我拿真金白银换来的教训

做这行久了,心里就憋着一股火。每次看到客户拿着网上抄来的模板,问我能不能做成“苹果官网”那种效果。我就想笑。真的,太想笑了。今天咱不整那些虚头巴脑的专业术语。就聊聊德州网站建设里,那些让人头秃的真实事儿。我有个客户,老张。他是做德州本地建材的,实在人。当初…

发布时间:2026/7/13 2:08:03