#算法导论笔记#字符串匹配

朴素字符串匹配方法

Naive-String-Matcher(T, P)

1. n = length(T)

2. m = length(P)

3. for s = 0 to n-m

4. do if P[1....m] = T[s+1....s+m]

5. then print "Pattern occurs with shift" s

算法最坏的情况下时间复杂度是O((n-m+1)*m)。这种算法的效率不高,其原因在于对于s的一个值,我们获得的关于文本的信息在考虑s的其他值完全被忽略了。这样的信息可能是非常有用的。


练习32.1-2 假设模式P中的字符都是不同的。试说明如何对一段n个字符的文本T加速过程Naive-String-Matcher的执行速度,使得其运行时间达到O(n)?

解答:如果P中的字符是完全不同的,那么在上面算法的第4行中,如果发现在第i个位置P[i]不等于T[s+i]时候,在下一个循环中我们可以从第s+i个位置开始匹配,而原来的第s+1个位置。

for(int i=0,j=0;i<n;i++)
{
  if(T[i] == P[j]) j++;
  else j=0;
  if(j == m) return true;
}


练习32.1-4 假设允许模式P中包含一个间隔字符#,该字符可以与任意的字符串匹配(甚至可以与长度为0的字符串匹配)。间隔字符可以在模式中出现
任意次,但嘉定不会出现在文本中。试给出一个多项式运行时间的算法,以确定这样的模式P是否出现在给定的文本T中。

解答:假设P中有m个分隔符,将P分割成P0,P1....Pm,首先在T中搜索P0,如果找到继续寻找P1然后继续下去。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值