資料結構————樹狀陣列
阿新 • • 發佈:2018-11-10
原陣列--->字首和------>範圍和
原陣列更改陣列元素在求和效率較低,引入樹狀陣列
假設原陣列A【】 樹狀陣列C【】
樹狀陣列 的三種操作:
1.lowbit() 子葉數(二進位制最低位的1代表多少)
程式碼實現:
int lowbit(int n)
{
return x&(-x);
}
求:lowbit(x) returnx&(-x)
2.
update()// A[i]+k 假設A【i】是原陣列C[i]為樹狀陣列,改變A【i】個更新C[i] update(i,k) ; c[i]=c[i]+k;//首先更新從c【i】本身,然後更新它的父節點 i=i+lowbit(i);//更新c[i]的父節點 i<=n;//下一步 迴圈update()更新所有的父節點,直到滿足截止條件i<=n
程式碼實現:
/*樹狀陣列支援單點操作,對某個數A【x】加上y,同時正確維護序列的字首和*/
void update(int x,int y)
{
for(;x<=N;x+=x&-x)
c[x]+y;
}
3.sum()利用樹狀陣列求原陣列的字首和
sum(i);//表示從A【1】一直加到A[i]
ans=c[i]+ans;
i=i-lowbit(i);//迴圈
i>0;//迴圈截止的條件
如:求區間【l~r】的和
sum(k)-sum(l-1);
程式碼實現:
樹狀陣列支援查詢字首和,即序列A~x個數的和 int sum(int x) { int ans; for(;x-=x&-x) ans-=c[x]; return ans; }