《考研408数据结构》第三章3(数组矩阵)复习笔记

一、一维数组寻找第i位元素的地址

  • 已知【起始地址】、【数组每个元素的空间大小:sizeof(ElemType)】,问【第i个元素】在哪个位置
  • 那不就是简单加减乘除:【起始位置】+【第 i 个元素空间地址】×【每1个占多少空间】
  • 只不过要注意数组下标索引开始是0?还是1?

二、二维数组寻找第i位元素的地址

1、按【行优先】存储

如图所示,那么公式很简单:

  • 等于:【起始位】+(【第 0 ~ i 行,这些行的所有元素】+【第 j 个元素】)× 【每个空间占多大】
  • 等于:【起始位】+(【第 i 行】×【每1行有多少个元素】+【第 j 列】)× 【每个空间占多大】
    • 注意:
      • 为什么**【** 第 0 ~ i 行的所有元素**】不是** 【第 i-1 行】×【每1行有多少个元素】
        • 因为数组一般从0开始,所以 i 相当于就是第 "n-1" 行
      • 为什么**【第 j 个元素】是** 加【第 j 列】,而不是 加【第 j 列】
        • 因为 j 也是从0开始的,而且求得起始地址是指这个元素 "头" 而不是 "尾",正如图中蓝色箭头

2、按【列优先】

反过来就行了:

  • 等于:【起始位】+(【第 0 ~ j 列,这些列的所有元素】+【第 i 个元素】)× 【每个空间占多大】
  • 等于:【起始位】+(【第 j 列】×【每1列有多少个元素】+【第 i 行】)× 【每个空间占多大】

【例题】

三、特殊矩阵 和 数组 之间关系

学过线性代数的应该知道,一个矩阵其实就是一个二维数组,型状结构是刚好可以一一对应存储的。然后有些特殊矩阵因为可以取一半的数据来推算另一半,所以可以用于压缩文件,只存一半就行了。

1、对称矩阵

特性:

  • 1、必须是【n × n】的方阵
  • 2、关于主对角线,上三角区的每个元素的标号【i>j】,下三角区的每个元素标号【i<j】
  • 3、关于主对角线,斜着对称的两个元素【aij】=【aji】
    • 所以就只用存放【下三角 + 主对角线】元素、或者只存【上三角 + 主对角线】元素,这就成功压缩了数据;然后解压的时候,根据【aij】=【aji】来推算另一半数据就行了

1)对称矩阵至少要存多少个元素?(可记公式)

记住图中的等差数列求和公式即可,也不用管下标起始0还是1,因为求得是总个数

2)矩阵元素aij ------> 对应的数组的下标位置(前提:存放按【行】优先)

若只存【下三角 + 主对角线】(【i >= j】)

注意:这里矩阵下标是从1开始,数组是从0开始

公式意思是:

  • 前【0 ~ (i-1)】行所有元素之和**+ 第 i 行的第 j 个元素**
  • 记得上面公式求得是【是数组里第几个元素空间】,如果【求下标】还得【-1】
  • 千万别背公式,只用看懂推算逻辑,考试做题时自己画图推算
    存【上三角 + 主对角线】(【i <= j】)

注意:这里矩阵下标是从1开始,数组是从0开始

公式意思是:

  • 既然 aij = aji
  • 那么让直接换成【aji】机算,此时 i<=j 情况下,又变回了【下三角】
  • 然后注意!!!!!
    • 换成下三角计算的时候,不能因为【i】和【j】颠倒了,所以****不能再用【行优先】
    • 【牢记】:【上三角按 "行" 优先】=【下三角按 "列" 优先】
    • 具体【按 "列" 优先】怎么算看下面!!!
  • 千万别背公式,只用看懂推算逻辑,考试做题时自己画图推算

3)如果按【列】优先,aij 和 数组 映射关系又怎么算?

有点抽象,先看图理解,究竟是怎么存放的

注意:这里矩阵下标是从1开始,数组是从0开始

  • 然后看【下三角每一列 有几个元素】怎么算:
    • 【这列尾元素】-【这列首元素】+【1】
  • 然后看【下三角第 j 列中,aᵢⱼ 前面有几个元素】:
    • 其实依旧是和上面一样,【这列第 i 个元素】-【这列首元素】+【1】
  • 最后结合一下,【前 j-1 列的总数】+【第 j 列 aᵢⱼ 前面有几个元素】
    • 【前 j-1 列的总数】把等差数列求和:(j-1)(2n - j + 2) / 2
    • 【第 j 列 aᵢⱼ 前面有几个元素】:i - j + 1
    • 合起来共有这么多个元素:【(j-1)(2n - j + 2) / 2】****+【i - j + 1】
    • 换成数组下标的话就-1:【(j-1)(2n - j + 2) / 2】+【i - j 】
      • 千万别背公式,只用看懂推算逻辑,考试做题时自己画图推算

【例题】

例题1:注意这个矩阵的下标也是从0开始的!!!!

例题2:上一题的变式,如果换成【按列优先】存储的话

例题3:

例题4:变条件换成【对称压缩矩阵】,存下三角(i >= j)

例题5

例题6:上题变一下条件?没那么简单的差值可以直接加减了怎么算?

例题7:上三角计算!!!!很容易错!!!!

例题8:一定要做多几次!!!!!!超级超级超级容易错!!!!!!!!!!!!!!!!!!

2、三角矩阵

特征:

  • 就是除了【上三角 + 主对角】或【下三角 + 主对角】,其他位置都是一样的数
  • 那么这些一样的数,就单独在数组最后面【开辟1个空间存】就够了

对应的【元素个数】、【映射关系】

  • 这还不简单,在上面对称矩阵的基础上:
    • 【上或下三角总数 + 尾部1个元素存其他值】
    • 映射关系也是一样的,其他一样的值的区域值存最后一位就行了。。。不多说了

【例题】

3、三对角矩阵(带状矩阵)

特征:

  • 1、标准表述就是:看下标那,若 | i - j | > 1 时,aij=0
  • 2、直观人话就是 "主对角那附近三条斜线" 非零,其他地方元素都是0
    • 那不是只用存 "主对角那附近三条斜线" 那一坨非零元素就行了吗

对应的【元素个数】、【映射关系】

【元素个数】:

  • 很简单,如图所示

【映射关系】

  • 不好用简单的话解释。。。真没招了自己看图理解吧,我也不知道为啥这么巧妙
  • 反正你就记住:
    • 【(不止1行的)前 i-1 行元素总数】+【(中间行)aij 是 第i行第几个元素】
    • 下标是在这个基础上-1
    • 【另外】!!!如果实在不理解【j - i + 2】我们也可以猜【aij 是 第i行第几个元素】
      • 我问你,下标从1开始的,A2324是【这行里:3个要存的非零数】里的【第几个】?------------>A2323是主对角元素,第23行第2个,so........
      • A999998是【这行里:3个要存的非零数】里的【第几个】?------------>A999999是主对角元素,第999行第2个,so........

【例题】

4、稀疏矩阵

特征:如图所示

稀疏矩阵的考点:【怎么存储的2种形式(很简单)】

第一种:【三元组】

  • 存3个值:【行】、【列】、【值】
  • 然后记住:他不能【随机存取】

第二种:【十字链表法】

  • 一个元素节点会连【它这一行的下一非零元素】和【它这一列下一非零元素】

【例题】

相关推荐
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
Bobolink_4 天前
TikTok矩阵账号如何批量养号?工作室级运营方案分享
矩阵·内容运营·跨境电商·tik tok·账号运营
小小工匠4 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾4 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
闪闪发亮的小星星4 天前
高斯光以及高斯光公式解释
笔记
cqbzcsq4 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
Qres8214 天前
算法复键——树状数组
数据结构·算法
阿米亚波4 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
自传.4 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding
.千余4 天前
【C++】模板进阶全解:非类型参数|全特化|偏特化|分离编译完全指南
开发语言·c++·笔记·学习·其他