小白初理解樹狀陣列

2022-01-11 19:40:16 字數 767 閱讀 4397

樹狀陣列,是乙個查詢和修改複雜度都為log(n)的資料結構。主要用於查詢任意兩位之間的所有元素之和,但是每次只能修改乙個元素的值;經過簡單修改可以在log(n)的複雜度下進行範圍修改,但是這時只能查詢其中乙個元素的值。可以用一張圖來弄懂什麼是陣列陣列。

原陣列a[n],樹狀陣列c[n];

如果n為奇數:cn=an;

如果n為偶數:cn = a(n – 2^k + 1) + ... + an,k為n的二進位制數末尾0的個數。

可以用lowbit函式快速得到2^k,這裡用到了位運算,&是位運算子,不細說。

int lowbit(int t) 

該函式返回該樹狀陣列節點的管轄範圍,如c[6],帶入6返回值為2,c[6]=a[5]+a[6];

更新樹狀陣列函式update

void update(int x,int num) //修改樹狀陣列

}x是要更新的節點,n為樹狀陣列長度,num為修改的值,本函式將樹狀陣列c中所有包含a[x]的節點更新。本函式可用於陣列的修改,也可用於陣列的建立。

求和函式getsum

int getsum(int x) //求0-x的和

return s;

} 如果要求陣列m-n段的和可用getsum(n)-getsum(m);

有了以上三個函式最基本的樹狀陣列就成型了。。

再深入。。。。。

我也無能為力了。。。

樹狀陣列 小白

樹狀陣列 bit 是一種利用樹的2進製特徵進行檢索的樹狀結構。樹狀結構是一種奇妙的資料結構,不僅非常高效,而且 十分簡潔 比線段樹的 要短且更易理解,但是可以解決的問題也是有限的,沒有線段樹那麼廣泛 樹狀陣列就是用來 動態的求字首和 的時間複雜度在log n之內 一般來說就是兩個操作 1.單點修改 ...

樹狀陣列理解

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

樹狀陣列理解

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 再將其轉化為二進位製看...