串
零个或多个字符组成的长度有限的序列
主串:包含子串的串
子串的位置:子串的第一个字符在主串的位置
空格串:由一个或者多个空格的串,不是空串
串的顺序存储结构:采用数组
定义一个结构类型:有字符数组和串的长度,在通常使用中把0号位置空出来从1开始使用
串的链式存储结构:
每个节点存储一个字符,也可以每个节点存好几个字符,叫做块
块链结构
串的模式匹配算法:确定主串中子串(模式串)第一次出现的位置
- BF算法(简单匹配算法)(穷举法思路)
从主串的每一个字符开始依次匹配子串的字符进行匹配
重要的是匹配不成功返回的操作,i=i-j+2
时间复杂度:考虑最坏情况
- KMP算法:比BF效率高
主串S的指针i不必回溯,匹配到哪里不成功就从哪里开始,且j也不必回到开头。例如下图,第一次匹配到S的a和T的c不成功,将主串的i指针移到不成功的a处,而子串的j也不必回到开头,第二次中的不成功的c前面是a和开头的a一样都是a,因此j如第三次的一样从b开始
为了确定j的位置,定义next[j]函数,表明模式中第j个字符与主串失配时,在模式中需要重新和主串该字符进行比较的字符的位置
计算next[j]的值方法:如下图,当j=1时值为0;当j=2时,没有前后缀,属于其他情况值为1;当j=3时,从头开始的前缀是a,后缀是b,不相等所以值为1;当j=4时同理为1;当j=5时,最大前缀为a,最大后缀也为a,于是k-1=1于是k=2next[j]也为2;当j=7时,最大前缀为ab,后缀为ab,于是k-1=2即next[j]为3.......用k-1来计算是因为比如说j=7时与主串匹配不成功了,j前面的ab与模式串开始的ab相同,于是j不必回溯到开头,而是只用回溯到开头ab后面的c位置即可,于是next[j]=3
next函数的改进:存在下列情况需要一直回退j,既然j=4为a且前面都是a那就不需要回退,因为b与j=4的a不匹配与前面的a也不匹配
于是用nextval来代替next
数组
二维数组定义的特殊方式:
顺序存储
因为元素个数固定,所以没有链式存储结构,也不做插入删除操作。在实际中数组在内存中时一维的,所以要将多维数组映射成一维数组的问题
稀疏矩阵:矩阵中非零元素个数较少
特殊矩阵压缩存储
对称矩阵:沿着对角线对称的元素相等
三角矩阵:对角线以上或者以上的元素(不包括对角线)全都为常数c
对角矩阵
广义表
每一个元素可以是一个原子,也可以是一个广义表,即拓宽了的线性表
通常记为LS,通常用大写表示广义表,小写表示原子
表头:广义表的第一个元素,可以是原子,也可以是线性表
表尾:除了表头外剩余元素构成的表
深度:该广义表展开后所包含括号的重数
案例分析
病毒感染检测(模式匹配)从主串中找到该病毒字符串,因为病毒为环状,所以对于baa病毒来说,baa和aab和aba都是病毒
简便的查找病毒:用两个病毒字符串的空间存储病毒字符串,即将其相连,从长度2m的字符串中抽取m个字符串进行模式匹配