数据结构问答4

1. 串和线性表的区别?

答:唯一区别就是串中每个元素是单个字符,而线性表中每个元素可以是自定义的其他类型。

2. 子串和真子串

答:子串:包含自身,n(n+1)/2+1;真子串:不包含自身

3. 空串和空白串

答:空串:长度为0的串;空白串:由一个或多个空格组成的串

4. 分析串的模式匹配算法

答:假设主串长度为n,模式串长度为m

B-F算法(又叫暴力、朴素匹配、简单):将主串中所有长度为m的子串(最多n-m+1个)依次与模式串对比,直到找到一个完全匹配的子串,或所有子串都不匹配为止。

时间复杂度最好O(m)即前面m个正好匹配,最坏,每次都是匹配到最后一个发现不匹配

 KMP算法:相较于BF主要是消除了主串指针回溯的问题。

怎么消除回溯?对于模式t的每个字符,若存在一个整数k使t中k所指的字符前的k个字符依次与t之前的k个字符相同,并与主串s中i所指的前k个字符相同,则可以利用这种信息避免回溯。

重点:next数组

next[i]含义:第i个字符匹配失败时,子串i从第next[i]位置重新开始匹配

计算:第i个字符前面的子串 最长的 前缀(除最后一个字符)和后缀(除第一个字符)匹配 的长度

例: abcabc 最后一个c对应的next=2, 前缀{'a' 'ab' 'abc' 'abca' } 后缀{‘b’ 'ab' 'cab' 'bcab'}

改进后的nextval[i]:每一趟比较都是从主串与模式串开头第一个字母相同的位置开始匹配的

nextval避免了与匹配失败字母对应的第next个字母相同时,进行无效匹配

计算:如果next[j]对应位置的字符与匹配失败j位置的字符相同

nextval [ j ]=nextval[ next [ j ] ];否则nextval [ j ] = next [ j ] 

平均时间复杂度 O(m+n)

总结:在暴力匹配中,每趟匹配失败都是模式后移一位再从头开始比较,效率较低。KMP 算法可以利用已经匹配过的信息,避免不必要的回溯。如果已匹配相等的前缀序列中有某个后缀正好是模式的前缀,那么就可以将模式向后滑动到与这些相等字符对齐的位置开始比较。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值