本文介绍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+(65−2+1)×3+1=195 (
65
−
2
+
1
65 - 2 + 1
65−2+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(1⩽i⩽100,1⩽j⩽100)按行优先次序压缩存入下标从 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+(29−2+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(1⩽i⩽j⩽12)按行优先存入 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
n−1 …
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(1⩽i⩽j⩽10)按列优先存入 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
n−1行或列的元素个数,最后分析最后一行的元素个数,最后进行相加即可。
2.我们需要牢记等差数列求和公式,一旦数据量太大,我们将很难枚举,
S
n
=
n
∗
a
1
+
n
(
n
−
1
)
d
/
2
S_n=n*a_1 + n ( n - 1 ) d / 2
Sn=n∗a1+n(n−1)d/2(这类题的公差一般为
1
1
1或
−
1
-1
−1)