1.数组的定义
数组:按一定格式排列起来,有相同类型(即每个元素所占的是相同大小的存储空间)的数据元素的集合。
一维数组: 若线性表中的数据元素为非结构的简单元素,则称为一维数组。
一维数组的逻辑结构: 线性结构。定长的线性表。声明格式:数据类型 变量名称[长度];
![](https://img-blog.csdnimg.cn/img_convert/907aad2b19b6ff9bed961a4b70853d49.png)
二维数组:线性结构的拓展:声明格式:数据类型 变量名称[行数][列数];
![](https://img-blog.csdnimg.cn/img_convert/70c086a343403ec3e862c6ab6c7268ae.png)
如此拓展:
三维数组: 若二维数组中的元素是一个一维数组,则称作三维数组。
...
n 维数组: 若n-1维数组中的元素又是一个一维数组结构,则称作n维数组。
则线性表结构是数组结构的一个特例;而数组结构又是线性表结构的扩展。
数组的特点:结构固定——定义后,维数和维界(每个维的长度)都不会再改变。
2.数组的抽象数据类型定义:
![](https://img-blog.csdnimg.cn/img_convert/30689f5f41071ed3d54d584f998d97d0.png)
![](https://img-blog.csdnimg.cn/img_convert/a748c0c82a4eb88173f13335174f7e37.png)
以二维数组为例:
![](https://img-blog.csdnimg.cn/img_convert/3c4d903f4f890b920af6a93feffe11a9.png)
3.数组的顺序存储结构:
数组的特点是结构固定,一般不做插入删除操作,所以数组一般不用链式结构。
一维数组下标为i的元素的位置:
![](https://img-blog.csdnimg.cn/img_convert/85446ffc10d8be032804660a98d17e5b.png)
二维数组存储:分为行优先/列优先:行优先就是一行一行的存,存完第一行再存第二行;列优先就是一列一列的存,存完第一列再存第二列。则具体的存储方式如下:
![](https://img-blog.csdnimg.cn/img_convert/d2742e9468376f2762523d64eedadc11.png)
则此时会有一个次序约定问题,即如何确定某个元素的位置,以行优先举例:
![](https://img-blog.csdnimg.cn/img_convert/c1c5626ff55a967200171d941dc9be5e.png)
解决方法为:1.确定行优先还是列优先->2.将行、列分开去计算前面有多少个元素,即可确定位置:
![](https://img-blog.csdnimg.cn/img_convert/cb8e9fccf31ffeba94e62f2a0341bfd5.png)
例题:
![](https://img-blog.csdnimg.cn/img_convert/366608d3a91ebba7946508fdebef8297.png)
由此拓展到三维数组->n维数组:
![](https://img-blog.csdnimg.cn/img_convert/95842c7a7a039c95b24dabe10a60b9e1.png)
![](https://img-blog.csdnimg.cn/img_convert/195237651e6af7a6df83d20ef1d25c67.png)
![](https://img-blog.csdnimg.cn/img_convert/e7e218b83fa919a800d11bbedaf5d068.png)
4.特殊矩阵的压缩存储:
![](https://img-blog.csdnimg.cn/img_convert/b3429792f06d298207d8a1d0906d51a0.png)
压缩存储:若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间。
一些特殊矩阵可以压缩存储:对称矩阵、对角矩阵、三角矩阵、稀疏矩阵(矩阵中非零元素低于5%)....
对称矩阵:沿主对角线对称的元素相等:
![](https://img-blog.csdnimg.cn/img_convert/6afbc5b9605943dfcc77abb333e90a88.png)
用一维数组即可存放,确定元素位置时,依然按照行列分开去算位置,其中第i行就是等差数列1到i-1求和,第j列就是前面有j个,最后二者相加即可:
![](https://img-blog.csdnimg.cn/img_convert/6439c6c839e651c47ef76e1068779de2.png)
三角矩阵:对角线以上或以下的元素都是同一个常数(不包括对角线上的):
![](https://img-blog.csdnimg.cn/img_convert/915227a59e39b470ec6ad6f794382434.png)
对角矩阵:集中在以主对角线为中心的带状区域,如图有三条,则称为三对角矩阵:
![](https://img-blog.csdnimg.cn/img_convert/4bb9ac54287433cac469eda47745d34f.png)
用二维数组来存储:
![](https://img-blog.csdnimg.cn/img_convert/f3deb26ee6da658946152f5a6ffbf071.png)
稀疏矩阵:非零元素非常少(占比小于等于0.05),即超过95%的元素都是0。
1)用三元组来表示元素:
![](https://img-blog.csdnimg.cn/img_convert/71245edcf75283e544b2f9f20d857837.png)
压缩存储原则: 存各非零元的值、行列位置和矩阵的行列数;
三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法,例如:
![](https://img-blog.csdnimg.cn/img_convert/d60897e5b797a9fb55a0ca8620c6f0b5.png)
三元组顺序表又称有序的双下标法,优点为非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。缺点则为不能随机存取。若按行号存取某一行中的非零元,则需从头开始进行查找。
2)稀疏矩阵的链式存储结构:十字链表:链式存储即可克服三元组不能随机存取的缺点:
![](https://img-blog.csdnimg.cn/img_convert/285e08eda458fd9bfb38184ac6093a03.png)
十字链表举例:
![](https://img-blog.csdnimg.cn/img_convert/99357e4c5964c8fb71fe5f89e809568f.png)
5.广义表:
1)定义:
广义表就是线性表的推广,又称做列表 Lists,是n>=0个元素的有限序列,其中每一个 ai或者是原子,或者是一个广义表。
![](https://img-blog.csdnimg.cn/img_convert/8ea03e14fb116305d07b6fa3e787b7cc.png)
广义表通常记作:LS=(a1, a2, ..., an);
LS是表名,n为表的长度,每一个ai为表的元素,习惯用大写字母表示广义表,小写字母表示原子。
表头:广义表当中的第一个元素;
表尾:除了表头后其他所有元素构成的一个子表;
![](https://img-blog.csdnimg.cn/img_convert/795eb3f180990ab3cd8683f32a64d349.png)
举例:
![](https://img-blog.csdnimg.cn/img_convert/d48b5e1736d21f575c11609af7d53b4d.png)
其中E称为共享广义表;F称为递归/嵌套广义表。
2)广义表的性质:
(1)有相对次序,都有一个直接前趋和直接后继;
(2)广义表的长度即最外层所包含的元素个数;
(3)广义表的深度即为该广义表展开后所含的括号的重数,原子深度为0,空表深度为1;
![](https://img-blog.csdnimg.cn/img_convert/b1b5603feaefb7e6373466c26153e197.png)
(4)广义表可以和其他的广义表共享,如上图中: 广义表B就共享表 A,在B中不必列出A的值,而是通过名称来引用,B= (A);
(5)广义表可以是一个递归的表,如: F=(a, F=(a, (a,(a ...)))。注意: 递归表的深度是无穷值,长度是有限值。
(6)广义表是多层次结构,广义表的元素可以是单元素也可以是子表,而子表的元素还可以是子表,可以用图形象地表示,如图:
![](https://img-blog.csdnimg.cn/img_convert/1a944b6a013995ed14ef0cbe812d1b3a.png)
广义表和线性表的区别?:
![](https://img-blog.csdnimg.cn/img_convert/3c6485d03c39c99635fd849bd8e5c4af.png)
3)广义表的基本运算:
(1)求广义表的表头:表头可以是一个原子,也可以是一个子表;
(2)求广义表的表尾:表尾一定是一个子表!
![](https://img-blog.csdnimg.cn/img_convert/d357831a02dddaea42d96e6afd41d7f6.png)
由于每个元素可能是表可能是原子,存储空间大小是不一定相同的,所以广义表通常用链表来存储。
6.病毒检测案例的实现:
在主串中查找模式串,即模式串的匹配运算算法:
由于病毒是环状的,因此我们可以设计如图所示的2m串,再从baa开始依次后移进行m次匹配运算:
![](https://img-blog.csdnimg.cn/img_convert/ec9861f1383db038fa2f1094afe7536c.png)
![](https://img-blog.csdnimg.cn/img_convert/91458a8d221623308129f77f78797b93.png)