上次听强哥讲完之后没怎么复习过,趁着放假时间多赶紧看看
核心代码有三:
一, 核心lowbit函数,得到一个数的二进制最低位的1,代码很简单,但是是最核心的代码
int lowbit(int x)
{
return x & (-x);
}
例如10的二进制是1010,返回值应该为2即二进制的10
二,求和函数getsum
int getsum(int x)
{
int sum = 0;
while(x > 0)
{
sum += c[x];
x -= lowbit(x);
}
return sum;
}
例如求前12个元素的和,模拟一下,应该是
sum = 0, x = 12
sum += c[12], x -= 4, x = 8
sum += c[8], x -= 8, x = 0
然后x == 0 时结束循环
三, 更新元素的函数update
void update(int x, int num)
{
while(x <= n)
{
c[x] += num;
x += lowbit(x);
}
}
在数组某个元素进行更新的时候效率很高,只要更新包含变动元素的c[]数组即可,先更新该元素,然后不断向上更新
树状数组与二进制有着密不可分的联系,理解起来并不困难,代码实现也比较容易,效率也是相当的高
试着去找题做一做