朴素字符串匹配方法
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;
}
任意次,但嘉定不会出现在文本中。试给出一个多项式运行时间的算法,以确定这样的模式P是否出现在给定的文本T中。
解答:假设P中有m个分隔符,将P分割成P0,P1....Pm,首先在T中搜索P0,如果找到继续寻找P1然后继续下去。