KMP匹配算法中的失效函数 (ZT)

今天总算是看懂了字符串匹配算法中的KMP,记下来吧,以后查的时候方便

失效函数:设模式 P=p
0p
1….p
m-2p
m-1, 则它的失效函数定义如下:

f(j)=k |当 0<=k<j 时,且使得 p0p1….pk=p
j-kp
j-k+1…p
j 的最大数

f(j)= -1 | 其它情况。

j01234567
pabaabcac
f(j)-1-1001-10-1

详细的不记了,把算法记下来。

《KMP匹配算法中的失效函数 (ZT)》
《KMP匹配算法中的失效函数 (ZT)》
void
 String::fail
《KMP匹配算法中的失效函数 (ZT)》
{
《KMP匹配算法中的失效函数 (ZT)》    
int lengthP=curLen;
《KMP匹配算法中的失效函数 (ZT)》    f[
0]=-1;
《KMP匹配算法中的失效函数 (ZT)》《KMP匹配算法中的失效函数 (ZT)》    
for(int j=1;j<lengthP;j++)《KMP匹配算法中的失效函数 (ZT)》{
《KMP匹配算法中的失效函数 (ZT)》        
int i=f[j1];
《KMP匹配算法中的失效函数 (ZT)》        
while(*(ch+j)!=*(ch+i+1)&&i>=0) i=f[i] ;  //递推计算
《KMP匹配算法中的失效函数 (ZT)》
        if(*(ch+j)==*(ch+i+1))f[j]=i+1;  
《KMP匹配算法中的失效函数 (ZT)》        elsef[j]
=-1;
《KMP匹配算法中的失效函数 (ZT)》    }

《KMP匹配算法中的失效函数 (ZT)》}
下面是普通的匹配算法:

《KMP匹配算法中的失效函数 (ZT)》
《KMP匹配算法中的失效函数 (ZT)》
int
 String::find(String 
&
pat) 
const
《KMP匹配算法中的失效函数 (ZT)》
{
《KMP匹配算法中的失效函数 (ZT)》    
char*p=pat.ch; *s=ch; int i=0;
《KMP匹配算法中的失效函数 (ZT)》    
if(*&& *s)
《KMP匹配算法中的失效函数 (ZT)》        
while(i<=curLenpat.curLen)
《KMP匹配算法中的失效函数 (ZT)》《KMP匹配算法中的失效函数 (ZT)》            
if(*p++==*s++)《KMP匹配算法中的失效函数 (ZT)》{   // C++的精典之处
《KMP匹配算法中的失效函数 (ZT)》
                if(!*p) return i;
《KMP匹配算法中的失效函数 (ZT)》            }

《KMP匹配算法中的失效函数 (ZT)》《KMP匹配算法中的失效函数 (ZT)》            
else 《KMP匹配算法中的失效函数 (ZT)》{ i++; s=ch+i; p=pat.ch; }
《KMP匹配算法中的失效函数 (ZT)》    
return 1;
《KMP匹配算法中的失效函数 (ZT)》}
下面是 KMP 算法:

《KMP匹配算法中的失效函数 (ZT)》
《KMP匹配算法中的失效函数 (ZT)》
int
 String::fastFind(String 
&
pat) 
const
 
《KMP匹配算法中的失效函数 (ZT)》
{
《KMP匹配算法中的失效函数 (ZT)》    
int posP=0 , pasT=0 ;
《KMP匹配算法中的失效函数 (ZT)》    
int lengthP=pat.curLen, lengthT=curLen;
《KMP匹配算法中的失效函数 (ZT)》    
while(posP<lengthP && posT< lengthT)
《KMP匹配算法中的失效函数 (ZT)》《KMP匹配算法中的失效函数 (ZT)》        
if(pat.ch[pasP]==ch[posT]《KMP匹配算法中的失效函数 (ZT)》{
《KMP匹配算法中的失效函数 (ZT)》            posP
++; posT++ ;
《KMP匹配算法中的失效函数 (ZT)》        }

《KMP匹配算法中的失效函数 (ZT)》        
else if (posP==0) posT++ ;
《KMP匹配算法中的失效函数 (ZT)》        
else posP=pat.f[posP1+ 1 ;
《KMP匹配算法中的失效函数 (ZT)》    
if(posP<lengthP) return 1 ;
《KMP匹配算法中的失效函数 (ZT)》    
else return posTlengthP;
《KMP匹配算法中的失效函数 (ZT)》}

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/avalonbbs/article/details/164926
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞