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

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

主串:包含子串的串

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

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

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

 定义一个结构类型:有字符数组和串的长度,在通常使用中把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个字符串进行模式匹配

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值