二維樹狀數組

二維樹狀數組

  • 二維樹狀數組
    二維樹狀數組實質上是一維樹狀數組的擴充。

    二維樹狀數組的定義爲: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) 是橙色框中的子矩陣的元素之和
    在這裏插入圖片描述

  • 更高維度的樹狀數組同二維樹狀數組的原理是一樣的,在實現時,只是層次嵌套的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章