数组与特殊矩阵
数组
- 定义:由 n n n 个相同类型的数据元素构成有限序列,每个数据元素称为一个数组元素,每个元素在 n n n 个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界。
- 数组与线性表的关系:数组是线性表的推广
- 一维数组:可视为线性表
- 二维数组:可视为其元素是定长线性表的线性表
位序和下标的区别:下标从0开始,位序从1开始。
数组的存储结构
-
一个数组的所有元素在内存中占一段连续的存储空间
-
一维数组 A [ 0 … n − 1 ] A[0 \dots n-1] A[0…n−1] 的存储结构关系式: L O C ( a i ) = L O C ( a 0 ) + i × L ( 0 ≤ i < n ) LOC(a_i)=LOC(a_0)+ i \times L (0\le i < n ) LOC(ai)=LOC(a0)+i×L(0≤i<n) , 其中 L L L 是每个数组元素所占的存储单元。
-
多维数组 :
- 按行优先 :先行后列,先存储行号较小的元素,行号相等先存储列号较小的元素。
- 存储结构关系式: L O C ( a i , j ) = L O C ( a 0 , 0 ) + [ i × ( h 2 + 1 ) + j ] × L LOC(a_{i,j})= LOC(a_{0,0})+[i\times (h_2+1)+j]\times L LOC(ai,j)=LOC(a0,0)+[i×(h2+1)+j]×L
- 二维数组 列 下标的范围 [ 0 , h 2 ] [0,h_2] [0,h2]
- 按列优先:先列后行,先存储列号较小的元素,列号相等先存储行号较小的元素。
- 存储结构关系式: L O C ( a i , j ) = L O C ( a 0 , 0 ) + [ j × ( h 1 + 1 ) + i ] × L LOC(a_{i,j})= LOC(a_{0,0})+[j\times (h_1+1)+i]\times L LOC(ai,j)=LOC(a0,0)+[j×(h1+1)+i]×L
- 二维数组的 行 下标的范围 [ 0 , h 1 ] [0,h_1] [0,h1]
- 按行优先 :先行后列,先存储行号较小的元素,行号相等先存储列号较小的元素。
-
举个栗子 : 二维数组 A 2 × 3 = [ a 0 , 0 a 0 , 1 a 0 , 2 a 1 , 0 a 1 , 1 a 1 , 2 ] A_{2 \times 3} = \left[ \begin{matrix} a_{0,0} & a_{0,1} & a_{0,2} \\ a_{1,0} & a_{1,1} & a_{1,2} \end{matrix} \right] A2×3=[a0,0a1,0a0,1a1,1a0,2a1,2]
- 用一维数组存放 : 以行优先 a 0 , 0 a 0 , 1 a 0 , 2 a 1 , 0 a 1 , 1 a 1 , 2 \begin{array}{|c|c|c|c|c|c|}\hline { a_{0,0}}&{a_{0,1}}&{ a_{0,2}}&{a_{1,0}}&{a_{1,1}}&{a_{1,2}}\\ \hline \end{array} a0,0a0,1a0,2a1,0a1,1a1,2
- 用一维数组存放 : 以列优先 a 0 , 0 a 1 , 0 a 0 , 1 a 1 , 1 a 0 , 2 a 1 , 2 \begin{array}{|c|c|c|c|c|c|}\hline {a_{0,0}}&{a_{1,0}}&{a_{0,1}}&{a_{1,1}}&{a_{0,2}}&{a_{1,2}}\\ \hline \end{array} a0,0a1,0a0,1a1,1a0,2a1,2
特殊矩阵
一般矩阵: [ a 1 , 1 a 1 , 2 … a 1 , n a 2 , 1 a 2 , 2 … a 2 , n ⋮ ⋮ ⋱ ⋮ a n , 1 a n , 2 … a n , n ] \left[ \begin{matrix} a_{1,1} & a_{1,2} & \dots & a_{1,n} \\ a_{2,1} & a_{2,2} & \dots & a_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n,1} & a_{n,2} & \dots & a_{n,n}\end{matrix} \right] ⎣ ⎡a1,1a2,1⋮an,1a1,2a2,2⋮an,2……⋱…a1,na2,n⋮an,n⎦ ⎤
一般矩阵是用二维数组来存储这些数据。
-
对称矩阵:对于n阶方阵 A [ 1 … n ] [ 1 … n ] A[1 \dots n][1 \dots n] A[1…n][1…n]中任意一个元素 a i , j a_{i,j} ai,j 都有 a i , j = a j , i a_{i,j} = a_{j,i} ai,j=aj,i ( 1 ≤ i , j ≤ n ) (1 \le i, j \le n) (1≤i,j≤n) , 则称为对称阵。ps : 方阵都是 n n n 行 n n n 列的矩阵
-
举个栗子: [ 1 7 8 7 2 0 8 0 3 ] \left[ \begin{matrix}1 & 7 & 8 \\ 7 & 2 & 0 \\ 8 & 0 & 3\end{matrix} \right] ⎣ ⎡178720803⎦ ⎤ 关于对角线对称
-
不难发现上三角区和下三角区对应的元素是相同的,如果还用二维数组存放,则会浪费几乎一半的存储空间。为此要压缩对称矩阵,只需存放下三角的元素即可,仅需使用一维数组即可。
-
在一维数组中存放的位置(假设下标为k,k从 0 0 0 开始): k = { i ( i − 1 ) 2 + j − 1 , i ≥ j j ( j − 1 ) 2 + i − 1 , i < j k=\begin{cases} \frac{i(i-1)}{2} +j-1,\quad i \ge j \\ \frac{j(j-1)}{2}+i-1, \quad i<j \end{cases} k={2i(i−1)+j−1,i≥j2j(j−1)+i−1,i<j
-
-
三角矩阵:
- 上三角矩阵: [ a 1 , 1 a 1 , 2 … a 1 , n a 2 , 2 … a 2 , n ⋱ ⋮ a n , n ] \left[ \begin{matrix} a_{1,1} & a_{1,2} & \dots & a_{1,n} \\ & a_{2,2} & \dots & a_{2,n} \\ & & \ddots & \vdots \\ & & & a_{n,n}\end{matrix} \right] ⎣ ⎡a1,1a1,2a2,2……⋱a1,na2,n⋮an,n⎦ ⎤
- 下三角矩阵: [ a 1 , 1 a 2 , 1 a 2 , 2 ⋮ ⋮ ⋱ a n , 1 a n , 2 … a n , n ] \left[ \begin{matrix} a_{1,1} \\ a_{2,1} & a_{2,2} \\ \vdots & \vdots & \ddots \\ a_{n,1} & a_{n,2} & \dots & a_{n,n}\end{matrix} \right] ⎣ ⎡a1,1a2,1⋮an,1a2,2⋮an,2⋱…an,n⎦ ⎤
- 三角矩阵在内存中的压缩存储形式:
-
下三角矩阵在一维数组中存放的位置(假设下标为k,k从 0 0 0 开始): k = { i ( i − 1 ) 2 + j − 1 , i ≥ j n ( n + 1 ) 2 , i < j k=\begin{cases} \frac{i(i-1)}{2} +j-1,\quad i \ge j \\ \frac{n(n+1)}{2}, \quad i<j \end{cases} k={2i(i−1)+j−1,i≥j2n(n+1),i<j
-
上三角矩阵在一维数组中存放的位置(假设下标为k,k从 0 0 0 开始): k = { ( i − 1 ) ( 2 n − i + 2 ) 2 + ( j − i ) , i ≤ j n ( n + 1 ) 2 , i > j k=\begin{cases} \frac{(i-1)(2n-i+2)}{2} +(j-i),\quad i \le j \\ \frac{n(n+1)}{2}, \quad i>j \end{cases} k={2(i−1)(2n−i+2)+(j−i),i≤j2n(n+1),i>j
-
三对角矩阵:对角矩阵也叫带状矩阵。
- 对于 n n n 阶方阵 A A A 中的任一元素 a i , j a_{i,j} ai,j , 当 ∣ i − j ∣ > 1 |i-j|>1 ∣i−j∣>1 时,有 a i , j = 0 a_{i,j} = 0 ai,j=0 ( 1 ≤ i , j ≤ n ) (1 \le i ,j \le n ) (1≤i,j≤n) 则称为三对角矩阵。
- 三对角矩阵 A = [ a 1 , 1 a 1 , 2 0 0 0 0 a 2 , 1 a 2 , 2 a 2 , 3 0 0 0 0 a 3 , 2 a 3 , 3 a 3 , 4 0 0 ⋱ ⋱ ⋱ 0 0 0 a n − 1 , n − 2 a n − 1 , n − 1 a n − 1 , n 0 0 0 0 a n , n − 1 a n , n ] A =\left[ \begin{matrix} a_{1,1} & a_{1,2} & 0 & 0& 0&0 \\ a_{2,1} & a_{2,2} & a_{2,3} & 0& 0&0 \\ 0 & a_{3,2} & a_{3,3} & a_{3,4} & 0 &0 \\ & & \ddots & \ddots & \ddots & \\ 0 & 0 & 0 & a_{n-1,n-2} &a_{n-1,n-1} & a_{n-1,n} \\ 0 & 0 & 0 & 0 & a_{n,n-1} & a_{n,n} \end{matrix} \right] A=⎣ ⎡a1,1a2,1000a1,2a2,2a3,2000a2,3a3,3⋱0000a3,4⋱an−1,n−20000⋱an−1,n−1an,n−1000an−1,nan,n⎦ ⎤
- 三对角矩阵的压缩存储 (用一维数组存放) a 1 , 1 a 1 , 2 a 2 , 1 a 2 , 2 a 2 , 3 … a n − 1 , n a n , n − 1 a n , n \begin{array}{|c|c|c|c|c|c|c|c|c|}\hline {a_{1,1}}&{a_{1,2}}&{a_{2,1}}&{a_{2,2}}&{a_{2,3}}&{\dots}&{a_{n-1,n}}&{a_{n,n-1}}&{a_{n,n}}\\ \hline \end{array} a1,1a1,2a2,1a2,2a2,3…an−1,nan,n−1an,n
注意 : 上述的对称矩阵、三角矩阵和三对角矩阵都是方阵,即都是 n n n 行 n n n 列的矩阵。
稀疏矩阵
-
矩阵中非零元素的个数 t t t , 相对矩阵元素的个数 s s s 来说非常少,即 s > > t s>>t s>>t 的矩阵称为稀疏矩阵。
-
当稀疏矩阵阶数比较大时,矩阵中的非零元素会相对比较少。若用常规的方法存储稀疏矩阵,非常浪费存储空间,这时仅需要存储非零元素即可。
-
M = [ 1 0 0 0 0 0 2 0 0 67 0 0 0 0 6 0 ] M = \left[ \begin{matrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 2 & 0\\ 0 & 67 & 0 &0 \\ 0 & 0 & 6 & 0 \end{matrix} \right] M=⎣ ⎡10000067002060000⎦ ⎤ 对应的三元组 : i j v a l u e 0 0 1 1 2 2 2 1 67 3 2 6 \begin{array}{|c|c|c|}\hline {i}&{j}&{value}\\ \hline {0}&{0}&{1}\\ \hline {1}&{2}&{2} \\ \hline {2}&{1}&{67} \\ \hline {3}&{2}&{6} \\ \hline \end{array} i0123j0212value12676
- 因为仅需存储非零元素,需要存储非零元素在矩阵中的位置(即行和列)和非零元素的值。
-
稀疏矩阵的三元组既可以采用数组存储,也可以采用十字链表法存储。
【408真题回顾】
- 【2016年统考真题】有一个 100 100 100 阶的三对角矩阵 M M M,其元素 m i , j m_{i,j} mi,j ( 1 ≤ i , j ≤ 100 ) (1\le i ,j \le 100) (1≤i,j≤100) 按行优先依次压缩存入下标从 0 0 0 开始的一维数组 N N N 中,元素 m 30 , 30 m_{30,30} m30,30 在 N N N 中的下标是()。
A . 86 B . 87 C . 88 D . 89 A.\;86 \qquad B.\;87 \qquad C.\;88 \qquad D.\;89 A.86B.87C.88D.89
- 【2017年统考真题】适用于压缩稀疏矩阵的两种存储结构是()
A . 三元组表和十字链表 B . 三元组表和邻接矩阵 A.\;三元组表和十字链表 \qquad B.\;三元组表和邻接矩阵 \qquad A.三元组表和十字链表B.三元组表和邻接矩阵
C . 十字链表和二叉链表 D . 邻接矩阵和十字链表 C.\;十字链表和二叉链表 \qquad D.\;邻接矩阵和十字链表 C.十字链表和二叉链表D.邻接矩阵和十字链表
- 【2018年统考真题】设有一个 12 × 12 12 \times 12 12×12 的对称矩阵 M M M ,将其上三角部分的元素 m i , j m_{i,j} mi,j ( 1 ≤ i ≤ j ≤ 12 ) (1 \le i \le j \le 12) (1≤i≤j≤12) 按行优先存入C语言的一维数组 N N N 中,元素中 m 7 , 2 m_{7,2} m7,2 在 N N N 中的下标是()。
A . 50 B . 51 C . 55 D . 66 A.\;50 \qquad B.\;51 \qquad C.\;55 \qquad D.\;66 A.50B.51C.55D.66
- 【2020年统考真题】将一个 10 × 10 10 \times 10 10×10 对称矩阵 M M M 的上三角部分的元素 m 6 , 6 m_{6,6} m6,6 在 N N N 中的下标是()。
A . 15 B . 16 C . 22 D . 23 A.\;15 \qquad B.\;16 \qquad C.\;22 \qquad D.\;23 A.15B.16C.22D.23
- 【2021年统考真题】二维数组 A A A 按行优先方式存储,每个元素占用1个存储单元。若元素 A [ 0 ] [ 0 ] A[0][0] A[0][0] 的存储地址是100, A [ 3 ] [ 3 ] A[3][3] A[3][3] 的存储地址是220,则元素 A [ 5 ] [ 5 ] A[5][5] A[5][5] 的存储地址是()。
A . 295 B . 300 C . 301 D . 306 A.\;295 \qquad B.\;300 \qquad C.\;301 \qquad D.\;306 A.295B.300C.301D.306
未完待续….
参考资料 :
- 23版王道408数据结构单科书
- 王道考点精讲视频课件
answer
【参考答案】 B A A C B B\;A\;A\;C\;B BAACB