樹狀陣列理解

2021-09-23 20:52:03 字數 903 閱讀 2021

c[i]代表 子樹的葉子結點的權值之和

如圖可以知道

c[1]=a[1];

c[2]=a[1]+a[2];

c[3]=a[3];

c[4]=a[1]+a[2]+a[3]+a[4];

c[5]=a[5];

c[6]=a[5]+a[6];

c[7]=a[7];

c[8]=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8];

再將其轉化為二進位製看一下:

c[1] = c[0001] = a[1];

c[2] = c[0010] = a[1]+a[2];

c[3] = c[0011] = a[3];

c[4] = c[0100] = a[1]+a[2]+a[3]+a[4];

c[5] = c[0101] = a[5];

c[6] = c[0110] = a[5]+a[6];

c[7] = c[0111] = a[7];

c[8] = c[1000] = a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8];

對照式子可以發現  c[i]=a[i-2^k+1]+a[i-2^k+2]+......a[i];(這其實就是乙個找規律,找陣列c等於什麼) (k為i的二進位制中從最低位到高位連續零的長度)例如i=8(1000)時,k=3;

c[8] = a[8-2^3+1]+a[8-2^3+2]+......+a[8]

開篇就說了,lowbit(x)是取出x的最低位1;具體操作為

int lowbit(x)
lowbit(x)=上面的2^k;

樹狀陣列理解

無意間看到樹狀陣列,查了很多資料被各種圖和公式繞暈了,下面記錄一點個人理解。假設陣列a 0 a 1 a 2 a n 記0 m元素之和為sum m 0 當我們頻繁的求s m 時,第一種方法不適用,當我們頻繁的修改陣列a時,第二種方法每次都要修改陣列s,修改陣列s的時間複雜度為o n 而樹狀陣列可以很好...

樹狀陣列原理解析

我們知道,對長度為n的陣列,如果我們要改變其中某個值,則時間複雜度為o 1 如果要求出s m a 1 a 2 a m 則需要o m 的時間複雜度。若我們一邊修改陣列的值,一邊要求求出其部分和s m 使用一般的方法,時間複雜度是o m n 的,若m和查詢次數n很大,那麼該演算法將不可取。為了解決這個問...

深入理解樹狀陣列

先上模板 單點更新const int n 1003 int n int a n void update int i,int d intgetsum int i 區間更新const int n 1003 int n int a n void update int i,int d intgetsum i...