图的矩阵存储之矩阵展开

本文介绍408数据结构与算法中的矩阵展开问题
矩阵展开其实是关于图的存储的一类考题,单独整理出来是因为它的考察频率较高。

矩阵展开类型题目的题干:

给出一个使用矩阵 A A A存储的数据,按行优先或者列优先的方式,放入一个下标为0的一维数组 q q q中,问矩阵中的第 i i i行第 j j j列的元素 A i j A_{ij} Aij在一维数组中的下标是什么。

通常矩阵的存储方式有:上三角矩阵,下三角矩阵,三对角矩阵

下图给出图的存储方式展示,至于为什么这么存,本文不多赘述,感兴趣的话可以去网上查找资料

图中的数据是随机写的,无需留意

计算方法

本类型的题目,我们只需要进行枚举即可,有以下的注意重点:
1.具体是分析每一行或者每一列的元素个数
2.最后一个元素在当前行或者列的位置
3.同时注意题目条件是否提示“数组下标为 0 0 0”,下标是 0 0 0答案为 [ 元素个数 − 1 ] [元素个数-1] [元素个数1],下标是 1 1 1答案为 [ 元素个数 ] [元素个数] [元素个数]
仔细分析以上特点即可解题

例题

Example

( 2018 (2018 (2018 复旦大学 复旦大学 复旦大学 960 ) 960) 960)三对角矩阵元素地址的计算:求三对角矩阵(行优先存储) A [ 1...100 , 1...100 ] A[1...100,1...100] A[1...100,1...100]中第 66 66 66行第 65 65 65列元素在一维数组B[1…258]中的位置。

题目分析
1.使用三对角矩阵存储,行优先
2.注意到题目给出矩阵的第一个元素下标是 A [ 1 , 1 ] A[1, 1] A[1,1]

解析
按照上面的步骤:
1.三对角矩阵按行优先存储,则中第一行的元素个数是2,第二行是往后都是3
2.注意到是第66行第65列,而我们知道第66行第66列一定是这一行三元组中第二个元素(可以参考上图 A [ i , j ] A[i,j] A[i,j] i i i = j j j时,必有该元素是三元组中的第二个元素)
3.注意到下标从 1 1 1开始

计算
1 1 1行有 2 2 2个元素,第 2 2 2 65 65 65行有 3 3 3个元素,第 66 66 66行是第一个元素
总的元素个数: 2 + ( 65 − 2 + 1 ) × 3 + 1 = 195 2 + (65 - 2 + 1) × 3 + 1 = 195 2+(652+1)×3+1=195 65 − 2 + 1 65 - 2 + 1 652+1 代表一共多少行三元组)
下标从 1 1 1开始 故得到答案为 195 195 195

真题

这类题比较简单,抓住上面的主要矛盾即可,直接上真题

题目1

( 2016 , 4 ) (2016, 4) (2016,4)有一个 100 100 100阶的三对角矩阵 M M M,其元素 m i , j ( 1 ⩽ i ⩽ 100 , 1 ⩽ j ⩽ 100 ) m_{i,j}(1 \leqslant i \leqslant 100,1 \leqslant j \leqslant 100) mi,j(1i1001j100)按行优先次序压缩存入下标从 0 0 0开始的一位数组 N N N中。元素 m 30 , 30 m_{30,30} m30,30 N N N中的下标是(    )

A . 86 A. 86 A.86 B . 87 B.87 B.87 C . 88 C.88 C.88 D . 89 D.89 D.89

题目分析
1.使用三对角矩阵存储,行优先
2.注意到题目给出矩阵的第一个元素下标是 M [ 1 , 1 ] M[1, 1] M[1,1]

解析
按照上面的步骤:
1.三对角矩阵按行优先存储,则中第一行的元素个数是 2 2 2,第二行是往后都是 3 3 3
2.注意到是第 30 30 30行第 30 30 30列,而我们知道第 30 30 30行第 30 30 30列一定是这一行三元组中第二个元素
3.注意到下标从 1 1 1开始

计算
1 1 1行有 2 2 2个元素,第 2 2 2 29 29 29行有 3 3 3个元素,第 30 30 30行有2个元素
总的元素个数: 2 + ( 29 − 2 + 1 ) × 3 + 2 = 88 2 + (29 - 2 + 1) × 3 + 2 = 88 2+(292+1)×3+2=88
下标从 0 0 0开始 故得到答案为 87 87 87,故选B

题目2

( 2018 , 3 ) (2018, 3) (2018,3)设有一个 12 × 12 12×12 12×12的对称矩阵 M M M,将其上三角部分的元素 m i , j ( 1 ⩽ i ⩽ j ⩽ 12 ) m_{i,j}(1 \leqslant i \leqslant j \leqslant 12) mi,j(1ij12)按行优先存入 C C C语言的以为数组 N N N中,元素 m 6 , 6 m_{6,6} m6,6 N N N中的下标是(    )

A . 50 A. 50 A.50 B . 51 B.51 B.51 C . 55 C.55 C.55 D . 66 D.66 D.66

题目分析
1.使用上三角矩阵存储,行优先
2.注意到题目给出矩阵的第一个元素下标是 M [ 1 , 1 ] M[1, 1] M[1,1]

解析
按照上面的步骤:
1.上三角矩阵按行优先存储,则中第一行的元素个数是 n n n,第二行是是 n − 1 n-1 n1
2.注意到是第 6 6 6行第 6 6 6列,而我们知道第 6 6 6行第 6 6 6列一定是这一行元素中第一个元素
3. C C C语言一维数组提示下标从 0 0 0开始

计算
1 1 1行有 12 12 12个元素,第 2 2 2行有 11 11 11个元素…第 5 5 5行有 8 8 8个元素,第 6 6 6行只有 m 6 , 6 m_{6,6} m6,6一个元素
1 1 1行至第 7 7 7行元素个数:使用求和公式 ( 8 + 12 ) × 5 / 2 = 50 (8 + 12) × 5 / 2 = 50 (8+12)×5/2=50
总的元素个数: 50 + 1 = 51 50 + 1 = 51 50+1=51
下标从 0 0 0开始 故得到答案为 50 50 50,故选A

题目3

( 2020 , 1 ) (2020, 1) (2020,1)将一个 10 × 10 10×10 10×10的对称矩阵 M M M,将其上三角部分的元素 m i , j ( 1 ⩽ i ⩽ j ⩽ 10 ) m_{i,j}(1 \leqslant i \leqslant j \leqslant 10) mi,j(1ij10)按列优先存入 C C C语言的以为数组 N N N中,元素 m 7 , 2 m_{7,2} m7,2 N N N中的下标是(    )

A . 15 A. 15 A.15 B . 16 B.16 B.16 C . 22 C.22 C.22 D . 23 D.23 D.23

题目分析
1.使用上三角矩阵存储,列优先
2.注意到题目给出矩阵的第一个元素下标是 M [ 1 , 1 ] M[1, 1] M[1,1]

解析
按照上面的步骤:
1.上三角矩阵按列优先存储,则中第一列的元素个数是 1 1 1,第二列是是 2 2 2
2.注意到是第 7 7 7行第 2 2 2列,存放在下三角矩阵中,由于是对称矩阵,相对应上三角矩阵的位置应该是第 2 2 2行第 7 7 7
3. C C C语言一维数组提示下标从 0 0 0开始

计算
1 1 1列有 1 1 1个元素,第 2 2 2列有 2 2 2个元素…第 6 6 6列有 6 6 6个元素,第 7 7 7列有 m 1 , 7 m_{1,7} m1,7 m 2 , 7 m_{2,7} m2,7两个元素
1 1 1列至第 6 6 6列元素个数:使用求和公式 ( 1 + 6 ) × 6 / 2 = 21 (1 + 6) × 6 / 2 = 21 (1+6)×6/2=21
总的元素个数: 21 + 2 = 23 21 + 2 = 23 21+2=23
下标从 0 0 0开始 故得到答案为 22 22 22,故选C

总结

这类题在考研 408 408 408数据结构中算比较简单,我们一定不能丢分。对于这类矩阵展开的题目,我们分析矩阵存储方式,分析每行或每列的元素个数,计算的总的元素个数,最后根据数据起始下标来判断该元素所在位置。除此之外我们还要注意以下的细节:
1.不论什么样的矩阵存储方式,我们先分析第 1 1 1行或列的元素个数,分析第 2 2 2 ~ n − 1 n -1 n1行或列的元素个数,最后分析最后一行的元素个数,最后进行相加即可。
2.我们需要牢记等差数列求和公式,一旦数据量太大,我们将很难枚举, S n = n ∗ a 1 + n ( n − 1 ) d / 2 S_n=n*a_1 + n ( n - 1 ) d / 2 Sn=na1+n(n1)d/2(这类题的公差一般为 1 1 1 − 1 -1 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值