樹狀陣列可以擴充到二維。
問題:乙個由數字構成的大矩陣,能進行兩種操作
1) 對矩陣裡的某個數加上乙個整數(可正可負)
2) 查詢某個子矩陣裡所有數字的和,要求對每次查詢,輸出結果。
一維樹狀陣列很容易擴充套件到二維,在二維情況下:陣列a的樹狀陣列定義為:
c[x][y] = ∑ a[i][j], 其中,
x-lowbit(x) + 1 <= i <= x,
y-lowbit(y) + 1 <= j <= y.
例:舉個例子來看看c的組成。
設原始二維陣列為:
a=,
, , };
那麼它對應的二維樹狀陣列c呢?
記: b[1]= 這是第一行的一維樹狀陣列
b[2]= 這是第二行的一維樹狀陣列
b[3]= 這是第三行的一維樹狀陣列
b[4]= 這是第四行的一維樹狀陣列
那麼:
c[1][1]=a11,c[1][2]=a11+a12,c[1][3]=a13,c[1][4]=a11+a12+a13+a14,c[1][5]=a15,c[1][6]=a15+a16,...
這是a第一行的一維樹狀陣列
c[2][1]=a11+a21,c[2][2]=a11+a12+a21+a22,c[2][3]=a13+a23,c[2][4]=a11+a12+a13+a14+a21+a22+a23+a24,
c[2][5]=a15+a25,c[2][6]=a15+a16+a25+a26,...
這是a陣列第一行與第二行相加後的樹狀陣列
c[3][1]=a31,c[3][2]=a31+a32,c[3][3]=a33,c[3][4]=a31+a32+a33+a34,c[3][5]=a35,c[3][6]=a35+a36,...
這是a第三行的一維樹狀陣列
c[4][1]=a11+a21+a31+a41,c[4][2]=a11+a12+a21+a22+a31+a32+a41+a42,c[4][3]=a13+a23+a33+a43,...
這是a陣列第一行+第二行+第三行+第四行後的樹狀陣列
搞清楚了二維樹狀陣列c的規律了嗎? 仔細研究一下,會發現:
(1)在二維情況下,如果修改了a[i][j]=delta,則對應的二維樹狀陣列更新函式為:
void update(int x, int y, int a)
}}
(2)在二維情況下,求子矩陣元素之和∑ a[i][j](前i行和前j列)的函式為
int sum(int x, int y)
}return ret;
}int query(int x1, int y1, int x2, int y2)
比如:sun(1,1)=c[1][1]; sun(1,2)=c[1][2]; sun(1,3)=c[1][3]+c[1][2];...
sun(2,1)=c[2][1]; sun(2,2)=c[2][2]; sun(2,3)=c[2][3]+c[2][2];...
sun(3,1)=c[3][1]+c[2][1]; sun(3,2)=c[3][2]+c[2][2];
int lowbit(int x)
void update(int x, int y, int a)
}}int sum(int x, int y)
}return ret;
}int query(int x1, int y1, int x2, int y2)
二維陣列new小結
a ga n new a m n delete ga 缺點 n必須是已知 優點 呼叫直觀,連續儲存,程式簡潔 經過測試,析構函式能正確呼叫 a ga new a m for int i 0 i m i ga i new a n for int i 0 i m i delete ga i delete...
zt 二維陣列new小結
轉至水木清華 1.a ga n new a m n delete ga 缺點 n必須是已知 優點 呼叫直觀,連續儲存,程式簡潔 經過測試,析構函式能正確呼叫 2.a ga new a m for int i 0 i m i ga i new a n for int i 0 i m i delete ...
C 中二維陣列new小結
二維陣列new小結 轉至水木清華 1.a ga n new a m n delete ga 缺點 n必須是已知 優點 呼叫直觀,連續儲存,程式簡潔 經過測試,析構函式能正確呼叫 2.a ga new a m for int i 0 i m i ga i new a n for int i 0 i m...