【408考研】数据结构 ——数组与特殊矩阵

9 篇文章 1 订阅
5 篇文章 3 订阅

数组与特殊矩阵

数组

  • 定义:由 n n n相同类型的数据元素构成有限序列,每个数据元素称为一个数组元素,每个元素在 n n n 个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界
  • 数组与线性表的关系:数组是线性表的推广
    • 一维数组:可视为线性表
    • 二维数组:可视为其元素是定长线性表的线性表

位序和下标的区别:下标从0开始,位序从1开始。

数组的存储结构

  • 一个数组的所有元素在内存中占一段连续的存储空间

  • 一维数组 A [ 0 … n − 1 ] A[0 \dots n-1] A[0n1] 的存储结构关系式: 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(0i<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,1an,1a1,2a2,2an,2a1,na2,nan,n

请添加图片描述

一般矩阵是用二维数组来存储这些数据。

  • 对称矩阵:对于n阶方阵 A [ 1 … n ] [ 1 … n ] A[1 \dots n][1 \dots n] A[1n][1n]中任意一个元素 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) (1i,jn) , 则称为对称阵。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(i1)+j1,ij2j(j1)+i1,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,2a1,na2,nan,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,1an,1a2,2an,2an,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(i1)+j1,ij2n(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(i1)(2ni+2)+(ji),ij2n(n+1),i>j

  • 三对角矩阵:对角矩阵也叫带状矩阵。

    • 对于 n n n 阶方阵 A A A 中的任一元素 a i , j a_{i,j} ai,j , 当 ∣ i − j ∣ > 1 |i-j|>1 ij>1 时,有 a i , j = 0 a_{i,j} = 0 ai,j=0 ( 1 ≤ i , j ≤ n ) (1 \le i ,j \le n ) (1i,jn) 则称为三对角矩阵。
    • 三对角矩阵 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,30000a3,4an1,n20000an1,n1an,n1000an1,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,3an1,nan,n1an,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) (1i,j100) 按行优先依次压缩存入下标从 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) (1ij12) 按行优先存入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


参考答案拉至文末查看


主页 点赞 收藏 评论


未完待续….

参考资料 :

  1. 23版王道408数据结构单科书
  2. 王道考点精讲视频课件

answer

【参考答案】 B    A    A    C    B B\;A\;A\;C\;B BAACB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值