数组元素的地址计算问题(一维到高维)
數(shù)組元素存儲(chǔ)地址的計(jì)算
一維數(shù)組
設(shè)一維數(shù)組A[n]存放在n個(gè)連續(xù)的存儲(chǔ)單元中,每個(gè)數(shù)組元素占一個(gè)存儲(chǔ)單元(不妨設(shè)為C個(gè)連續(xù)字節(jié)).如果數(shù)組元素A[0]的首地址是L,則A[1]的首地址是L+C,A[2]的首地址是L+2C,… …,依次類推,對于有:
?
二維數(shù)組
二維數(shù)組的每個(gè)元素含兩個(gè)下標(biāo),如果將二維數(shù)組的第一個(gè)下標(biāo)理解為行號(hào),第二個(gè)下標(biāo)理解為列號(hào),然后按行列次序排列個(gè)元素,則二維數(shù)組呈陣列形狀。例如
它是一個(gè)行號(hào)為1~m,列號(hào)為1~n的二維數(shù)組元素陣列。
如何保存二維數(shù)組?
首先要確定一個(gè)順序
?
????????? ???????????
??????????????????? 第0行??????? 第1行??????? 第2行
?
????????? ???????????
?
??????????????????? 第0列??????? 第1列??????? 第2列
?
?
????????? ???????????
?
????????? ???????????
?
?
?
?
?
?
?
?
?
?
設(shè)count為數(shù)組B中元素的個(gè)數(shù),則count=9
按行優(yōu)先存儲(chǔ)
?
| ? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
| … |
|
|
|
|
|
|
|
|
| … |
????????? 第0行???????????????? 第1行??????????????? 第2行??
?
?
按列優(yōu)先存儲(chǔ)
?
| ? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
| … |
|
|
|
|
|
|
|
|
| … |
?
????????? 第0列???????????????? 第1列??????????????? 第2列??
?
地址如何計(jì)算?
所謂按行優(yōu)先順序,就是將數(shù)組元素按行向量的順序存儲(chǔ),第個(gè)行向量存儲(chǔ)在第個(gè)行向量之后。
下面我們計(jì)算二維數(shù)組中任一元素A[i][j]的存儲(chǔ)地址,設(shè)每個(gè)數(shù)組元素所占空間為個(gè)連續(xù)字節(jié)。顯然,A[i][j]是第個(gè)行向量B[i]中的第個(gè)元素。
?
| ? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
| … |
|
|
|
|
|
|
|
|
| … |
????????? 第0行?????????????? ??第1行??????????????? 第2行??
?
在A[i][j]之前的元素個(gè)數(shù)為u,分別是A[0][0],A[0][1],A[0][2],…,A[0][n],A[1][0],A[1][1],A[1][2],…,A[1][n],…,A[i-1][0],A[i-1][1],A[i-1][2],…,A[i-1][n],A[i][0],A[i][1],A[i][2],…,A[i][j-1]
設(shè)每個(gè)數(shù)組元素所占空間為個(gè)連續(xù)字節(jié)。
則
Loc(A[i][j])=Loc(A[0][0])+u*C
u=?
前i行(第0行到第i-1行)(每行n個(gè)元素)的元素個(gè)數(shù)+第i行的元素個(gè)數(shù)(A[i][0]到A[i][j-1])
因此,u=i*n+j
故
Loc(A[i][j])=Loc(A[0][0])+u*C
=Loc(A[0][0])+(i*n+j)*C
按列優(yōu)先存儲(chǔ)
?
| ? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
| … |
|
|
|
|
|
|
|
|
| … |
?
????????? 第0列???????????????? 第1列??????????????? 第2列??
?
地址如何計(jì)算?
在A[i][j]之前的元素個(gè)數(shù)為v,分別是A[0][0],A[1][0],A[2][0],…,A[m][0],A[0][1],A[1][1],A[2][1],…,A[m][1],…,A[0][j-1],A[1][j-1],A[2][j-1],…,A[m][j-1],A[0][j],A[1][j],A[2][j],…,A[i-1][j]
設(shè)每個(gè)數(shù)組元素所占空間為個(gè)連續(xù)字節(jié)。
則
Loc(A[i][j])=Loc(A[0][0])+v*C
v=?
前j列(第0列到第j-1列)(每列m個(gè)元素)的元素個(gè)數(shù)+第j列的元素個(gè)數(shù)(A[0][j]到A[i-1][j])
因此,v=j*m+i
故
Loc(A[i][j])=Loc(A[0][0])+v*C
=Loc(A[0][0])+(j*m+i)*C
高維數(shù)組
按行優(yōu)先:“左”下標(biāo)優(yōu)先,即第一(最左)下標(biāo)的下標(biāo)值較小的元素較先存儲(chǔ),第一個(gè)下標(biāo)值相同者,按第二下標(biāo)優(yōu)先存儲(chǔ),對任意的k>1,對第1~(k-1)維相同者,先存儲(chǔ)第k維中下標(biāo)值較小者。
按列優(yōu)先:“右”下標(biāo)優(yōu)先(最后一維下標(biāo)為最右),先存儲(chǔ)第n維下標(biāo)值較小者,第n維下標(biāo)值相同者,先存儲(chǔ)第n-1維下標(biāo)值較小者。
三維數(shù)組D[3][3][4]的順序存儲(chǔ)次序是
元素表示為D[i][j][k]??? 其中,0≤i≤2,0≤j≤2,0≤k≤3,
?
可以把它看作一維數(shù)組
B1[3]= { D[0][3][4],D[1][3][4],D[2][3][4]}
?
?
?
|
D[0][0][0],D[0][0][1],D[0][0][2],D[0][0][3]
D[0][1][0],D[0][1][1],D[0][1][2],D[0][1][3]
D[0][2][0],D[0][2][1],D[0][2][2],D[0][2][3]
?
|
D[1][0][0],D[1][0][1],D[1][0][2],D[1][0][3]
D[1][1][0],D[1][1][1],D[1][1][2],D[1][1][3]
D[1][2][0],D[1][2][1],D[1][2][2],D[1][2][3]
?
|
D[2][0][0],D[2][0][1],D[2][0][2],D[2][0][3]
D[2][1][0],D[2][1][1],D[2][1][2],D[2][1][3]
D[2][2][0],D[2][2][1],D[2][2][2],D[2][2][3]
?
?
For? x=0? to?2?do
?? For? y=0? to?2? do
????? For? z=0?to? 3? do
D[i][j][k]的地址:
Loc(D[i][j][k])=Loc(D[0][0][0])+w*C
第一個(gè)下標(biāo)的變化:0到i-1,共i*3*4個(gè)元素
第一個(gè)下標(biāo)為i時(shí),第二個(gè)下標(biāo)的變化:0到j-1,共j*4個(gè)元素
第一個(gè)下標(biāo)為i,第二個(gè)下標(biāo)為j時(shí),第三個(gè)下標(biāo)的變化:0到k-1,共k個(gè)元素
w= i*3*4+j*4+k
Loc(D[i][j][k])=Loc(D[0][0][0])+w*C
=Loc(D[0][0][0])+(i*3*4+j*4+k)*C
?
For? z=0?to? 3? do
?? For? y=0? to?2? do
????? For? x=0?to? 2? do
?
?
?
?
|
|
D[0][0][0],D[1][0][0],D[2][0][0]
D[0][1][0],D[1][1][0],D[2][1][0]
D[0][2][0],D[1][2][0],D[2][2][0]
|
?
|
D[0][0][1],D[1][0][1],D[2][0][1]
D[0][1][1],D[1][1][1],D[2][1][1]
D[0][2][1],D[1][2][1],D[2][2][1]
|
?
|
D[0][0][2],D[1][0][2],D[2][0][2]
D[0][1][2],D[1][1][2],D[2][1][2]
D[0][2][2],D[1][2][2],D[2][2][2]
|
?
|
D[0][0][3],D[1][0][3],D[2][0][3]
D[0][1][3],D[1][1][3],D[2][1][3]
D[0][2][3],D[1][2][3],D[2][2][3]
?
For? z=0?to? 3? do
?? For? y=0? to?2? do
????? For? x=0?to? 2? do
D[i][j][k]的地址:
Loc(D[i][j][k])=Loc(D[0][0][0])+w*C
第三個(gè)下標(biāo)的變化:0到k-1,共k*3*3個(gè)元素
第三個(gè)下標(biāo)為k時(shí),第二個(gè)下標(biāo)的變化:0到j-1,共j*3個(gè)元素
第三個(gè)下標(biāo)為k,第二個(gè)下標(biāo)為j時(shí),第一個(gè)下標(biāo)的變化:0到i-1,共i個(gè)元素
w= k*3*3+j*3+i
?
Loc(D[i][j][k])=Loc(D[0][0][0])+w*C
=Loc(D[0][0][0])+(k*3*3+j*3+i)*C
?
?
n維數(shù)組
For? =0? to? ??do
?? For? =0? to? ??do
?????????? …? …? …? …?
????? For? =0? to? ??do
s = ?
的變化:0~-1,共***…*=*個(gè)元素
等于時(shí),的變化:0~-1,共**…*=*個(gè)元素
等于時(shí),等于時(shí),的變化:0~-1,共**…*=*個(gè)元素
…? …? …? …?
等于時(shí),等于時(shí),…,等于時(shí),的變化:0~-1,共個(gè)元素
故
s=*+*+*+…+*+
??????????????
總結(jié)
以上是生活随笔為你收集整理的数组元素的地址计算问题(一维到高维)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 艾科思移动BI系统与钉钉集成
- 下一篇: Java正则表达式