一.认识串
串的定义:零或多个任意字符组成的有限序列
子串:串中任意个连续字符组成的子序列(含空串)称为该串的子串。
真子串:不包含自身的所有子串。可以借鉴集合的所属关系。
主串:包含子串的串相应地成为主串。
字符位置:这是很显然的定义。
子串位置:子串第一个字符在主串中的位置。
空格串:由一个或多个空格组成的串。
串相等:当且仅当两个串的长度相等和各个对应位置上的字符都相等。
二.串的模式匹配算法
算法目的:确定主串中所含子串的第一个字符出现的位置
有两种算法:
BF算法:最简单,最直观,最粗糙。
KMP算法:进阶版,解决了重复性问题。
BF算法不再赘述,这里只介绍KMP算法。https://zhuanlan.zhihu.com/p/83334559
三.特殊矩阵
特殊矩阵的压缩存储
若多个数据元素的值相同,则只分配一个元素值的存储空间,且零元素不占存储空间。
对称矩阵,对角矩阵,三角矩阵,稀疏矩阵(矩阵中非零元素的个数较少)等。
(1).对称矩阵,只存储上(下)三角的数据元素。
(2).三角矩阵只存储非零元素
(3).对角矩阵,将非零对角线上的元素按照二维数组的方式存储,坐标轴分别是第几条对角线和列数。
(4).稀疏矩阵,存各非零元的值,行列数及数组的总行列数。
对于稀疏矩阵:
三元组顺序表法:非零元按照行数 列数 值的三个来存储。
十字链表法:除了三元组的三个元素,还加上了right(存储同一行中的下一个非零元素的地址)和down(存储同一列中的下一个非零元素的地址)。
四.广义表
广义表是n个元素组成的有限序列,其中每一个ai或者是原子,或者是一个广义表,通常记作LS=(a1,a2,.......an)。
LS为表名。n为表长,习惯上,大写字母表示广义表,小写字母表示原子。
表头:若广义表非空,则第一个元素a1表示表头,记作head(LS)=a1
表尾:除表头之外的其他元素组成的表。记作tail(LS)=(a2,a3,.....,an).因此可见,表尾不是一个元素,而是一个子表
广义表的性质
广义表有相对次序
广义表的长度定义为最外层所包含元素的个数;如C=(a,(b,c))是长度为二的广义表
广义表的深度定义为该广义表展开后所含括号的重数
4.广义表可以作为其他广义表的子表
5.广义表可以是一个递归的表,递归表的深度是无穷值,长度是有限值,如F=(a,F)
五.总结
综上,可以看出,串是线性表内容受到限制时的特例。而数组和广义表都是线性表的推广,数组的每一行每一列都是线性表,广义表的元素都是原子时就是线性表。