二維樹狀數組
-
二維樹狀數組
二維樹狀數組實質上是一維樹狀數組的擴充。
二維樹狀數組的定義爲:C[x] [y] = ∑ a[i][j] , (x -= lowbit(x), y -= lowbit(y), 1≤ i ≤x, 1≤ j ≤y) 。
當 x=1 時,就變成了 C[1] [y] = ∑ a[1][j] , ( y -= lowbit(y), 1≤ j ≤y) 。通過固定 x 的值,就將二維樹狀數組降到了一維樹狀數組。
所以,二維樹狀數組,在固定一個維度時,在另一個維度上看,就是一個一維樹狀數組,所以說二維樹狀數組是基於一維樹狀數組的,僅僅是增添了一維,在實現的時候嵌套進去就可以了,還是比較容易理解的。
下面看一下實現。 -
更新
void add(int x, int y, int d){ //x,y分別是一維和二維,d是要加上或者減去的數 int yy = y; while(x<=MAX){ y = yy; while(y<=MAX){ tree[x][y] += d; y += lowbit(y); } x += lowbit(x); }
建立初始的樹狀數組,實質上就是不斷調用 add() 函數,從而完成初始化。
-
查詢
int sum(int x, int y){ int sum = 0, yy = y; while(x>0){ y = yy; while(y>0){ sum += tree[x][y]; y -= lowbit(y); } x -= lowbit(x); } return sum; }
二維樹狀數組的查詢,查詢的是一個子矩陣,如下圖:
sun(5, 5) 是橙色框中的子矩陣的元素之和
-
更高維度的樹狀數組同二維樹狀數組的原理是一樣的,在實現時,只是層次嵌套的問題。