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

来源:互联网 发布:江苏网络问政 编辑:程序博客网 时间:2024/05/16 07:20

朴素字符串匹配方法

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然后继续下去。