二維陣列小結

2021-06-19 04:29:18 字數 1833 閱讀 3031

樹狀陣列可以擴充到二維。

問題:乙個由數字構成的大矩陣,能進行兩種操作

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...