/**
原始数组下标从0开始,
bitTree数组下标从1开始,目的是为了符合lowbit操作,lowbit可以理解为构造新数组的一种方法(比较直观简单的理解)
**/
public class BITDemo {
int[] nums;
int[] bitree;
int n;
public BITDemo(int[] _nums){
this.nums = _nums;
this.n = nums.length;
bitree = new int[this.n+1];
// 构造出bitTree
for(int i=0;i<n;i++){
add(i+1, nums[i]);
}
}
public int lowBit(int x){
return x&(-x);
}
// 单点更新,新增值!将新增的值累加到父节点上
public void add(int index, int increase){
for(int i=index;i<=n;i+=lowBit(i)){
bitree[i]+=increase;
}
}
// 单点修改,将某个位置的值修改为 value
public void update(int index, int value){
// 核心就是利用add来增加差值
add(index, value-nums[index-1]);
nums[index-1] = value;
}
// 查询前缀和
public int query(int index){
int res = 0;
for(int i=index;i>0;i-=lowBit(i)){
res+=bitree[i];
}
return res;
}
// 查询区间和
public int range(int left, int right){
return query(right)-query(left);
}
public static void main(String[] args) {
// 所有的操作都是打在bitTree 上
int[] nums = new int[]{2,3,5,1,4,2,1};
BITDemo bitDemo = new BITDemo(nums);
System.out.println(bitDemo.query(2)); //5
System.out.println(bitDemo.query(5)); //15
System.out.println(bitDemo.range(2, 5)); //10
bitDemo.update(1,1); // 1 将1位置重置为1
System.out.println(bitDemo.query(1));//1
bitDemo.add(1,10); // 将1位置加10
System.out.println(bitDemo.query(1)); //11
}
}
树状数组-Java代码纯享版
最新推荐文章于 2024-04-11 19:03:28 发布
本文介绍了一个使用位树(Bit Tree)的数据结构,展示了如何在BITDemo类中进行数组的单点更新、查询和区间和计算。通过实例演示了如何利用lowBit方法构造BitTree,并运用add和update方法进行高效数据操作。
摘要由CSDN通过智能技术生成