【考研】数据结构——特殊矩阵的压缩存储(含真题)

前言

本文内容源于对《数据结构(C语言版)》(第2版)、王道讲解学习所得心得、笔记整理和总结。

本文主要以举例子的方式讲解考研选择题型中的特殊矩阵的压缩存储知识点,配以图文(含408真题)。

可搭配以下链接进行学习:

【2023考研】数据结构常考应用典型例题(含真题)_住在阳光的心里的博客-CSDN博客

目录

前言

一、数组的存储结构

二、矩阵的压缩存储

(一)基本概念

(二)三对角矩阵

(三)对称矩阵和三角矩阵

三、稀疏矩阵


一、数组的存储结构

1、以一维数组 A[0...n-1] 为例, 其存储结构关系式为

LOC(a_i)= LOC(a_0)+i*L (0\leq i\leq n)

其中,L 是每个数组元素所占的存储单元。

2、对于多维数组,有两种映射方法:按行优先和按列优先。

二维数组为例,按行优先存储的基本思想是:先行后列,先存储行号较小的元素,行号相等先存储列号较小的元素。

设二维数组的行下标与列下标的范围分别为 [0,h_1] 与 [0,h_2],则存储结构关系式为:

LOC(a_{i,j})= LOC(a_{0,0})+[i*(h_2+1)+j]*L

按列优先方式存储时,得出存储结构关系式为:

LOC(a_{i,j})= LOC(a_{0,0})+[j*(h_1+1)+i]*L

举例:

二、矩阵的压缩存储

(一)基本概念

1、压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。其目的是节省存储空间

2、特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。常见的特殊矩阵有对称矩阵、上(下)三角矩阵、对角矩阵等。

3、特殊矩阵的压缩存储方法:找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的、值相同的多个矩阵元素压缩存储到一个存储空间中。

(二)三对角矩阵

1、【2016统考真题】有一个 100 阶的三对角矩阵 M,其元素 m_{i,j}(1 ≤ i, j ≤ 100)按行优先依次压缩存入标从 0 开始的一维数组中 N。元素 m_{30,30} 在 N 中的下标是(    B   )

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

解:三对角矩阵 A 如下所示:

(在三对角矩阵中,所有非零元素都集中在以主对角线为中心的 3 条对角线的区域,其他区域的元素都为零。)

采用压缩存储,将 3 条对角线上的元素,按行优先方式存放在一维数组 B 中,且 a_{1,1} 存放于 B[0]中,其存储形式如下所示:

可以计算矩阵 A 中 3 条对角线上的元素 a_{i,j}(1 ≤ i, j ≤ 100, |i - j| <= 1)在一维数组 B 中存放的下标为 k = 2i + j - 3。(下标从 0 开始

解法一:针对该题,仅需将数字逐一代入公式: k = 2 x 30 + 30 - 3 = 87,结果为87。

解法二:观察上图的三对角矩阵不难发现,第一行有两个元素,剩下的在元素 m_{30,30} 所在行之
前的 28 行(注意下标 1 ≤ i,j ≤ 100)中,每行都有 3 个元素,而 m_{30,30} 之前仅有一个元素 m_{30,29}, 不难发现元素 m_{30,30} 在数组 N 中的下标是 2 + 28x3 + 2 - 1 = 87。

(解法二中,减一是因为一维数组 B 的下标是从 0 开始。)

【注意】

解法一中的一维数组 B[k] 的下标是从 0 开始。若是从 1 开始,则公式应为 k = 2i + j - 2

反过来,求 i , j ,有表如下:(三对角矩阵 A 从 1 开始)

一维数组 B下标从 0 开始从 1 开始
i\left \lfloor\frac{k+1}{3} +1\right \rfloor\left \lfloor\frac{k+1}{3} +1\right \rfloor
jk - 2i + 3k - 2i + 2
k2i + j - 32i + j - 2

 2、将三对角矩阵 A[1..100] 按行优先存入一维数组 B[1..298] 中,A 中元素 A[66][65] 在数组B 中的位置 k 为(      B     )
A. 198                         B. 195                          C.197                                D.196 

 解:一维数组 B[k] 的下标是从 1 开始。由公式 k = 2i + j - 2,得 k = 2*66 + 65 - 2 = 195。

【另】反过来推导:已知 k 为 195 , 求 i , j:

i = \left \lfloor \frac{195+1}{3}+1 \right \rfloor=\left \lfloor 65.3+1 \right \rfloor=66

j=195-2*66 + 2 = 65

(三)对称矩阵和三角矩阵

1、若将 n 阶三角矩阵 A 按列优先级压缩存放在一维数组 B[1...n(n+1)/2+1] 中, 则存放到B[k] 中的非零元素 a_{i,j} (1 ≤ i, j ≤ n) 的下标 i, j 与 k 的对应关系是(    C   )。
A. i ( i + 1 ) / 2 + j
B. i ( i - 1 ) / 2 + j - 1
C. j ( j - 1 ) / 2 + i
D. j ( j - 1 ) / 2 + i - 1

解:按列优先存储,故元素 a_{i,j} 前面有 j - 1 列,

共有 1 + 2 + 3 + ... +j -1 = j ( j - 1 ) / 2 个元素,元素 a_{i,j} 在第 j 列上是第 i 个元素,

数组 B 的下标是从 1 开始,因此 k = j ( j - 1 ) / 2 + i。

2、若将 n 阶三角矩阵 A 按列优先顺序压缩存放在一维数组 B[1...n(n+1)/2+1] 中,则存放到 B[k] 中的非零元素 a_{i,j} (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
C. (j - 1) (2n - j + 2) / 2 + i - j
D. (j - 1) (2n - j + 1) / 2 + i - j + 1

解:按列优先存储,故元素 a_{i,j} 之前有 j - 1 列,

共有 n + (n - 1) + ... + (n - j + 2) = (j-1)(2n - j + 2) / 2 个元素,

元素 a_{i,j} 是第 j 列上第 i - j + 1 个元素,

数组 B 下标从 1 开始,k = (j - 1) (2n - j + 2) / 2 + i - j + 1。

3、【2018统考真题】设有一个 12*12 对称矩阵 M 的上三角部分的元素 m_{i,j} (1 ≤ i ≤ j ≤ 10) 按优先存入 C 语言的一维数组 N 中, 元素 m_{6,6} 在 N 中的下标是(     A     )。
A. 50                            B. 51                        C. 55                            D. 66

解: 在 C 语言中,数组 N 的下标从 0 开始

第一个元素 m_{1,1} 对应存入 n_0,矩阵 M 的第一行有 12 元素,第二行有 11 个,第三行有 10 个,第四行有 9 个,第五行有 8 个,所以 m_{6,6} 是第 12 + 11 + 10 + 9 + 8 + 1 = 51 个元素。

下标应为 50。
 

4、【2020统考真题】将一个10*10 对称矩阵 M 的上三角部分的元素 m_{i,j} (1 ≤ i ≤ j ≤ 12) 按优先存入 C 语言的一维数组 N 中, 元素 m_{7,2} 在 N 中的下标是(     C     )。
A. 15                            B. 16                        C. 22                            D. 23

解: 因为是对称矩阵,要求元素 m_{7,2} 在 N 中的下标,即求元素 m_{2,7} 在 N 中的下标。

 在 C 语言中,数组 N 的下标从 0 开始

上三角矩阵按列优先存储,先存储只有 1 个元素的第一列, 再存储有 2 个元素的第二列,以此类推。在 m_{2,7} 之前存有
第 1 列: 1

第 2 列: 2

....

第 6 列: 6

第 7 列: 1

前面共存储有 1 + 2 + 3 + 4 + 5 + 6 + 1 = 22 个元素 ( 数组下标范围为0 ~ 21 ),注意数组下标从 0 开始,故 m_{2,7} 在数组N中的下标为 22,即 m_{7,2} 在数组 N 中的下标为 22。

三、稀疏矩阵

1、【2017统考真题】适用于压缩存储稀疏矩阵的两种存储结构是(     A     )。
A. 三元组表和十字链表                         B. 三元组表和邻接矩阵
C. 十字链表和二叉链表                         D. 邻接矩阵和十字链表

解:稀疏矩阵:矩阵中非零元素的个数 t,相对矩阵元素的个数 s 来说非常少,即 s >> t 的矩阵。

(1)非零元素及其相应的行和列构成个三元组(行标,列标,值),即三元组表的结点存储了行 row、列 col、值 value 三种信息,是主要用来存储稀疏矩阵的一种数据结构。

(2)十字链表将行单链表和列单链表结合起来存储稀疏矩阵。邻接矩阵空间复杂度达 O(n^2),不适合于存储稀疏矩阵。

(3)二叉链表又名左孩子右兄弟表示法,可用于表示树或森林。

所以,A正确。

  • 11
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
西南交通大学的考研数据结构和C语言真题主要涵盖了数据结构和C语言的基本概念、常见算法和数据结构的应用,是考研复习中的重点和难点。 数据结构部分的真题主要涉及线性表、栈和队列、链表和树、图和排序等知识点。例如,可能会出现关于数组的插入、删除和查找操作以及对其时间复杂度的分析题目,还可能会要求设计和实现单链表、二叉树或图等数据结构,并进行相应的操作和应用。对于这些题目,考生需要熟悉各种数据结构的特点、使用方法和算法,能够分析算法的时间复杂度和空间复杂度,并灵活应用到实际问题中。 C语言部分的真题主要考察C语言的基本语法、指针和内存管理、函数和库等方面的知识。可能会出现关于函数的声明和定义、指针的使用、内存动态分配和释放等方面的题目。考生需要对C语言的语法、特性和常用库函数有一定的掌握,能够理解和分析C语言程序的执行过程和内存管理机制。 对于准备西南交通大学考研的考生来说,要复习数据结构和C语言,首先要掌握基础概念和常用算法和数据结构的原理和应用。其次,要多做真题和模拟题,加深对知识的理解和应用。同时,还要关注最新的考研动态和备考资料,及时调整和完善复习计划。通过系统的学习和不断的练习,相信考生一定能够顺利应对西南交通大学考研数据结构和C语言的考试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

住在阳光的心里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值