数据结构复习——串、数组和广义表

零个或多个字符组成的长度有限的序列

主串:包含子串的串

子串的位置:子串的第一个字符在主串的位置

空格串:由一个或者多个空格的串,不是空串

串的顺序存储结构:采用数组

 定义一个结构类型:有字符数组和串的长度,在通常使用中把0号位置空出来从1开始使用

数据结构复习——串、数组和广义表_第1张图片

串的链式存储结构:

每个节点存储一个字符,也可以每个节点存好几个字符,叫做

数据结构复习——串、数组和广义表_第2张图片

 块链结构

数据结构复习——串、数组和广义表_第3张图片

串的模式匹配算法:确定主串中子串(模式串)第一次出现的位置

  • BF算法(简单匹配算法)(穷举法思路)

从主串的每一个字符开始依次匹配子串的字符进行匹配

数据结构复习——串、数组和广义表_第4张图片

重要的是匹配不成功返回的操作,i=i-j+2

数据结构复习——串、数组和广义表_第5张图片

 时间复杂度:考虑最坏情况

数据结构复习——串、数组和广义表_第6张图片

  • KMP算法:比BF效率高

主串S的指针i不必回溯,匹配到哪里不成功就从哪里开始,且j也不必回到开头。例如下图,第一次匹配到S的a和T的c不成功,将主串的i指针移到不成功的a处,而子串的j也不必回到开头,第二次中的不成功的c前面是a和开头的a一样都是a,因此j如第三次的一样从b开始

数据结构复习——串、数组和广义表_第7张图片

 为了确定j的位置,定义next[j]函数,表明模式中第j个字符与主串失配时,在模式中需要重新和主串该字符进行比较的字符的位置

数据结构复习——串、数组和广义表_第8张图片

计算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

数据结构复习——串、数组和广义表_第9张图片

数据结构复习——串、数组和广义表_第10张图片

 next函数的改进:存在下列情况需要一直回退j,既然j=4为a且前面都是a那就不需要回退,因为b与j=4的a不匹配与前面的a也不匹配

数据结构复习——串、数组和广义表_第11张图片

 于是用nextval来代替next

数据结构复习——串、数组和广义表_第12张图片

数据结构复习——串、数组和广义表_第13张图片 

数组 

二维数组定义的特殊方式:

数据结构复习——串、数组和广义表_第14张图片

 顺序存储

因为元素个数固定,所以没有链式存储结构,也不做插入删除操作。在实际中数组在内存中时一维的,所以要将多维数组映射成一维数组的问题

稀疏矩阵:矩阵中非零元素个数较少

特殊矩阵压缩存储

对称矩阵:沿着对角线对称的元素相等

三角矩阵:对角线以上或者以上的元素(不包括对角线)全都为常数c

对角矩阵

数据结构复习——串、数组和广义表_第15张图片

广义表 

每一个元素可以是一个原子,也可以是一个广义表,即拓宽了的线性表

通常记为LS,通常用大写表示广义表,小写表示原子

表头:广义表的第一个元素,可以是原子,也可以是线性表

表尾:除了表头外剩余元素构成的表

深度:该广义表展开后所包含括号的重数

案例分析 

病毒感染检测(模式匹配)从主串中找到该病毒字符串,因为病毒为环状,所以对于baa病毒来说,baa和aab和aba都是病毒

数据结构复习——串、数组和广义表_第16张图片

简便的查找病毒:用两个病毒字符串的空间存储病毒字符串,即将其相连,从长度2m的字符串中抽取m个字符串进行模式匹配

数据结构复习——串、数组和广义表_第17张图片 

你可能感兴趣的:(数据结构)