第4章 數組和廣義表
【例4-1】二維數組A的每一個元素是由6個字符組成的串,其行下標i=0,1,…,8,列下標j=1,2,…,10。若A以行為主序存儲元素,A[8][5]的物理地址與當A按列為主序存儲時的元素( )的物理地址相同。設每個字符占一個字節。
A.A[8][5] B.A[3][10] C.A[5][8] D.A[0][9]
//作圖
解: 二維數A是一個9行10列的矩陣,即A[9][10]。按行存儲時,A[8][5]是第85個元素存儲的元素。而按列存儲時,第85個存儲的元素是A[3][10]。即正確答案為B。
【例4-2】若對n階對稱矩陣A以行序為主序方式將其下三角形的元素(包括主對角線上所有元素)依次存放於一維數組B[n(n+1)/2]中,則在B中確定的位置k的關系為( )。
A. B. C. D.
解: 如果a按行存儲,那么它的前面有i-1行,其有元素個數為:
1+2+3+…+(i-1)=i(i-1)/2。同時它又是所在行的第j列,因此它排列的順序還得加上j,一維數組B[n(n+1)/2]中的位置k與其下標的關系是:。
因此答案為A。
【例4-3】已知n階下三角矩陣A,按照壓縮存儲的思想,可以將其主對角線以下所有元素(包括主對角線上元素)依次存放於一維數組B中。請寫出從第一列開始以列序為主序分配方式時在B中確定元素a的存放位置的公式。
解: 如果a按列存儲,那么它的前面有j-1列,共有元素:
n+(n-1)+(n-2)+ …+[n-(j-2)] //j-1-1
=(j-1)*n-
而它又是所在列的第i行,因此在它前的元素個數還得加上i。因此它在一維數組B中的存儲順序為:
(j-1)*n-+i //感覺不對,應該是+(i-n/2)
【例4-4】已知廣義表L=((x,y,z),a,(u,t,w)),從L表中取出的原子項ASCII碼最大的運算是( )。//取z
A.head(tail(tail(L)))
B.tail(head(head(tail(L))))
C.head(tail(tail(head(L)))) //表尾一定是個表
D.head(tail(tail(tail(L))))
解:選項A的結果是字符串“u”;選項B的結果是空表,無字符;選項C的結果是字符“z”;選項D的結果是字符“t”。從所有選項的結果可以看出,ASCII碼最大的是字符“z”。因此正確答案是C。
習題4
一、單項選擇題
1. 設二維數組A[0…m-1][0…n-1]按行優先順序存儲在內存中,第一個元素的地址為p,每個元素占k個字節,則元素aij的地址為( A)。
A.p +[i*n+j-1]*k B.p+[(i-1)*n+j-1]*k
C.p+[(j-1)*n+i-1]*k D.p+[j*n+i-1]*k
2. 已知二維數組A10×10中,元素a20的地址為560,每個元素占4個字節,則元素a10的地址為( A)。
A.520 B.522 C.524 D.518
3. 若數組A[0…m][0…n]按列優先順序存儲,則aij地址為(3. A )。
A.LOC(a00)+[j*(m+1)+i+1] B. LOC(a00)+[j*n+i]
C.LOC(a00)+[(j-1)*n+i-1] D. LOC(a00)+[(j-1)*m+i-1]
4. 若下三角矩陣An×n,按列順序壓縮存儲在數組Sa[0…(n+1)n/2]中,則非零元素aij的地址為(4. B)。(設每個元素占d個字節)
A. [(j-1)*n-+i-1]*d
B. [(j-1)*n-+i]*d //日了特朗普了
C.[(j-1)*n-+i+1]*d
D.[(j-1)*n-+i-2]*d
5. 設有廣義表D=(a,b,D),其長度為(B ),深度為(A )。
A.無窮大 B.3 C.2 D.5
6. 廣義表A=(a),則表尾為(6. C )。
A.a B.(( )) C.空表 D.(a)
7. 廣義表A=((x,(a,B)),(x,(a,B),y)),則運算head(head(tail(A)))的結果為(7. A )。
A.x B.(a,B) C.(x,(a,B)) D.A
8. 下列廣義表用圖來表示時,分支結點最多的是( 8. A)。
A.L=((x,(a,B)),(x,(a,B),y)) B.A=(s,(a,B))
C.B=((x,(a,B),y)) D.D=((a,B),(c,(a,B),D)
9. 通常對數組進行的兩種基本操作是(9. C)。
A.建立與刪除 B.索引和修改
C.查找和修改 //讀和寫 D.查找與索引
10. 假定在數組A中,每個元素的長度為3個字節,行下標i從1到8,列下標j從1到10,從首地址SA開始連續存放在存儲器內,存放該數組至少需要的單元數為(10. C)。
A.80 B.100 C.240 D.270
11. 數組A中,每個元素的長度為3個字節,行下標i從1到8,列下標j從1到10,從首地址SA開始連續存放在存儲器內,該數組按行存放時,元素A[8][5]的起始地址為(11. C )。
A.SA+141 B.SA+144 C.SA+222 D.SA+225
12. 稀疏矩陣一般的壓縮存儲方法有兩種,即(12. C )。
A.二維數組和三維數組 B.三元組和散列
C.三元組和十字鏈表 D.散列和十字鏈表
13. 若采用三元組壓縮技術存儲稀疏矩陣,只要把每個元素的行下標和列下標互換,就完成了對該矩陣的轉置運算,這種觀點(13. B )。
A.正確 B.不正確
14. 一個廣義表的表頭總是一個(14. D)。
A.廣義表 B.元素 C.空表 D.元素或廣義表
15. 一個廣義表的表尾總是一個( 15.A)。
A.廣義表 B.元素 C.空表 D.元素或廣義表
16. 數組就是矩陣,矩陣就是數組,這種說法(16.B )。
A.正確 B.錯誤
C.前句對,后句錯 D.后句對
二、填空題
1. 一維數組的邏輯結構是________線性結構______,存儲結構是____順序結構__________;對於二維或多維數組,分為_____以行為主序_________和____以列為主序__________兩種不同的存儲方式。
2. 對於一個二維數組A[m][n],若按行序為主序存儲,則任一元素A[i][j]相對於A[0][0]的地址為_______ i×n+j個元素位置_______。
3. 一個廣義表為(a,(a,b),d,e,((i,j),k))則該廣義表的長度為__5___,深度為_3____。
4. 一個稀疏矩陣為 ,則對應的三元組線性表為____((0,2,2),(1,0,3),(2,2,-1),(2,3,5))_________。
5. 一個n×n的對稱矩陣,如果以行為主序或以列為主序存入內存,則其容量為__________ n(n+1)/2____。
6. 已知廣義表A=((a,b,c),(d,e,f)),則運算head(tail(head((tail(A))))=____e _____。
7. 設有一個10階的對稱矩陣A,采用壓縮存儲方式以行序為主序存儲,a為第一個元素,其存儲地址為0,每個元素占有1個存儲地址空間,則a的地址為_______41_______。
//壓縮存儲,以行為主序
8. 已知廣義表Ls=(a,(b,c,d),e),運用head和tail函數取出Ls中的原子b的運算是__________ head(head(tail(Ls)))____。
9. 三維數組R[c1…d1,c2…d2,c3…d3]共含有________(d-c+1)×(d-c+1)×(d-c+1)______個元素。(其中:c1≤d1,c2≤d2,c3≤d3)
10. 數組A[1…10,-2…6,2…8]以行優先的順序存儲,設第一個元素的首地址是100,每個元素占3個存儲長度的存儲空間,則元素A[5,0,7]的存儲地址為________913______。
//該數組可以看做A[10][9][7] 100+(5-1)*9*7*3+(0--2)*7*3+(7-2)*3=913
三、判斷題
1. 數組可看作基本線性表的一種推廣,因此與線性表一樣,可以對它進行插入、刪除等操作。( × )//數組一旦固定后就不能插入或修改
2. 多維數組可以看作數據元素也是基本線性表的基本線性表。(√)
3. 以行為主序或以列為主序對於多維數組的存儲沒有影響。(√)
4. 對於不同的特殊矩陣應該采用不同的存儲方式。(√)//特殊矩陣采用數組法,稀疏矩陣采用三元組法
5. 采用壓縮存儲之后,下三角矩陣的存儲空間可以節約一半。(×)
6. 在一般情況下,采用壓縮存儲之后,對稱矩陣是所有特殊矩陣中存儲空間節約最多的。(×)//稀疏矩陣
7. 矩陣不僅是表示多維數組,而且是表示圖的重要工具。(√)//圖的鄰接矩陣表示法
8. 距陣中的數據元素可以是不同的數據類型。(×)//通常用二維數組表示矩陣
9. 矩陣中的行列數往往是不相等的。(×)//沒有往往
10. 廣義表的表頭可以是廣義表,也可以是單個元素。(√)
11. 廣義表的表尾一定是一個廣義表。(√)
12. 廣義表的元素可以是子表,也可以是單元素。(√)
13. 廣義表不能遞歸定義。(×)//廣義表是遞歸定義的
14. 廣義表實際上是基本線性表的推廣。(√)
15. 廣義表的組成元素可以是不同形式的元素。(√)//可以是原子也可以是表