本篇文章图片均为B站王卓老师视频截图,推荐跟着王卓老师过一遍概念,老师讲的很简单详细!
一、数组
在栈和队列中我们提到了,栈和队列是特殊的线性表,它特殊在操作受限方面;在这里我们说数组和广义表是线性表的拓展,线性表是广义表的特例;
1、数组的定义
数组:按一定格式排列起来的具有相同类型的数据元素的集合。
一维数组:线性表的数据元素为非结构的简单元素,称为一维数组。
二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。
2、数组的基本操作
数组的基本操作没有插入和删除,只有取元素值和给数组元素赋值
3、数组的存储方式
我们知道存储方式有两种,一种是顺序存储,一种是链式存储,由于数组结构固定,维数不变,我们通常采用顺序存储。另外因为有多维数组存在,所以需要解决把多维关系映射到一维关系的问题
顺序存储又分为
1.以行序为主序(以下内容都以行序为主序)
2.以列序为主序
这里的L是指存储每个元素所占的存储单元,例如int类型一个存储单元为4个字节
三维数组:页/行/列的顺序,要将多维关系映射到一维中
接下来有道例题,可以巩固上面的一个思想:
A[2][2]的前面有2行,所以有(2*n个元素+2),题目说每个元素占一个空间,所以就是644+(2*n+2)=676,n=15;
A[3][3]=(3*15+3)+644=692;
4、特殊矩阵的存储方式
我们知道矩阵可能会有多个重复的元素或者多个0元素,如果我们为每一个元素都分配一个空间,那就太浪费内存了,那能不能进行一些处理从而减少内存占用呢?当然可以,我们只需要对矩阵进行压缩,能进行压缩的矩阵只有特殊矩阵,这里我们主要介绍以下4中,其中稀疏矩阵最重要
(1)对称矩阵
对称矩阵就是关于主对角线左右两边对称,如图,aij=aji的矩阵,我们只需要存储下三角或者上三角的元素即可
把下三角矩阵按照行序优先顺序存放在一维数组中,数组下标k和元素下标aij有什么关系?
k=n(n-1)/2
(2)三角矩阵
(3)对角矩阵
一个7*7的对角矩阵如图
因为对角矩阵的特征就是以主对角线为分界,所有非0元素集中在以对角线为中心的带状区域中,区域外的值全为0,我们可以采用以对角线为主序的顺序存储方法
(4)稀疏矩阵
稀疏矩阵的定义:
存储方法有两种,三元组法和十字链表法;上图中的就是三元组法,只需要行标、列标、数值三个值确定;缺点也是如此,我们找元素时需要从头开始一个个找,并不能很灵活的找到元素,所以我们采用十字链表法
这里着重需要看看十字链表法
二、广义表
1、广义表的定义
线性表中每个数据元素就是一个简单的元素,但广义表中这个数据元素可以是简单元素也可以是一个子表,这是线性表的一个拓展,有一个很好的例子可以解释这句话
接下来我们看广义表的定义和概念说明,需要认真看后续的性质和运算都围绕这些开展,但是并不难
这里需要注意:表头元素可以是一个原子或一个子表,但是表尾是指除去表头元素后的其他元素组成的表!!
2、广义表的性质
在性质方面需要记忆一下深度和长度的区别,递推表中长度是固定的,有几个元素长度就是几;深度需要看展开广义表后的括号层数啦
为了方便理解,也可以用上图的数状结构表示广义表
3、广义表的基本运算
这里主要有两个运算,GetHead(D)和GetTail(D)