数据结构复盘——第四章:数组和矩阵


第一部分:矩阵

矩阵在线性代数中已经有过详细了解,在考研中矩阵部分常常考察数组下标 k矩阵行 i 和列 j 的关系。
需要注意的是矩阵下标 i、j 通常是: 1 到 n 1到n 1n,而数组下标 k 通常是: 0 到 n 2 − 1 0到n^2-1 0n21

  • k 与 i、j 的关系就是: k = n ∗ ( i − 1 ) + j − 1 k=n*(i-1)+j-1 k=n(i1)+j1

第一部分习题

  1. 数组A中,每个元素的长度为3个字节,行下标 i 从1到8,列下标 j 从1到10,从首地址SA开始连续存放的存储器内,该数组按行存放,元素 A[8][5] 的起始地址为(C)。
    A.SA+141
    B.SA+144
    C.SA+222(用公式可以求出 A 85 A_{85} A85前面有74个元素,所以它的起始地址就是: S A + 74 ∗ 3 SA+74*3 SA+743
    D.SA+225
  2. 设二维数组 A[1…m,1…n] 按行存储在数组B中,则二维数组元素 A[i,j] 在一维数组B中的下标为(A)。
    A.n*(i-1)+j(题目中没有强调数组B的下标从0开始,再结合其他选项只能选A)
    B.n*(i-1)-j-1(迷惑性选项,“- j”必然是错的)
    C.i*(j-1)
    D.i*m+i-1

第二部分:对称矩阵

对称矩阵就是主对角线两侧的数据相同的方阵,对于这类矩阵我们通常可以节约空间,只存储上三角部分的数据或下三角部分的数据。

  • 此时数组下标 k矩阵行 i 和列 j 的关系通常满足(上三角转置后就是下三角了): k 下三角 = S i − 1 + j − 1 k 上三角 = S j − 1 + i − 1 k_{下三角}=S_{i-1}+j-1\\k_{上三角}=S_{j-1}+i-1 k下三角=Si1+j1k上三角=Sj1+i1
  • 在之前数组存储普通矩阵的表达式中 S x = x ∗ n S_x=x*n Sx=xn,n为矩阵的总列数;而这里因为存储的是上/下三角矩阵,所以结合等差数列求和公式有: S x = x ∗ ( x + 1 ) 2 S_{x}=\frac{x*(x+1)}{2} Sx=2x(x+1)

需要注意的是,为了达到转置的效果,上三角矩阵需要按列存储到数组当中(转置时列会变为行)。结合上面的两个式子可以得出以下关系:
对称矩阵的数组下标

第二部分习题

  1. 设有一个对称矩阵A,采用压缩存储方式,以行序为主序存储A11为第一个元素其存储地址为1,每个元素占一个地址空间,则A85地址为(B) 。
    A.23
    B.33 (前面的元素个数:k=8*(8-1)/2+5-1=32,地址为:1+k*1=33)
    C.18
    D.40

第三部分:三角矩阵

三角矩阵分为下三角矩阵上三角矩阵,需要和对称矩阵的上下三角矩阵区分。

  • 下三角矩阵:下三角为权值,上三角全相同(例如全为0或1)
  • 上三角矩阵:上三角为权值,下三角全相同(例如全为0或1)

此时数组除了需要存储上/下三角区域当中的权值,还需要增加一个位置,记录余下的相同数据(保存一份即可)。

  • 下三角矩阵中元素对应的数组下标: { k 权值区域 = i ∗ ( i − 1 ) 2 + j − 1 ( i ≥ j ) k 相同区域 = n ∗ ( n + 1 ) 2 ( i < j ) \begin{cases}k_{权值区域}=\frac{i*(i-1)}{2}+j-1&(i \geq j)\\\\k_{相同区域}=\frac{n*(n+1)}{2}&(i < j)\end{cases} k权值区域=2i(i1)+j1k相同区域=2n(n+1)iji<j
  • 上三角矩阵中元素对应的数组下标: { k 权值区域 = j ∗ ( j − 1 ) 2 + i − 1 ( i ≤ j ) k 相同区域 = n ∗ ( n + 1 ) 2 ( i > j ) \begin{cases}k_{权值区域}=\frac{j*(j-1)}{2}+i-1&(i \leq j)\\\\k_{相同区域}=\frac{n*(n+1)}{2}&(i > j)\end{cases} k权值区域=2j(j1)+i1k相同区域=2n(n+1)iji>j

其中权值区域的最大下标为: k n n = n ∗ ( n − 1 ) 2 + n − 1 = n ∗ ( n + 1 ) 2 − 1 ( i = j = n ) k_{nn}=\frac{n*(n-1)}{2}+n-1=\frac{n*(n+1)}{2}-1 \quad(i=j=n) knn=2n(n1)+n1=2n(n+1)1i=j=n

第三部分习题

  1. 若将 n 阶下三角矩阵 A 按列优先顺序压缩存放在一维数组 B[1…n(n+1)/2+1] 中,则存放到 B[k] 中的非零元素 aij(1<=i , j < =n)的下标 i、j 与 k 的对应关系是(B)。
    A.(j-1)(2n-j+1)/2+i-j
    B.(j-1)(2n-j+2)/2+i-j+1(题目中说了数组B下标从1开始,所以不需要减1)
    C.(j-1)(2n-j+2)/2+i-j
    D.(j-1)(2n-j+ 1)/2+i-j-1
    【分析】下三角按列优先顺序压缩上三角按行优先顺序压缩一样,需要进行等差数列的反向求和,具体过程见下图:(图中为本题的下三角按列压缩,要求上三角按行压缩只需要进行转置——互换 i 和 j 位置)
    下三角按列压缩推导

第四部分:三对角矩阵

三对角矩阵也可称为“爪型”矩阵、带状矩阵,它的特点就是当 ∣ i − j ∣ > 1 |i-j|>1 ij>1 A i j = 0 A_{ij}=0 Aij=0
三对角矩阵结构与压缩后的下标k

第四部分习题

  1. 有一个100阶的三对角矩阵 M M M,其元素 m i j m_{ij} mij(1<= i,j<=100)按行优先依次压缩存入下标从0开始的一维数组 N N N中。元素 m 30 , 30 m_{30,30} m30,30在N中的下标是(B)。
    A.86
    B.87(套公式:2*30+30-3=87)
    C.88
    D.89

第五部分:稀疏矩阵

当矩阵中非零元素的个数远少于矩阵元素个数时,我们就将其称为稀疏矩阵。
稀疏矩阵—般的压缩存储方式有两种:三元组十字链表。以下主要介绍三元组,十字链表在图的部分会介绍。
稀疏矩阵对应的三元组
三元组看似是多此一举的把一个矩阵变成了另一个矩阵,但是当原矩阵维数非常大,但却是一个稀疏矩阵时,三元组可以非常有效的压缩数据,并且三元组本身也可以进一步压缩成一元数组。
需要注意的是,稀疏矩阵在压缩存储后便失去了随机存取的特性

第五部分习题

  1. 稀疏矩阵—般的压缩存储方式有两种,即(C)。
    A.二维数组和三维数组
    B.三元组和散列
    C.三元组和十字链表
    D.散列和十字链表

  2. 有一个100×90的稀疏矩阵,非0元素有10个,设每个整型数占2个字节,将稀疏矩阵压缩到三元组表data中时,我们用 data[0].i,data[0].j,data[0].v 分别存放矩阵行数、列数和非零元个数,总共需要的字节数是(B)。
    A.20
    B.66(题目的描述存在陷阱,数组下标为0的地方存储了总行数、总列数、总非零元个数,一共消耗了6字节)
    C.18000
    D.33


小结

矩阵部分主要包含了四类矩阵,考察点就是矩阵数据压缩到数组里时,不同矩阵元素对应的数组下标,分值占比不高。
矩阵思维导图

猜你喜欢

转载自blog.csdn.net/qq_50571974/article/details/126633835