第07讲 数组和特殊矩阵 课堂互动 隐藏答案 | 返回首页

作者:欧新宇(Xinyu OU)

最后更新:2023-10-02


【课前自测07】

1. 假设二维数组A[1..60, 1..70] 以列序为主序顺序存储,其基地址为10000,每个元素占用2个存储单元,那么元素A[32,58]的存储地址为( )。
A. 14454
B. 16902
C. 16904
D. 以上均不对

答案及解析:B
A[32,58] = Loc([0][0]) + [(58-1)×60 + (32-1)]×2 = 10000 + (57×60+31)×2 = 16902。

2. 设二维数组A[m][n],每个数组元素占用d个存储单元,第一个数组元素的存储地址是Loc[0][0],求按行优先顺序存储元素A[i][j](0≤i≤m-1,0≤j≤n-1)的存储地址是()。
A. Loc[0][0] + ((j-1)n + j -1)d
B. Loc[0][0] + ((i-1)m + j -1)d
C. Loc[0][0] + (jm + i)d
D. Loc[0][0] + (in + j)d

答案及解析:D
按行优先,需要先用当前行前面的行去遍历所有列,然后再加上当前行所处列的位置;最后再乘上每个元素所占的存储单元。由于本题中的起点序号为0,因此可得k = Loc[0][0] + (i*n+j)d

3. 对特殊矩阵采用压缩存储的主要目的是( )。
A. 表达变得简单
B. 对矩阵元素的存取变得简单
C. 去掉矩阵中的多余元素
D. 减少不必要的存储空间

答案及解析:D
特殊矩阵中含有很多相同元素或零元素,故可采用压缩存储,以节省存储空间。

4. 对n阶对称矩阵压缩存储时,需要表长为( )。
A. n/2
B. n×n/2
C. n(n+1)/2
D. n(n-1)/2

答案及解析:C
只需要存储其上三角或下三角部分(含对角线),元素个数为n+(n-1)+(n-2)+…+1 = n(n+1)/2。

5. 【2017统考真题】适用于压缩存储稀疏矩阵的两种存储结构是( )。
A. 三元组表和十字链表
B. 三元组表和邻接矩阵
C. 十字链表和二叉链表
D. 邻接矩阵和十字链表

答案及解析:A
三元组表的结点存储了行row、列col、值value三种信息,是主要用来存储稀疏矩阵的一种数据结构。十字链表将行单链表和列单链表结合起来存储稀疏矩阵。邻接矩阵空间复杂度达O(n²),不适合于存储稀疏矩阵。二叉链表又称为左孩子右兄弟表示法,可用于表示树或森林。A正确。

【课堂互动7.1】数组的基本概念及顺序存储实现

1. 在二维数组A中,假设每个数组元素的长度为3个存储单元,行下标i为0~8,列下标j为0~9,从首地址SA开始连续存放。在这种情况下,元素A[8][5]的起始地址为( )。
A. SA+141
B. SA+144
C. SA+222
D. SA+255

答案及解析:D
二维数组计算地址(按行优先顺序)的公式为LOC(i, j) = LOC(0, 0)+(i×m+j)×L。其中,LOC(0,0)=SA,是数组存放的首地址;L=3是每个数组元素的长度;因此A[8][5]的相对位置应该是处于矩阵的第9行的,第6个元素,对于A[8][5]来说,它前面总共有 (i×m+j)= (8×10+5) = 85个元素,每个元素占3个存储单元,总共占用了85×3=255个单元。所以,对于A[8][5]来说,它的位置就是第255+1=256个单元地址。另外,此处首地址已经使用SA表示了,所以相对于首地址来说,A[8][5]的位置就变成了SA+256-1,最终地址为:SA+255。

2.【2021统考真题】二维数组A按行优先方式存储,每个元素占用1个存储单元。若元素A[0][0]的存储地址是100,A[3][3]的存储地址是220,则元素A[5][5]的存储地址是( )。
A. 295
B. 300
C. 301
D. 306

答案及解析:B
在二维数组A按行优先存储,每个元素占用1个存储单元,因此需要先确定二维数组有多少列。不妨设数组中包含n列,则有100+3×n+4-1 = 220,可知n=39。由此,可得A[5][5]的存储地址为100+5×39+6-1 = 300。注意,此处起始地址为100,相当于从0作为起点,所以计算获得的位置应该做减一操作。

3. 在二维数组A[m][n]中,每个元素A[i][j]占k个存储空间,所有元素相继存放在一个连续的存储空间中,则存放该数组至少需要的存储空间是( )。
A. (m-1)n
B. mn
C. (m-1)nk
D. mnk

答案及解析:D
数组的存储空间等于 = 行数×列数×每个元素的大小=mnk

4. 三维数组[1..10, -2..6, 2..8] 的每个元素的长度为4个字节,该数组要占( )个字节的存空间。
A. 630
B. 2800
C. 2520
D. 2880

答案及解析:C
数组的存储空间等于 = 行数×列数×页数×每个元素的大小 = (10-1+1)×(6-(-2)+1)×(8-2+1)×4 = 10×9×7×4 = 2520个字节。

【课堂互动7.2】特殊矩阵的压缩存储

1. 将三对角矩阵A[1,...,100][1,...,100]按行优先存入一维数组B[1,...,298]中,数组A中元素A[66][65]在数组B中的位置k为( )。
A. 198
B. 195
C. 197
D. 196

答案及解析:B
对于三对角矩阵,将A[1..n][1..n]压缩至B[1,...,3n-2]时, ai,j 与b的对应关系为k = 2i+j-3 = 2×66+65-3 = 194。但应注意的是,此处的初始下标为1,因此需要将计算获得的下标进行+1操作,即194+1=195。
另一种方法,在三对角矩阵中,第1行包括2个元素,最后一行包括1个元素,其他每行都是3个元素。因此,k=2+3×64+1=195。

2. 有一个n×n的对称矩阵A,将其下三角部分按行存放在一维数组B中,而A[0][0]存放于B[0]中,则第i+1行的对角元素A[i][i]存放于B中的 ( ) 处。
A. (i+3)i/2
B. (i+1)i/2
C. (2n-i+1)i/2
D. (2n-i-1)i/2

答案及解析:A
此题要注意3个细节:矩阵的最小下标为0,因此数组的下标也是从0开始的,矩阵按行优先存在数组中。按照题意,第一行元素个数为1,第i+1行元素个数为i+1。因此,按照公式,第i+1行对角线元素的位置应该是[1+(i+1)](i+1)/21=i(i+3)/2[1+(i+1)](i+1)/2 -1 = i(i+3)/2

3.【2016统考真题】有一个100阶的三对角矩阵M,其元素mi,jm_{i,j}(1≤i, j≤100)按行优先依次压缩存入下标从0开始的一维数组N中。元素m30,30m_{30,30}在N中的下标是( )。
A. 86
B. 87
C. 88
D. 89

答案及解析:B

4.【2018统考真题】设有一个12x12的对称矩阵M,将其上三角部分的元素mi,jm_{i,j}(1≤i≤j≤12)按行优先存入C语言的一维数组N中,元素m6,6m_{6,6}在N中的下标是( )。
A. 50
B. 51
C. 55
D. 66

答案及解析:A
元素m6,6m_{6,6}在N中的序号k等于前6-1行的和再加上第6行的位置。其中前6-1行的元素个数为(12+8)×5/2=50,第6行位于对角线上,也就是第6行的第一个元素。因此,最终的m6,6m_{6,6} 的存储位置等于 50+1 = 51。又由于在C语言中,数组N的下标从0开始。第一个元素m对应存入N[0]中,所以最终的下标应该是51-1=50。

5.【2020统考真题】将一个10x10对称矩阵M的上三角部分的元素mi,jm_{i,j}(1≤i≤j≤10)按列优先存入C语言的一维数组N中,元素m7,2m_{7,2}在N中的下标是( )。
A. 15
B. 16
C. 22
D. 23

答案及解析:C
在C语言中,数组N的下标从0开始,因此k值需要减1。本题上三角按列优先存储,因此元素m7,2表示第7列,第2行。该元素前面共有6列,其元素个数为(1+6)×6/2=21;同时,它位于第7列第2个元素。因此该元素在N中的位置k=21+2-1=22。

【扩展练习07】

1. 设三维数组A[3..10, -1..8, 1..20]按高位优先(页/行/列)存放,首元素的存储地址为1000,每个元素占用4个存储单元,则元素A[5,3,6]的存储地址是( )。
A. 485
B. 1485
C. 1940
D. 2940

答案及解析:D
数组A的维度分别为8×10×20。
A[5,3,6] = A[0,0,0] + i×m×n + j×n + k = 1000 + [(5-3)×10×20 + (3-(-1))×20 + (6-1)]×4 = 1000 + (400+80+5)×4 = 2940。

2. 设一维数组A[m×n]从A[0]开始,每隔n个元素取出一个元素存放到B[m]中,B[0] = A[0],B[1] = A[n] ......那么B[k]中存放的元素在A中的下标是( )。
A. (k-1)n
B. kn
C. (k-1)m
D. km

答案及解析:B
B[0]=A[0], B[1]=A[n], B[2]=A[2n], B[3]=A[3n], ...B[k]=A[kn]。

3. 若将n阶下三角矩阵A按列优先顺序压缩存放在一维数组B[1,...,n(n+1)/2+1]中,则存放到B[k]中的非零元素ai,ja_{i,j}(1≤i, j≤n)的下标i、j与k的对应关系是( )。
A. (j-1)(2n-j+1)/2+i-j
B. (j-1)(2n-j+2)/2+i-j+1
C. (j-1)(2n-j+2)/2+i-j
D. (j-1)(2n-j+1)/2+i-j-1

答案及解析:B
在一个n阶下三角矩阵中,按列优先存储,故元素a前面有j-1列,共有n+(n-1)+...+(n-j+2) = (2n-j+2)(j-1)/2个元素;又有元素a在第j列上是第j个元素,因此在该列中,它前面共有i-j+1个元素。由于数组B的起始值为1,因此,数组B的下标k与i,j的关系是k = (2n-j+2)(j-1)/2+i-j+1。

4. 若将n阶上三角矩阵A按列优先级压缩存放在一维数组B[1,...,n(n+I)/2+1]中,则存放到B[K]中的非零元素ai,ja_{i,j}(1≤i,j≤n)的下标i, j与k的对应关系是( )。
A. i(i+1)/2+j
B. i(i-1)/2+j-1
C. j(j-1)/2+i
D. j(j-1)/2+i-1

答案及解析:C
按列优先存储,故元素a前面有j-1列,共有1+2+3+…+(j-1)=1+(j-1)/2 = j(j-1)/2个元素;又有元素a在第j列上是第i个元素。由于数组B的起始值为1,因此,数组B的下标k与i,j的关系是k = j(j-1)/2+i。

5. 将一个n×n的对称矩阵A的对角线和对角线以下的部分按行优先存储于一个一维数组B中,那么B中存放了( )个矩阵A的元素。
A. n(n-1)/2
B. n2n^2/2
C. n(n+1)/2
D. n(n-1)

答案及解析:C
N = 1+2+3+...+n = (1+n)n/2

6. 二位数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范围从1到10,则A的第8列和第5行共占( )个字节。
A. 108
B. 114
C. 54
D. 60

答案及解析:A
第8列共有9个元素,第5行共有10个元素,共占10+9-1=18个元素,相当于18*6=108个字节。

7. 多维数组之所以有行优先顺序和列优先顺序两种存储方式是因为( )。
A. 数组的元素处在行和列两个关系中
B. 数组的元素必须从左到右顺序排列
C. 数组的元素之间存在次序关系
D. 数组是多维结构,内存是一维结构

答案及解析:D
由于存储单元是一维的结构,而数组可能是多维结构,所以用一组连续存储单元存放数组元素时,必须按照一定的约定次序进行遍历。而多维数组有页、行、列等多个维度,所以可以根据需要采用行优先顺序或列优先顺序两种方式进行存储。

8. [0..4, -1..-3, 5..7] 中含有( )个元素。
A. 55
B. 45
C. 36
D. 16

答案及解析:B
N = 行数×列数×页数 = (4-0+1)×(-1-(-3)+1)|×(7-5+1) = 5×3×3 = 45个字节。

9. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( )。
A. BA+141
B. BA+180
C. BA+222
D. BA+225

答案及解析:B
当数组以列序为主序进行存储时,则元素 aija_{ij} 的前面存储了j-t = 5-1 = 4列元素,每列有m-s+1=10-1+1=10个元素。此外,aija_{ij} 所在的行前面也存储了i-s=(5-1)个元素,因此A[5,8]的首地址计算如:Loc(A[5,8]) = Loc(1,1) + [(8-1+1)×(8-1) + (5-1)]×3 = 180

10. 设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11a_{11} 为第一元素,其存储地址为1,每个元素占一个地址空间,则a85a_{85}的地址为( )。
A. 13
B. 32
C. 33
D. 40

答案及解析:C
在压缩对称矩阵中,只以三角矩阵存储数据,此处要求a85a_{85},说明使用的是下三角。因此Loc(8,5) = (1+7)×7/2 + 5= 33

11. 若对n阶对称矩阵以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定 aij(i<j)a_{ij} (i<j) 的位置k为( )。
A. i(i-1)/2+j
B. j(j-1)/2+i
C. i(i+1)/2+j
D. j(j+1)/2+i

答案及解析:B
Loc(i,j) = (1+(j-1))×(j-1)/2 + (i-1) + 1 = j(j-1)/2 + i

12. 二维数组A的每个元素是由10个字符组成的串,其行下标i=0,1,...,8,列下标j=1,2,...,10。若A按行先存储,元素A[8,5]的起始地址与当A按列先存储时的元素( )的起始地址相同。设每个字符占1字节。
A. A[8,5]
B. A[3,10]
C. A[5,8]
D. A[0,9]
答案及解析:B
按行先存储:Loc(8,5) = [(8-0)×(10-1+1) + (5-1)]×10 = 840。
按列先存储:Loc(i,j) = [(j-1)×(8-0+1) + (i-0)]×10 = 840 => 9j+i=93。
按照i和j的取值范围,可以获得j=10, i=3。

13. 二维数组A[1..m, 1..n](即m行n列)按行存储在数组B[1..m×n]中,则二维数组元素A[i,j]在一维数组B中的下标为( )。
A. (i-1)n+j
B. (i-1)n+j-1
C. i(j-1)
D. jm+i-1

答案及解析:A
k = (i-1)n+(j-1)+1 = (i-1)n+j

14. 假设以行序为主序存储二维数组A=array[1..100, 1..100],设每个数据元素占2个存储单元,基地址为10,则Loc[5,5] =( )。
A. 808
B. 818
C. 1010
D. 1020

答案及解析:B
Loc(5,5) = Loc(1,1) + [(5-1)×(100-1+1) + (5-1)] × 2 = 10 + 808 = 818

第07讲 数组和特殊矩阵 课堂互动 隐藏答案 | 返回首页