复习数据结构的第七天(数组、矩阵、广义表)

这周开始进行新的一章的学习,大概预览了一下这一章不算特别重要,并且重点偏于理论性理解,算法题应该会结合后面几章的内容所以我就不提了。所以这一章主要篇幅我也以理论探讨为主。

数组

数组相信大家都不陌生了,定义上数组是相同类型的数据元素的集合,属于一种定长的线性表,除了创建和销毁其余操作不做插入和删除处理。

一维数组的概念图:

 这一部分我觉得重点就是理解存储地址的位置。

一维数组过于简单,不必多说,数组元素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)

矩阵(重点)

相信复习了线性代数之后对矩阵都不会陌生,矩阵的表示通常可以用二维数组来实现。

但是考研这一节重点就是特殊矩阵的压缩存储。顾名思义,就是有些特殊矩阵可以进行存储空间的压缩,减少内存空间的消耗。

对称矩阵

对称矩阵:满足a_{ij} = a_{ji}的就叫对称矩阵。参考王道视频讲解的存储策略图:

这里喜欢考查矩阵的下标 k。这里复习一下高中学过的等差数列求前n项和的公式:S_n = \frac{n(a_1+a_n)}{2}

只存储主对角线 + 下三角的情况

行优先存储,

列优先存储,

 只存储主对角线 + 上三角的情况与上述类似这里就不细讲了。


三角矩阵

 可以发现它和对称矩阵其实就只有一个区别,那就是多了一个存储c的位置。

这里只介绍上三角,下三角可以参考前面讲的对称矩阵

如果按行优先存储,

按列优先存储都一个道理,可以自己推导。

对角矩阵

这里笔者有个小疑问:上面的推导过程是没有包含第一行的,但是恰巧最后的式子又满足第一行元素的情况,按照数学归纳法可以得出最后的结论,但是就是不太好理解,有没有人能够出点建议?

这里还有题型会反过来,给出下标 k 求出 i 和 j 。

稀疏矩阵 

稀疏矩阵的定义:矩阵中有许多值相同的元素或零元素,而且分布没有任何规律。

在 mxn 的矩阵中,有 t 个非零元素,

\delta = \frac{t}{mn} \le 0.05

这种矩阵就叫稀疏矩阵。

稀疏矩阵的存储方法一般分为三元组表示法和十字链表法。

三元组表示法(顺序存储)

定义三个变量的线性表,分别存储元素的值、行标、列标。

 十字链表法(链式存储)

把矩阵中每一个非零元看成一个节点,该节点除了有行号、列号、值之外,还拥有两个域:

所以节点结构为:

因为还没有复习到图那里,稀疏矩阵的话我不想细讲。大家可以看看这个视频来学习怎么画十字链表:数据结构|十字链表|简单粗暴零失误画出十字链表_哔哩哔哩_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))是表尾

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值