1. 程式人生 > >資料結構————樹狀陣列

資料結構————樹狀陣列

原陣列--->字首和------>範圍和

原陣列更改陣列元素在求和效率較低,引入樹狀陣列

假設原陣列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;
}