[数据结构] 树状数组

树状数组是一种数据结构,常用于维护序列的前缀和,具有高效的单点修改和区间查询操作,复杂度为O(logn)。通过lowbit操作进行区间拆分,每个节点的和表示子树叶节点的值总和。除了基本操作,还能通过巧妙转化解决区间修改、单点查询的问题。
摘要由CSDN通过智能技术生成

前言

745 …

lowbit操作

对于 l o w b i t lowbit lowbit的定义为"非负整数 n n n在二进制表示下最低位的1及其后面所有的0"所构成的数值,例如:当 n = 12 n=12 n=12时, 12 = ( 1100 ) 2 12=(1100)_2 12=(1100)2,所以 l o w b i t ( 12 ) = ( 100 ) 2 = 4 lowbit(12)=(100)_2=4 lowbit(12)=(100)2=4

那么如何实现 l o w b i t lowbit lowbit操作呢?

先将n取反,此时第k为变为1,第0~k-1位变为1,再令n=n+1,此时第k为1,0 ~ k-1为0。

进行完上面的操作后,n的第 k + 1 k+1 k+1位恰好与原来相反所以 n & (   n + 1 ) n\&(~n+1) n&( n+1)仅有第k位为1。

因此: l o w b i t ( n ) = n   & (   n + 1 ) = n   & ( − n ) lowbit(n)=n\ \&(~n+1)=n\ \&(-n) lowbit(n)=n &( n+1)=n &(n)

听完概念,来举个例子:

对于整数12,它的二进制表示为 12 = ( 1100 ) 2 12=(1100)_2 12=(1100)2,将它取反变为 ( 0011 ) 2 (0011)_2 (0011)2,加1变为 ( 0100 ) 2 (0100)_2 (0100)2,可以观察到此时的二进制数为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值