这周开始进行新的一章的学习,大概预览了一下这一章不算特别重要,并且重点偏于理论性理解,算法题应该会结合后面几章的内容所以我就不提了。所以这一章主要篇幅我也以理论探讨为主。
数组
数组相信大家都不陌生了,定义上数组是相同类型的数据元素的集合,属于一种定长的线性表,除了创建和销毁其余操作不做插入和删除处理。
一维数组的概念图:
这一部分我觉得重点就是理解存储地址的位置。
一维数组过于简单,不必多说,数组元素a[i]的存储地址 = LOC + i * sizeof。(还是需要看一下初始下标的位置)
二维数组:一维数组的一维数组。(概念不必记)
二维数组的物理存储情况分为两种:行优先和列优先 。
行优先就是在逻辑上每行每行的存储,列优先就是在逻辑上每列每列的存储。
存储地址 = LOC + sizeof * 存储位置前面的元素个数
假设数组初始化为a[m][n]。
如果按行优先的顺序存储,a[i][j]前面 i 行每行都有n个元素,第 i+1 行在其前面有 j 个元素。
a[i][j]的存储地址 = LOC + sizeof * (n * i + j)
同理,按列优先存储,a[i][j]前面 j 列每列都有m个元素,第 j+1 列在其前面有 i 个元素。
a[i][j]的存储地址 = LOC + sizeof * (m * j + i)
矩阵(重点)
相信复习了线性代数之后对矩阵都不会陌生,矩阵的表示通常可以用二维数组来实现。
但是考研这一节重点就是特殊矩阵的压缩存储。顾名思义,就是有些特殊矩阵可以进行存储空间的压缩,减少内存空间的消耗。
对称矩阵
对称矩阵:满足的就叫对称矩阵。参考王道视频讲解的存储策略图:
这里喜欢考查矩阵的下标 k。这里复习一下高中学过的等差数列求前n项和的公式:
只存储主对角线 + 下三角的情况
按行优先存储,
按列优先存储,
只存储主对角线 + 上三角的情况与上述类似这里就不细讲了。
三角矩阵
可以发现它和对称矩阵其实就只有一个区别,那就是多了一个存储c的位置。
这里只介绍上三角,下三角可以参考前面讲的对称矩阵
如果按行优先存储,
按列优先存储都一个道理,可以自己推导。
对角矩阵
这里笔者有个小疑问:上面的推导过程是没有包含第一行的,但是恰巧最后的式子又满足第一行元素的情况,按照数学归纳法可以得出最后的结论,但是就是不太好理解,有没有人能够出点建议?
这里还有题型会反过来,给出下标 k 求出 i 和 j 。
稀疏矩阵
稀疏矩阵的定义:矩阵中有许多值相同的元素或零元素,而且分布没有任何规律。
在 mxn 的矩阵中,有 t 个非零元素,
这种矩阵就叫稀疏矩阵。
稀疏矩阵的存储方法一般分为三元组表示法和十字链表法。
三元组表示法(顺序存储)
定义三个变量的线性表,分别存储元素的值、行标、列标。
十字链表法(链式存储)
把矩阵中每一个非零元看成一个节点,该节点除了有行号、列号、值之外,还拥有两个域:
所以节点结构为:
因为还没有复习到图那里,稀疏矩阵的话我不想细讲。大家可以看看这个视频来学习怎么画十字链表:数据结构|十字链表|简单粗暴零失误画出十字链表_哔哩哔哩_bilibili
广义表
学过前面几章都知道线性表是相同特性元素的一个有限序列,广义表就是线性表的一种扩展结构。
在广义表中,表中的元素可以是原子(一个值,通常小写表示),例如1,2,3。
也可以是一个广义表(空表或非空表,通常大写表示)。
这时候的你是不是:
这个概念一开始学习都会让人感觉说的什么玩意?
其实吧,举一些例子就好理解了。
1)A = (),广义表A是一个空表
2)B = (d,e),广义表B包含两个元素,分别是d、e
3)C = (a,(b,c,d)),广义表C包含一个元素a和一个广义表(b,c,d)
4)D = (a, (b, (c, d), e), f),广义表D包含一个广义表(b,(c,d),e)和两个元素a、f
5)E = (a,E),广义表E是一个递归定义的广义表,它可以展开为(a,(a,(a,·····))
6)F = ((a,B),(c,d,e)),B = (b,(g)),广义表F包含一个广义表(a,B) =(a,(b,(g)))和另一个广义表(c,d,e)
这样大家对广义表的定义大概就稍微了解一点了。考试中其实通常只会考一种类型——求广义表的长度和深度,表头和表尾。
广义表的深度:表中括号的最高层数。即把最外层括号展开子表的最大括号数+1。
广义表的长度:表中最上层元素的个数。即把最外层括号展开得到的原子加上广义表个数。
1)A = (),最外层括号展开,只有空,所以深度为1,长度为0
2)B = (d,e),最外层括号展开,只有d、e,它们都是原子,原子没有括号,深度为1,长度为2
3)C = (a,(b,c,d)),最外层括号展开,有一个原子和广义表,深度最大的是广义表(b,c,d),深度为2,长度为2
4)D = (a, (b, (c, d), e), f),最外层括号展开,有两个原子和一个广义表,广义表(b,(c,d),e)有2个括号,深度为3,长度为3
5)E = (a,E),最外层括号展开,是一个原子和它本身,深度为无穷,长度为2
6)F = ((a,B),(c,d,e)),B = (b,(g)),最外层括号展开,是两个广义表,其中(a,B)的拥有3个括号,深度为4,长度为2
广义表的表头(Head):当广义表非空时 ,第一个元素就是表头
广义表的表尾(Tail):除开表头其余元素组成的表
1)A = (),空表没有表头和表尾
2)B = (d,e),第一个元素是d,d是表头,(e)是表尾
3)C = (a,(b,c,d)),第一个元素是a,a是表头,((b,c,d))是表尾
4)D = (a, (b, (c, d), e), f),第一个元素是a,a是表头,((b, (c, d), e), f)是表尾
5)E = (a,E),第一个元素是a,a是表头,(E)是表尾
6)F = ((a,B),(c,d,e)),B = (b,(g)),第一个元素是(a,B),(a,B)是表头,((c,d,e))是表尾